@morscherlab/mint-sdk 1.3.8 → 1.4.0-beta.1

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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-D6gVat6r.js","names":["$emit","$attrs"],"sources":["../src/composables/useToast.ts","../src/components/AppToastContainer.vue","../src/components/AppToastContainer.vue","../src/composables/controlWorkspaceOptions.ts","../src/composables/useControlWorkspace.ts","../src/components/internal/WorkspaceControlsInternal.vue","../src/components/internal/WorkspaceControlsInternal.vue","../src/components/internal/WorkspaceShellInternal.vue","../src/components/internal/WorkspaceShellInternal.vue","../src/components/internal/WorkspaceSidebarInternal.vue","../src/components/internal/WorkspaceSidebarInternal.vue","../src/components/PluginWorkspaceView.vue","../src/components/PluginWorkspaceView.vue","../src/components/Avatar.vue","../src/components/Avatar.vue","../src/generated/schema.ts","../src/components/GeneratedPluginView.vue","../src/components/GeneratedPluginView.vue","../src/components/internal/PlateEditorBindingInternal.vue","../src/components/internal/PlateEditorBindingInternal.vue","../src/components/ComponentBindingRenderer.vue","../src/components/ComponentBindingRenderer.vue","../src/components/RuntimeUpdateNotice.vue","../src/components/RuntimeUpdateNotice.vue","../src/composables/usePresence.ts","../src/utils/presenceAvatars.ts","../src/components/PresenceAvatars.vue","../src/components/PresenceAvatars.vue","../src/runtime.ts"],"sourcesContent":["import { ref } from 'vue'\nimport type { Toast, ToastOptions } from '../types'\n\nconst toasts = ref<Toast[]>([])\nlet nextId = 0\n\n/** Options of `success()`, `error()`, `warning()` and `info()`: the message is the title. */\ntype ToastMessageOptions = Omit<ToastOptions, 'title' | 'type'>\n\n/** Reactive global toast queue with success/error/warning/info variants and auto-dismiss timers. */\nexport function useToast() {\n /** Push a structured toast. `progress: 'indeterminate'` is the in-progress form and never auto-dismisses. */\n function push(options: ToastOptions): number {\n const id = nextId++\n const duration = options.duration ?? 3500\n toasts.value.push({\n id,\n type: 'success',\n ...options,\n message: options.message ?? options.title,\n duration,\n actions: options.actions?.slice(0, 2),\n })\n if (options.progress !== 'indeterminate') {\n setTimeout(() => dismiss(id), duration)\n }\n return id\n }\n\n function notify(type: Toast['type'], duration: number, message: string, options: ToastMessageOptions = {}): number {\n return push({ duration, ...options, title: message, type })\n }\n\n function success(message: string, options?: ToastMessageOptions): number {\n return notify('success', 3500, message, options)\n }\n\n function error(message: string, options?: ToastMessageOptions): number {\n return notify('error', 5000, message, options)\n }\n\n function warning(message: string, options?: ToastMessageOptions): number {\n return notify('warning', 4000, message, options)\n }\n\n function info(message: string, options?: ToastMessageOptions): number {\n return notify('info', 3500, message, options)\n }\n\n function dismiss(id: number) {\n toasts.value = toasts.value.filter(t => t.id !== id)\n }\n\n function clear() {\n toasts.value = []\n }\n\n return { toasts, push, success, error, warning, info, dismiss, clear }\n}\n","<script setup lang=\"ts\">\n/** Preferred toast container driven by useToast: title/detail, up to two actions, TTL or indeterminate bar, click-to-close. */\nimport { useToast } from '../composables/useToast'\nimport type { Toast, ToastAction } from '../types'\n\nconst { toasts, dismiss } = useToast()\n\nfunction title(toast: Toast): string {\n return toast.title ?? toast.message\n}\n\nfunction actions(toast: Toast): ToastAction[] {\n return (toast.actions ?? []).slice(0, 2)\n}\n\nfunction progress(toast: Toast): NonNullable<Toast['progress']> {\n return toast.progress ?? 'ttl'\n}\n\nfunction runAction(toast: Toast, action: ToastAction) {\n action.onClick()\n dismiss(toast.id)\n}\n</script>\n\n<template>\n <Teleport to=\"body\">\n <div class=\"mint-toast__container\">\n <TransitionGroup name=\"toast\">\n <div\n v-for=\"toast in toasts\"\n :key=\"toast.id\"\n :class=\"[\n 'mint-toast__item',\n `mint-toast__item--${toast.type}`,\n (toast.count ?? 1) > 1 ? 'mint-toast__item--stacked' : '',\n ]\"\n :role=\"toast.type === 'error' || toast.type === 'warning' ? 'alert' : 'status'\"\n @click=\"dismiss(toast.id)\"\n >\n <!-- Lucide circle-check -->\n <svg v-if=\"toast.type === 'success'\" class=\"mint-toast__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><path d=\"m9 12 2 2 4-4\" />\n </svg>\n <!-- Lucide circle-x -->\n <svg v-else-if=\"toast.type === 'error'\" class=\"mint-toast__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><path d=\"m15 9-6 6\" /><path d=\"m9 9 6 6\" />\n </svg>\n <!-- Lucide triangle-alert -->\n <svg v-else-if=\"toast.type === 'warning'\" class=\"mint-toast__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" /><path d=\"M12 9v4\" /><path d=\"M12 17h.01\" />\n </svg>\n <!-- Lucide info -->\n <svg v-else class=\"mint-toast__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><path d=\"M12 16v-4\" /><path d=\"M12 8h.01\" />\n </svg>\n\n <div class=\"mint-toast__body\">\n <div class=\"mint-toast__title\">\n <span class=\"mint-toast__message\">{{ title(toast) }}</span>\n <span v-if=\"(toast.count ?? 1) > 1\" class=\"mint-toast__count\">×{{ toast.count }}</span>\n </div>\n <div v-if=\"toast.detail\" class=\"mint-toast__detail\">{{ toast.detail }}</div>\n <div v-if=\"actions(toast).length\" class=\"mint-toast__actions\">\n <button\n v-for=\"action in actions(toast)\"\n :key=\"action.label\"\n type=\"button\"\n :class=\"['mint-toast__action', action.primary ? 'mint-toast__action--primary' : '']\"\n @click.stop=\"runAction(toast, action)\"\n >\n {{ action.label }}\n </button>\n </div>\n </div>\n\n <button\n v-if=\"toast.dismissible !== false\"\n type=\"button\"\n class=\"mint-toast__close\"\n aria-label=\"Dismiss\"\n @click.stop=\"dismiss(toast.id)\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" aria-hidden=\"true\">\n <path d=\"M18 6 6 18\" /><path d=\"m6 6 12 12\" />\n </svg>\n </button>\n\n <span\n v-if=\"progress(toast) === 'ttl'\"\n class=\"mint-toast__progress\"\n :style=\"{ animationDuration: `${toast.duration ?? 3500}ms` }\"\n />\n <span\n v-else-if=\"progress(toast) === 'indeterminate'\"\n class=\"mint-toast__progress mint-toast__progress--indeterminate\"\n />\n </div>\n </TransitionGroup>\n </div>\n </Teleport>\n</template>\n","<script setup lang=\"ts\">\n/** Preferred toast container driven by useToast: title/detail, up to two actions, TTL or indeterminate bar, click-to-close. */\nimport { useToast } from '../composables/useToast'\nimport type { Toast, ToastAction } from '../types'\n\nconst { toasts, dismiss } = useToast()\n\nfunction title(toast: Toast): string {\n return toast.title ?? toast.message\n}\n\nfunction actions(toast: Toast): ToastAction[] {\n return (toast.actions ?? []).slice(0, 2)\n}\n\nfunction progress(toast: Toast): NonNullable<Toast['progress']> {\n return toast.progress ?? 'ttl'\n}\n\nfunction runAction(toast: Toast, action: ToastAction) {\n action.onClick()\n dismiss(toast.id)\n}\n</script>\n\n<template>\n <Teleport to=\"body\">\n <div class=\"mint-toast__container\">\n <TransitionGroup name=\"toast\">\n <div\n v-for=\"toast in toasts\"\n :key=\"toast.id\"\n :class=\"[\n 'mint-toast__item',\n `mint-toast__item--${toast.type}`,\n (toast.count ?? 1) > 1 ? 'mint-toast__item--stacked' : '',\n ]\"\n :role=\"toast.type === 'error' || toast.type === 'warning' ? 'alert' : 'status'\"\n @click=\"dismiss(toast.id)\"\n >\n <!-- Lucide circle-check -->\n <svg v-if=\"toast.type === 'success'\" class=\"mint-toast__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><path d=\"m9 12 2 2 4-4\" />\n </svg>\n <!-- Lucide circle-x -->\n <svg v-else-if=\"toast.type === 'error'\" class=\"mint-toast__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><path d=\"m15 9-6 6\" /><path d=\"m9 9 6 6\" />\n </svg>\n <!-- Lucide triangle-alert -->\n <svg v-else-if=\"toast.type === 'warning'\" class=\"mint-toast__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" /><path d=\"M12 9v4\" /><path d=\"M12 17h.01\" />\n </svg>\n <!-- Lucide info -->\n <svg v-else class=\"mint-toast__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><path d=\"M12 16v-4\" /><path d=\"M12 8h.01\" />\n </svg>\n\n <div class=\"mint-toast__body\">\n <div class=\"mint-toast__title\">\n <span class=\"mint-toast__message\">{{ title(toast) }}</span>\n <span v-if=\"(toast.count ?? 1) > 1\" class=\"mint-toast__count\">×{{ toast.count }}</span>\n </div>\n <div v-if=\"toast.detail\" class=\"mint-toast__detail\">{{ toast.detail }}</div>\n <div v-if=\"actions(toast).length\" class=\"mint-toast__actions\">\n <button\n v-for=\"action in actions(toast)\"\n :key=\"action.label\"\n type=\"button\"\n :class=\"['mint-toast__action', action.primary ? 'mint-toast__action--primary' : '']\"\n @click.stop=\"runAction(toast, action)\"\n >\n {{ action.label }}\n </button>\n </div>\n </div>\n\n <button\n v-if=\"toast.dismissible !== false\"\n type=\"button\"\n class=\"mint-toast__close\"\n aria-label=\"Dismiss\"\n @click.stop=\"dismiss(toast.id)\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" aria-hidden=\"true\">\n <path d=\"M18 6 6 18\" /><path d=\"m6 6 12 12\" />\n </svg>\n </button>\n\n <span\n v-if=\"progress(toast) === 'ttl'\"\n class=\"mint-toast__progress\"\n :style=\"{ animationDuration: `${toast.duration ?? 3500}ms` }\"\n />\n <span\n v-else-if=\"progress(toast) === 'indeterminate'\"\n class=\"mint-toast__progress mint-toast__progress--indeterminate\"\n />\n </div>\n </TransitionGroup>\n </div>\n </Teleport>\n</template>\n","import type {\n ControlWorkspaceOptions,\n} from './controlSchemaTypes'\n\nexport function mergeControlWorkspaceOptions(\n base?: ControlWorkspaceOptions,\n override?: ControlWorkspaceOptions,\n): ControlWorkspaceOptions {\n return {\n ...(base ?? {}),\n ...(override ?? {}),\n initialValues: {\n ...(base?.initialValues ?? {}),\n ...(override?.initialValues ?? {}),\n },\n topBarSettings: {\n ...(base?.topBarSettings ?? {}),\n ...(override?.topBarSettings ?? {}),\n },\n }\n}\n","import {\n computed,\n reactive,\n ref,\n watch,\n} from 'vue'\nimport type {\n PillNavItem,\n TopBarSettingsConfig,\n} from '../types'\nimport {\n replaceRecord,\n} from './controlSchemaUtils'\nimport {\n mergeControlWorkspaceOptions,\n} from './controlWorkspaceOptions'\nimport {\n controlValuesToComponentBindings,\n controlValuesToComponentBindingsById,\n controlValuesToComponentProps,\n} from './controlComponentBindings'\nimport {\n isControlModelBinding,\n} from './controlSchemaModel'\nimport {\n useControlSchema,\n} from './useControlSchema'\nimport type {\n ControlComponentBinding,\n ControlComponentBindingsById,\n ControlComponentBindingsConfig,\n ControlComponentPropsByIdMap,\n ControlComponentPropsMap,\n ControlModelBinding,\n ControlSchema,\n ControlValues,\n ControlWorkspaceComponentBindings,\n ControlWorkspaceFormBinding,\n ControlWorkspaceOptions,\n ControlWorkspacePillNavBinding,\n ControlWorkspaceSidebarBinding,\n ControlWorkspaceTopBarBinding,\n ControlWorkspaceTopBarSettingsBinding,\n UseControlWorkspaceReturn,\n} from './controlSchemaTypes'\n\n/**\n * Prepare shared reactive values plus AppTopBar/AppSidebar/FormBuilder bindings from one simple controls data model.\n *\n * @example Recommended\n * ```ts\n * const workspace = useControlWorkspace(workspaceModel)\n * const { form, sidebar, topBar } = workspace.bindings\n * ```\n */\nexport function useControlWorkspace<TControls extends ControlSchema>(\n controlsOrModel: TControls | (ControlModelBinding & { controls: TControls }),\n options: ControlWorkspaceOptions = {},\n): UseControlWorkspaceReturn<TControls> {\n const model = isControlModelBinding<ControlModelBinding & { controls: TControls }>(controlsOrModel)\n ? controlsOrModel\n : undefined\n const controls: TControls = model ? model.controls : controlsOrModel as TControls\n const workspaceOptions = model\n ? mergeControlWorkspaceOptions(model.controlOptions, options)\n : options\n const { initialValues, topBarSettings, ...schemaOptions } = workspaceOptions\n const schema = useControlSchema(controls, schemaOptions)\n const activeView = ref(schema.defaultView)\n const values = reactive({\n ...schema.initialValues,\n ...(initialValues ?? {}),\n }) as ControlValues<TControls> & Record<string, unknown>\n\n function setActiveView(viewId: string) {\n syncActiveView(viewId)\n }\n\n function syncActiveView(viewId: string) {\n if (!schema.viewIds.includes(viewId)) return\n if (activeView.value !== viewId) activeView.value = viewId\n if (sidebar.activeView !== viewId) sidebar.activeView = viewId\n if (pillNav.currentItemId !== viewId) pillNav.currentItemId = viewId\n }\n\n function setValues(nextValues: Record<string, unknown>) {\n Object.assign(values, nextValues)\n }\n\n function resetValues(nextValues: Record<string, unknown> = {}) {\n replaceRecord(values, {\n ...schema.initialValues,\n ...nextValues,\n })\n }\n\n function getComponentProps(\n mapping?: ControlComponentPropsMap<ControlValues<TControls> & Record<string, unknown>>,\n ): Record<string, unknown> {\n return controlValuesToComponentProps(values, mapping)\n }\n\n function getComponentPropsById(\n mappings?: ControlComponentPropsByIdMap<ControlValues<TControls> & Record<string, unknown>>,\n ): Record<string, Record<string, unknown>> {\n if (mappings === undefined) return {}\n\n return Object.fromEntries(\n Object.entries(mappings).map(([id, mapping]) => [\n id,\n controlValuesToComponentProps(values, mapping),\n ]),\n )\n }\n\n function getComponentBindings(\n bindings?: ControlComponentBindingsConfig<ControlValues<TControls> & Record<string, unknown>>,\n ): ControlComponentBinding[] {\n return controlValuesToComponentBindings(values, bindings)\n }\n\n function getComponentBindingsById(\n bindings?: ControlComponentBindingsConfig<ControlValues<TControls> & Record<string, unknown>>,\n ): ControlComponentBindingsById {\n return controlValuesToComponentBindingsById(values, bindings)\n }\n\n const componentProps = computed(() => (\n model?.componentProps === undefined ? {} : getComponentProps(model.componentProps)\n ))\n const componentPropsById = computed(() => getComponentPropsById(model?.componentPropsById))\n const componentBindings = computed(() => getComponentBindings(model?.componentBindings))\n const componentBindingsById = computed(() => getComponentBindingsById(model?.componentBindings))\n const form = {\n ...schema.form,\n modelValue: values,\n 'onUpdate:modelValue': setValues,\n } as ControlWorkspaceFormBinding\n\n const topBarSettingsConfig: TopBarSettingsConfig = {\n ...schema.topBarSettingsConfig,\n ...(topBarSettings ?? {}),\n values,\n }\n const sidebar = reactive({\n ...schema.sidebar,\n activeView: activeView.value,\n values,\n 'onUpdate:values': setValues,\n }) as ControlWorkspaceSidebarBinding\n const pillNav = reactive({\n items: schema.viewItems,\n currentItemId: activeView.value,\n onSelect: (item: PillNavItem) => setActiveView(item.id),\n }) as ControlWorkspacePillNavBinding\n const topBarSettingsBinding = {\n spec: { settings: topBarSettingsConfig },\n onSettingsValuesChange: setValues,\n } as ControlWorkspaceTopBarSettingsBinding\n const topBarProps = computed<ControlWorkspaceTopBarBinding>(() => ({\n spec: { pills: pillNav.items, settings: topBarSettingsConfig },\n pill: pillNav.currentItemId,\n onPillSelect: pillNav.onSelect,\n onSettingsValuesChange: setValues,\n }))\n const bindings: ControlWorkspaceComponentBindings = {\n form,\n sidebar,\n topBar: topBarProps,\n topBarSettings: topBarSettingsBinding,\n pillNav,\n componentBindings,\n componentBindingsById,\n componentProps,\n componentPropsById,\n }\n\n watch(activeView, syncActiveView, { flush: 'sync' })\n watch(() => sidebar.activeView, syncActiveView, { flush: 'sync' })\n watch(() => pillNav.currentItemId, syncActiveView, { flush: 'sync' })\n\n return {\n ...schema,\n schema,\n values,\n activeView,\n topBarSettingsConfig,\n form,\n sidebar,\n topBar: topBarProps,\n pillNav,\n topBarSettings: topBarSettingsBinding,\n bindings,\n componentBindings,\n componentBindingsById,\n componentProps,\n componentPropsById,\n setActiveView,\n setValues,\n resetValues,\n getComponentProps,\n getComponentPropsById,\n getComponentBindings,\n getComponentBindingsById,\n }\n}\n","<script setup lang=\"ts\">\n/**\n * Internal: renders PluginWorkspaceView's default (main content) slot bound to the\n * control-schema-derived scoped-slot payload (active view, values, component bindings/props).\n * Not part of the public SDK surface — see PluginWorkspaceView.vue for the public component.\n */\nimport type { PluginWorkspaceControlsModel } from '../../composables/pluginWorkspaceModel'\n\ndefineProps<{\n controls: PluginWorkspaceControlsModel\n}>()\n\ndefineSlots<{\n default?: (props: PluginWorkspaceControlsModel) => unknown\n}>()\n</script>\n\n<template>\n <slot v-bind=\"controls\" />\n</template>\n","<script setup lang=\"ts\">\n/**\n * Internal: renders PluginWorkspaceView's default (main content) slot bound to the\n * control-schema-derived scoped-slot payload (active view, values, component bindings/props).\n * Not part of the public SDK surface — see PluginWorkspaceView.vue for the public component.\n */\nimport type { PluginWorkspaceControlsModel } from '../../composables/pluginWorkspaceModel'\n\ndefineProps<{\n controls: PluginWorkspaceControlsModel\n}>()\n\ndefineSlots<{\n default?: (props: PluginWorkspaceControlsModel) => unknown\n}>()\n</script>\n\n<template>\n <slot v-bind=\"controls\" />\n</template>\n","<script setup lang=\"ts\">\n/**\n * Internal: AppLayout + AppTopBar for PluginWorkspaceView, driven by a single `shell` model.\n * Owns the responsive/collapse layout props and the top bar's default rendering; the caller\n * decides whether to override the `topbar`/`sidebar` slots and supplies the sidebar content.\n * Not part of the public SDK surface — see PluginWorkspaceView.vue for the public component.\n */\nimport type {\n PillNavItem,\n PillNavOption,\n} from '../../types'\nimport AppLayout from '../AppLayout.vue'\nimport AppTopBar from '../AppTopBar.vue'\nimport type { PluginWorkspaceShellModel } from '../../composables/pluginWorkspaceModel'\n\ndefineProps<{\n shell: PluginWorkspaceShellModel\n}>()\n\nconst emit = defineEmits<{\n 'pill-select': [item: PillNavItem]\n 'pill-option-select': [option: PillNavOption, item: PillNavItem]\n 'settings-values-change': [data: Record<string, unknown>]\n}>()\n\nfunction handlePillOptionSelect(option: PillNavOption, item: PillNavItem) {\n emit('pill-option-select', option, item)\n}\n\ndefineSlots<{\n topbar?: (props: PluginWorkspaceShellModel['controls']) => unknown\n sidebar?: (props: PluginWorkspaceShellModel['controls']) => unknown\n default?: (props: PluginWorkspaceShellModel['controls']) => unknown\n icon?: (props: Record<string, unknown>) => unknown\n logo?: (props: Record<string, unknown>) => unknown\n nav?: (props: Record<string, unknown>) => unknown\n center?: (props: Record<string, unknown>) => unknown\n actions?: (props: Record<string, unknown>) => unknown\n 'settings-appearance'?: (props: Record<string, unknown>) => unknown\n}>()\n</script>\n\n<template>\n <AppLayout\n class=\"mint-plugin-workspace-view\"\n :sidebar-position=\"shell.sidebarPosition\"\n :sidebar-width=\"shell.sidebarWidth\"\n :floating=\"shell.floating\"\n :responsive-sidebar=\"shell.responsiveSidebar\"\n :sidebar-toggle-label=\"shell.sidebarToggleLabel\"\n :sidebar-close-label=\"shell.sidebarCloseLabel\"\n >\n <template #topbar>\n <slot name=\"topbar\" v-bind=\"shell.controls\">\n <AppTopBar\n v-if=\"shell.topBar\"\n :title=\"shell.title\"\n :subtitle=\"shell.subtitle\"\n :spec=\"shell.topBar\"\n :pill=\"shell.pill\"\n @pill-select=\"emit('pill-select', $event)\"\n @pill-option-select=\"handlePillOptionSelect\"\n @settings-values-change=\"emit('settings-values-change', $event)\"\n >\n <template\n v-for=\"slotName in shell.topBarSlotNames\"\n :key=\"slotName\"\n #[slotName]=\"slotProps\"\n >\n <!-- @vue-ignore dynamic SDK slot forwarding for AppTopBar passthrough slots -->\n <slot\n :name=\"slotName\"\n v-bind=\"slotProps ?? {}\"\n />\n </template>\n </AppTopBar>\n </slot>\n </template>\n\n <template v-if=\"shell.hasSidebarSurface\" #sidebar>\n <slot name=\"sidebar\" v-bind=\"shell.controls\" />\n </template>\n\n <slot v-bind=\"shell.controls\" />\n </AppLayout>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Internal: AppLayout + AppTopBar for PluginWorkspaceView, driven by a single `shell` model.\n * Owns the responsive/collapse layout props and the top bar's default rendering; the caller\n * decides whether to override the `topbar`/`sidebar` slots and supplies the sidebar content.\n * Not part of the public SDK surface — see PluginWorkspaceView.vue for the public component.\n */\nimport type {\n PillNavItem,\n PillNavOption,\n} from '../../types'\nimport AppLayout from '../AppLayout.vue'\nimport AppTopBar from '../AppTopBar.vue'\nimport type { PluginWorkspaceShellModel } from '../../composables/pluginWorkspaceModel'\n\ndefineProps<{\n shell: PluginWorkspaceShellModel\n}>()\n\nconst emit = defineEmits<{\n 'pill-select': [item: PillNavItem]\n 'pill-option-select': [option: PillNavOption, item: PillNavItem]\n 'settings-values-change': [data: Record<string, unknown>]\n}>()\n\nfunction handlePillOptionSelect(option: PillNavOption, item: PillNavItem) {\n emit('pill-option-select', option, item)\n}\n\ndefineSlots<{\n topbar?: (props: PluginWorkspaceShellModel['controls']) => unknown\n sidebar?: (props: PluginWorkspaceShellModel['controls']) => unknown\n default?: (props: PluginWorkspaceShellModel['controls']) => unknown\n icon?: (props: Record<string, unknown>) => unknown\n logo?: (props: Record<string, unknown>) => unknown\n nav?: (props: Record<string, unknown>) => unknown\n center?: (props: Record<string, unknown>) => unknown\n actions?: (props: Record<string, unknown>) => unknown\n 'settings-appearance'?: (props: Record<string, unknown>) => unknown\n}>()\n</script>\n\n<template>\n <AppLayout\n class=\"mint-plugin-workspace-view\"\n :sidebar-position=\"shell.sidebarPosition\"\n :sidebar-width=\"shell.sidebarWidth\"\n :floating=\"shell.floating\"\n :responsive-sidebar=\"shell.responsiveSidebar\"\n :sidebar-toggle-label=\"shell.sidebarToggleLabel\"\n :sidebar-close-label=\"shell.sidebarCloseLabel\"\n >\n <template #topbar>\n <slot name=\"topbar\" v-bind=\"shell.controls\">\n <AppTopBar\n v-if=\"shell.topBar\"\n :title=\"shell.title\"\n :subtitle=\"shell.subtitle\"\n :spec=\"shell.topBar\"\n :pill=\"shell.pill\"\n @pill-select=\"emit('pill-select', $event)\"\n @pill-option-select=\"handlePillOptionSelect\"\n @settings-values-change=\"emit('settings-values-change', $event)\"\n >\n <template\n v-for=\"slotName in shell.topBarSlotNames\"\n :key=\"slotName\"\n #[slotName]=\"slotProps\"\n >\n <!-- @vue-ignore dynamic SDK slot forwarding for AppTopBar passthrough slots -->\n <slot\n :name=\"slotName\"\n v-bind=\"slotProps ?? {}\"\n />\n </template>\n </AppTopBar>\n </slot>\n </template>\n\n <template v-if=\"shell.hasSidebarSurface\" #sidebar>\n <slot name=\"sidebar\" v-bind=\"shell.controls\" />\n </template>\n\n <slot v-bind=\"shell.controls\" />\n </AppLayout>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Internal: AppSidebar for PluginWorkspaceView, driven by a single `sidebar` model covering\n * chrome, panels/forms, collapse behavior, and the compact control-schema props that drive\n * AppSidebar's auto-generated form.\n * Not part of the public SDK surface — see PluginWorkspaceView.vue for the public component.\n */\nimport AppSidebar from '../AppSidebar.vue'\nimport type { PluginWorkspaceSidebarModel } from '../../composables/pluginWorkspaceModel'\n\ndefineProps<{\n sidebar: PluginWorkspaceSidebarModel\n}>()\n\ndefineEmits<{\n 'update:values': [values: Record<string, unknown>]\n 'update:collapsed': [value: boolean]\n 'update:toggle': [sectionId: string, value: boolean]\n 'section-action': [sectionId: string, actionId: string]\n 'form-submit': [sectionId: string, values: Record<string, unknown>]\n 'form-cancel': [sectionId: string]\n}>()\n\ndefineSlots<{\n header?: (props: Record<string, unknown>) => unknown\n collapsed?: (props: Record<string, unknown>) => unknown\n 'collapsed-footer'?: (props: Record<string, unknown>) => unknown\n footer?: (props: Record<string, unknown>) => unknown\n}>()\n</script>\n\n<template>\n <AppSidebar\n :spec=\"sidebar.spec\"\n :active-view=\"sidebar.activeView\"\n :values=\"sidebar.values\"\n :collapsed=\"sidebar.collapsed\"\n :form-loading=\"sidebar.formLoading\"\n :form-disabled=\"sidebar.formDisabled\"\n :form-readonly=\"sidebar.formReadonly\"\n @update:values=\"$emit('update:values', $event)\"\n @update:collapsed=\"$emit('update:collapsed', $event)\"\n @update:toggle=\"(sectionId, value) => $emit('update:toggle', sectionId, value)\"\n @section-action=\"(sectionId, actionId) => $emit('section-action', sectionId, actionId)\"\n @form-submit=\"(sectionId, values) => $emit('form-submit', sectionId, values)\"\n @form-cancel=\"$emit('form-cancel', $event)\"\n >\n <template\n v-for=\"slotName in sidebar.slotNames\"\n :key=\"slotName\"\n #[slotName]=\"slotProps\"\n >\n <!-- @vue-ignore dynamic SDK slot forwarding for AppSidebar section-* passthrough slots -->\n <slot\n :name=\"slotName\"\n v-bind=\"slotProps ?? {}\"\n />\n </template>\n </AppSidebar>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Internal: AppSidebar for PluginWorkspaceView, driven by a single `sidebar` model covering\n * chrome, panels/forms, collapse behavior, and the compact control-schema props that drive\n * AppSidebar's auto-generated form.\n * Not part of the public SDK surface — see PluginWorkspaceView.vue for the public component.\n */\nimport AppSidebar from '../AppSidebar.vue'\nimport type { PluginWorkspaceSidebarModel } from '../../composables/pluginWorkspaceModel'\n\ndefineProps<{\n sidebar: PluginWorkspaceSidebarModel\n}>()\n\ndefineEmits<{\n 'update:values': [values: Record<string, unknown>]\n 'update:collapsed': [value: boolean]\n 'update:toggle': [sectionId: string, value: boolean]\n 'section-action': [sectionId: string, actionId: string]\n 'form-submit': [sectionId: string, values: Record<string, unknown>]\n 'form-cancel': [sectionId: string]\n}>()\n\ndefineSlots<{\n header?: (props: Record<string, unknown>) => unknown\n collapsed?: (props: Record<string, unknown>) => unknown\n 'collapsed-footer'?: (props: Record<string, unknown>) => unknown\n footer?: (props: Record<string, unknown>) => unknown\n}>()\n</script>\n\n<template>\n <AppSidebar\n :spec=\"sidebar.spec\"\n :active-view=\"sidebar.activeView\"\n :values=\"sidebar.values\"\n :collapsed=\"sidebar.collapsed\"\n :form-loading=\"sidebar.formLoading\"\n :form-disabled=\"sidebar.formDisabled\"\n :form-readonly=\"sidebar.formReadonly\"\n @update:values=\"$emit('update:values', $event)\"\n @update:collapsed=\"$emit('update:collapsed', $event)\"\n @update:toggle=\"(sectionId, value) => $emit('update:toggle', sectionId, value)\"\n @section-action=\"(sectionId, actionId) => $emit('section-action', sectionId, actionId)\"\n @form-submit=\"(sectionId, values) => $emit('form-submit', sectionId, values)\"\n @form-cancel=\"$emit('form-cancel', $event)\"\n >\n <template\n v-for=\"slotName in sidebar.slotNames\"\n :key=\"slotName\"\n #[slotName]=\"slotProps\"\n >\n <!-- @vue-ignore dynamic SDK slot forwarding for AppSidebar section-* passthrough slots -->\n <slot\n :name=\"slotName\"\n v-bind=\"slotProps ?? {}\"\n />\n </template>\n </AppSidebar>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Standard plugin workspace shell that combines AppLayout, AppTopBar, and AppSidebar with LEAF-style defaults.\n *\n * The structure is one `:spec` built with `definePluginWorkspaceView()`: title,\n * top bar, sidebar (a `defineControlModel()` result generates its sections),\n * the experiment chip and its save action. The active pill, view, sidebar\n * values and collapse state are `v-model`s. It renders the toast container\n * unless `spec.toasts` is false.\n *\n * @example Recommended\n * ```vue\n * <PluginWorkspaceView :spec=\"workspace\" v-model:pill=\"tab\">\n * <router-view />\n * </PluginWorkspaceView>\n * ```\n */\nimport { computed, toValue, useSlots } from 'vue'\nimport type {\n PillNavItem,\n PillNavOption,\n} from '../types'\nimport { useAppExperiment } from '../composables/useAppExperiment'\nimport { usePluginWorkspace } from '../composables/usePluginWorkspace'\nimport AppToastContainer from './AppToastContainer.vue'\nimport WorkspaceControlsInternal from './internal/WorkspaceControlsInternal.vue'\nimport WorkspaceShellInternal from './internal/WorkspaceShellInternal.vue'\nimport WorkspaceSidebarInternal from './internal/WorkspaceSidebarInternal.vue'\nimport type {\n PluginWorkspaceForwardedSlotProps,\n PluginWorkspaceSlotProps,\n PluginWorkspaceViewEmits,\n PluginWorkspaceViewProps,\n} from './PluginWorkspaceView.props'\n\nconst props = withDefaults(defineProps<PluginWorkspaceViewProps>(), {\n spec: () => ({}),\n pill: undefined,\n view: undefined,\n values: undefined,\n sidebarCollapsed: undefined,\n formLoading: false,\n formDisabled: false,\n formReadonly: false,\n})\n\nconst emit = defineEmits<PluginWorkspaceViewEmits>()\n\ndefineSlots<{\n default?: (props: PluginWorkspaceSlotProps) => unknown\n topbar?: (props: PluginWorkspaceSlotProps) => unknown\n sidebar?: (props: PluginWorkspaceSlotProps) => unknown\n icon?: (props: PluginWorkspaceForwardedSlotProps) => unknown\n logo?: (props: PluginWorkspaceForwardedSlotProps) => unknown\n nav?: (props: PluginWorkspaceForwardedSlotProps) => unknown\n center?: (props: PluginWorkspaceForwardedSlotProps) => unknown\n actions?: (props: PluginWorkspaceForwardedSlotProps) => unknown\n 'settings-appearance'?: (props: PluginWorkspaceForwardedSlotProps) => unknown\n header?: (props: PluginWorkspaceForwardedSlotProps) => unknown\n collapsed?: (props: PluginWorkspaceForwardedSlotProps) => unknown\n 'collapsed-footer'?: (props: PluginWorkspaceForwardedSlotProps) => unknown\n footer?: (props: PluginWorkspaceForwardedSlotProps) => unknown\n}>()\n\nconst slots = useSlots()\n\n// The experiment chip is setup-time structure, like the rest of the spec.\nif (props.spec.experiment) {\n const save = props.spec.save\n useAppExperiment({\n onSelect: experiment => emit('experiment-select', experiment),\n onSave: save ? async () => (await save.handler()) ?? null : undefined,\n onDetach: () => emit('experiment-detach'),\n saveDisabled: computed(() => toValue(save?.disabled) ?? false),\n saveDisabledMessage: computed(() => toValue(save?.reason)),\n })\n}\n\nconst {\n shell,\n sidebar,\n controls,\n handleControlValuesUpdate,\n handlePillSelect,\n} = usePluginWorkspace({\n props,\n slots,\n emit,\n})\n\nfunction handleToggle(sectionId: string, value: boolean) {\n emit('update:toggle', sectionId, value)\n}\n\nfunction handleFormSubmit(sectionId: string, values: Record<string, unknown>) {\n emit('form-submit', sectionId, values)\n}\n\nfunction handleFormCancel(sectionId: string) {\n emit('form-cancel', sectionId)\n}\n\n</script>\n\n<template>\n <WorkspaceShellInternal\n :shell=\"shell\"\n @pill-select=\"handlePillSelect\"\n @pill-option-select=\"(option: PillNavOption, item: PillNavItem) => emit('pill-option-select', option, item)\"\n @settings-values-change=\"emit('settings-values-change', $event)\"\n >\n <template v-if=\"slots.topbar\" #topbar=\"scope\">\n <slot name=\"topbar\" v-bind=\"scope\" />\n </template>\n\n <template\n v-for=\"slotName in shell.topBarSlotNames\"\n :key=\"slotName\"\n #[slotName]=\"slotProps\"\n >\n <!-- @vue-ignore dynamic SDK slot forwarding for AppTopBar passthrough slots -->\n <slot\n :name=\"slotName\"\n v-bind=\"slotProps ?? {}\"\n />\n </template>\n\n <template v-if=\"shell.hasSidebarSurface\" #sidebar=\"scope\">\n <slot name=\"sidebar\" v-bind=\"scope\">\n <WorkspaceSidebarInternal\n :sidebar=\"sidebar\"\n @update:values=\"handleControlValuesUpdate\"\n @update:collapsed=\"emit('update:sidebarCollapsed', $event)\"\n @update:toggle=\"handleToggle\"\n @section-action=\"(sectionId: string, actionId: string) => emit('section-action', sectionId, actionId)\"\n @form-submit=\"handleFormSubmit\"\n @form-cancel=\"handleFormCancel\"\n >\n <template\n v-for=\"slotName in sidebar.slotNames\"\n :key=\"slotName\"\n #[slotName]=\"slotProps\"\n >\n <!-- @vue-ignore dynamic SDK slot forwarding for AppSidebar section-* passthrough slots -->\n <slot\n :name=\"slotName\"\n v-bind=\"slotProps ?? {}\"\n />\n </template>\n </WorkspaceSidebarInternal>\n </slot>\n </template>\n\n <template #default>\n <WorkspaceControlsInternal :controls=\"controls\">\n <template #default=\"controlsScope\">\n <slot v-bind=\"controlsScope\" />\n </template>\n </WorkspaceControlsInternal>\n <AppToastContainer v-if=\"spec.toasts !== false\" />\n </template>\n </WorkspaceShellInternal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Standard plugin workspace shell that combines AppLayout, AppTopBar, and AppSidebar with LEAF-style defaults.\n *\n * The structure is one `:spec` built with `definePluginWorkspaceView()`: title,\n * top bar, sidebar (a `defineControlModel()` result generates its sections),\n * the experiment chip and its save action. The active pill, view, sidebar\n * values and collapse state are `v-model`s. It renders the toast container\n * unless `spec.toasts` is false.\n *\n * @example Recommended\n * ```vue\n * <PluginWorkspaceView :spec=\"workspace\" v-model:pill=\"tab\">\n * <router-view />\n * </PluginWorkspaceView>\n * ```\n */\nimport { computed, toValue, useSlots } from 'vue'\nimport type {\n PillNavItem,\n PillNavOption,\n} from '../types'\nimport { useAppExperiment } from '../composables/useAppExperiment'\nimport { usePluginWorkspace } from '../composables/usePluginWorkspace'\nimport AppToastContainer from './AppToastContainer.vue'\nimport WorkspaceControlsInternal from './internal/WorkspaceControlsInternal.vue'\nimport WorkspaceShellInternal from './internal/WorkspaceShellInternal.vue'\nimport WorkspaceSidebarInternal from './internal/WorkspaceSidebarInternal.vue'\nimport type {\n PluginWorkspaceForwardedSlotProps,\n PluginWorkspaceSlotProps,\n PluginWorkspaceViewEmits,\n PluginWorkspaceViewProps,\n} from './PluginWorkspaceView.props'\n\nconst props = withDefaults(defineProps<PluginWorkspaceViewProps>(), {\n spec: () => ({}),\n pill: undefined,\n view: undefined,\n values: undefined,\n sidebarCollapsed: undefined,\n formLoading: false,\n formDisabled: false,\n formReadonly: false,\n})\n\nconst emit = defineEmits<PluginWorkspaceViewEmits>()\n\ndefineSlots<{\n default?: (props: PluginWorkspaceSlotProps) => unknown\n topbar?: (props: PluginWorkspaceSlotProps) => unknown\n sidebar?: (props: PluginWorkspaceSlotProps) => unknown\n icon?: (props: PluginWorkspaceForwardedSlotProps) => unknown\n logo?: (props: PluginWorkspaceForwardedSlotProps) => unknown\n nav?: (props: PluginWorkspaceForwardedSlotProps) => unknown\n center?: (props: PluginWorkspaceForwardedSlotProps) => unknown\n actions?: (props: PluginWorkspaceForwardedSlotProps) => unknown\n 'settings-appearance'?: (props: PluginWorkspaceForwardedSlotProps) => unknown\n header?: (props: PluginWorkspaceForwardedSlotProps) => unknown\n collapsed?: (props: PluginWorkspaceForwardedSlotProps) => unknown\n 'collapsed-footer'?: (props: PluginWorkspaceForwardedSlotProps) => unknown\n footer?: (props: PluginWorkspaceForwardedSlotProps) => unknown\n}>()\n\nconst slots = useSlots()\n\n// The experiment chip is setup-time structure, like the rest of the spec.\nif (props.spec.experiment) {\n const save = props.spec.save\n useAppExperiment({\n onSelect: experiment => emit('experiment-select', experiment),\n onSave: save ? async () => (await save.handler()) ?? null : undefined,\n onDetach: () => emit('experiment-detach'),\n saveDisabled: computed(() => toValue(save?.disabled) ?? false),\n saveDisabledMessage: computed(() => toValue(save?.reason)),\n })\n}\n\nconst {\n shell,\n sidebar,\n controls,\n handleControlValuesUpdate,\n handlePillSelect,\n} = usePluginWorkspace({\n props,\n slots,\n emit,\n})\n\nfunction handleToggle(sectionId: string, value: boolean) {\n emit('update:toggle', sectionId, value)\n}\n\nfunction handleFormSubmit(sectionId: string, values: Record<string, unknown>) {\n emit('form-submit', sectionId, values)\n}\n\nfunction handleFormCancel(sectionId: string) {\n emit('form-cancel', sectionId)\n}\n\n</script>\n\n<template>\n <WorkspaceShellInternal\n :shell=\"shell\"\n @pill-select=\"handlePillSelect\"\n @pill-option-select=\"(option: PillNavOption, item: PillNavItem) => emit('pill-option-select', option, item)\"\n @settings-values-change=\"emit('settings-values-change', $event)\"\n >\n <template v-if=\"slots.topbar\" #topbar=\"scope\">\n <slot name=\"topbar\" v-bind=\"scope\" />\n </template>\n\n <template\n v-for=\"slotName in shell.topBarSlotNames\"\n :key=\"slotName\"\n #[slotName]=\"slotProps\"\n >\n <!-- @vue-ignore dynamic SDK slot forwarding for AppTopBar passthrough slots -->\n <slot\n :name=\"slotName\"\n v-bind=\"slotProps ?? {}\"\n />\n </template>\n\n <template v-if=\"shell.hasSidebarSurface\" #sidebar=\"scope\">\n <slot name=\"sidebar\" v-bind=\"scope\">\n <WorkspaceSidebarInternal\n :sidebar=\"sidebar\"\n @update:values=\"handleControlValuesUpdate\"\n @update:collapsed=\"emit('update:sidebarCollapsed', $event)\"\n @update:toggle=\"handleToggle\"\n @section-action=\"(sectionId: string, actionId: string) => emit('section-action', sectionId, actionId)\"\n @form-submit=\"handleFormSubmit\"\n @form-cancel=\"handleFormCancel\"\n >\n <template\n v-for=\"slotName in sidebar.slotNames\"\n :key=\"slotName\"\n #[slotName]=\"slotProps\"\n >\n <!-- @vue-ignore dynamic SDK slot forwarding for AppSidebar section-* passthrough slots -->\n <slot\n :name=\"slotName\"\n v-bind=\"slotProps ?? {}\"\n />\n </template>\n </WorkspaceSidebarInternal>\n </slot>\n </template>\n\n <template #default>\n <WorkspaceControlsInternal :controls=\"controls\">\n <template #default=\"controlsScope\">\n <slot v-bind=\"controlsScope\" />\n </template>\n </WorkspaceControlsInternal>\n <AppToastContainer v-if=\"spec.toasts !== false\" />\n </template>\n </WorkspaceShellInternal>\n</template>\n","<script setup lang=\"ts\">\n/** Displays a user avatar as an image, a single derived initial, or a fallback icon, with a deterministic background color and optional status dot. */\nimport { computed } from 'vue'\n\ninterface Props {\n name?: string\n initials?: string\n src?: string\n alt?: string\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: string\n status?: 'online' | 'away' | 'busy' | 'offline'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n alt: '',\n size: 'md',\n})\n\nconst PALETTE = ['#3B82F6', '#8B5CF6', '#EC4899', '#F97316', '#10B981', '#F59E0B', '#06B6D4', '#6366F1']\n\n// Default: first letter of `name`, uppercased. Consumers wanting two letters\n// (e.g. role badges like \"PI\", \"QC\") pass `:initials=\"'XX'\"` explicitly.\nconst computedInitials = computed(() =>\n props.initials || props.name?.charAt(0).toUpperCase() || ''\n)\n\nconst backgroundColor = computed(() => {\n if (props.color) return props.color\n if (!props.name) return undefined\n\n let hash = 0\n for (let i = 0; i < props.name.length; i++) {\n hash = props.name.charCodeAt(i) + ((hash << 5) - hash)\n }\n return PALETTE[Math.abs(hash) % PALETTE.length]\n})\n</script>\n\n<template>\n <span\n :class=\"['mint-avatar', `mint-avatar--${size}`]\"\n role=\"img\"\n :aria-label=\"alt || name || 'User avatar'\"\n >\n <span\n class=\"mint-avatar__face\"\n :style=\"backgroundColor ? { backgroundColor } : undefined\"\n >\n <img\n v-if=\"src\"\n :src=\"src\"\n :alt=\"alt || name || ''\"\n class=\"mint-avatar__image\"\n >\n <span v-else-if=\"computedInitials\" class=\"mint-avatar__initials\">\n {{ computedInitials }}\n </span>\n <svg\n v-else\n class=\"mint-avatar__fallback\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\" />\n </svg>\n </span>\n <span\n v-if=\"status\"\n :class=\"['mint-avatar__status', `mint-avatar__status--${status}`]\"\n aria-hidden=\"true\"\n />\n </span>\n</template>\n","<script setup lang=\"ts\">\n/** Displays a user avatar as an image, a single derived initial, or a fallback icon, with a deterministic background color and optional status dot. */\nimport { computed } from 'vue'\n\ninterface Props {\n name?: string\n initials?: string\n src?: string\n alt?: string\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: string\n status?: 'online' | 'away' | 'busy' | 'offline'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n alt: '',\n size: 'md',\n})\n\nconst PALETTE = ['#3B82F6', '#8B5CF6', '#EC4899', '#F97316', '#10B981', '#F59E0B', '#06B6D4', '#6366F1']\n\n// Default: first letter of `name`, uppercased. Consumers wanting two letters\n// (e.g. role badges like \"PI\", \"QC\") pass `:initials=\"'XX'\"` explicitly.\nconst computedInitials = computed(() =>\n props.initials || props.name?.charAt(0).toUpperCase() || ''\n)\n\nconst backgroundColor = computed(() => {\n if (props.color) return props.color\n if (!props.name) return undefined\n\n let hash = 0\n for (let i = 0; i < props.name.length; i++) {\n hash = props.name.charCodeAt(i) + ((hash << 5) - hash)\n }\n return PALETTE[Math.abs(hash) % PALETTE.length]\n})\n</script>\n\n<template>\n <span\n :class=\"['mint-avatar', `mint-avatar--${size}`]\"\n role=\"img\"\n :aria-label=\"alt || name || 'User avatar'\"\n >\n <span\n class=\"mint-avatar__face\"\n :style=\"backgroundColor ? { backgroundColor } : undefined\"\n >\n <img\n v-if=\"src\"\n :src=\"src\"\n :alt=\"alt || name || ''\"\n class=\"mint-avatar__image\"\n >\n <span v-else-if=\"computedInitials\" class=\"mint-avatar__initials\">\n {{ computedInitials }}\n </span>\n <svg\n v-else\n class=\"mint-avatar__fallback\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\" />\n </svg>\n </span>\n <span\n v-if=\"status\"\n :class=\"['mint-avatar__status', `mint-avatar__status--${status}`]\"\n aria-hidden=\"true\"\n />\n </span>\n</template>\n","import type {\n FormFieldSchema,\n FormFieldType,\n FormSchema,\n} from '../types/form-builder'\nimport type {\n GeneratedJsonSchema,\n GeneratedJobDefinition,\n} from '../types/generated-ui'\n\ntype GeneratedReference = 'path'\n\ninterface ResolvedGeneratedField {\n schema: GeneratedJsonSchema\n reference?: GeneratedReference\n hasDefault: boolean\n defaultValue?: unknown\n}\n\nexport function generatedJobFormSchema(definition: GeneratedJobDefinition): FormSchema & { sections: NonNullable<FormSchema['sections']> } {\n const root = definition.input_schema\n const required = new Set(root.required ?? [])\n const fields = Object.entries(root.properties ?? {}).map(([name, schema]) =>\n toFormField(name, resolveGeneratedField(root, schema), required.has(name)),\n )\n return {\n sections: [{\n id: definition.id,\n title: definition.title,\n description: definition.description || undefined,\n columns: 1,\n fields,\n }],\n actions: true,\n submitLabel: 'Run analysis',\n }\n}\n\nexport function generatedJobDefaults(definition: GeneratedJobDefinition): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(definition.input_schema.properties ?? {})\n .map(([name, schema]) => [name, resolveGeneratedField(definition.input_schema, schema)] as const)\n .filter(([, field]) => field.hasDefault)\n .map(([name, field]) => [name, structuredClone(field.defaultValue)]),\n )\n}\n\nexport function normalizeGeneratedJobInput(\n definition: GeneratedJobDefinition,\n values: Record<string, unknown>,\n): Record<string, unknown> {\n const normalized: Record<string, unknown> = {}\n for (const [name, value] of Object.entries(values)) {\n const field = definition.input_schema.properties?.[name]\n if (!field) continue\n const { schema, reference } = resolveGeneratedField(definition.input_schema, field)\n if (reference !== 'path' && Array.isArray(value) && ['integer', 'number'].includes(String(schema.items?.type))) {\n normalized[name] = value.map(item => {\n const numeric = typeof item === 'string' && item.trim() !== '' ? Number(item) : item\n return typeof numeric === 'number' && Number.isFinite(numeric) ? numeric : item\n })\n } else if (reference !== 'path' && Array.isArray(value) && schema.items?.type === 'boolean') {\n normalized[name] = value.map(item => item === 'true' ? true : item === 'false' ? false : item)\n } else {\n normalized[name] = value === undefined && allowsNull(schema) ? null : value\n }\n }\n return normalized\n}\n\nfunction toFormField(\n name: string,\n resolved: ResolvedGeneratedField,\n required: boolean,\n): FormFieldSchema {\n const { schema, reference } = resolved\n const validation: NonNullable<FormFieldSchema['validation']> = {}\n const allowsEmpty = schema.type === 'array' || (\n schema.type === 'string' && reference !== 'path'\n && !(schema.minLength && schema.minLength > 0)\n && (!schema.enum || schema.enum.includes(''))\n )\n if (required && !allowsNull(schema) && !allowsEmpty) validation.required = true\n if (schema.minimum !== undefined) validation.min = schema.minimum\n if (schema.maximum !== undefined) validation.max = schema.maximum\n if (schema.minLength !== undefined) validation.minLength = schema.minLength\n if (schema.maxLength !== undefined) validation.maxLength = schema.maxLength\n\n const props: Record<string, unknown> = {}\n if (schema.enum) props.options = [...schema.enum]\n if (schema.type === 'integer') {\n if (schema.exclusiveMinimum !== undefined) validation.min = Math.max(Number(validation.min ?? -Infinity), Math.floor(schema.exclusiveMinimum) + 1)\n if (schema.exclusiveMaximum !== undefined) validation.max = Math.min(Number(validation.max ?? Infinity), Math.ceil(schema.exclusiveMaximum) - 1)\n if (validation.min !== undefined) validation.min = Math.ceil(Number(validation.min))\n if (validation.max !== undefined) validation.max = Math.floor(Number(validation.max))\n if (schema.multipleOf && Number.isInteger(schema.multipleOf)) {\n if (validation.min !== undefined) validation.min = Math.ceil(Number(validation.min) / schema.multipleOf) * schema.multipleOf\n if (validation.max !== undefined) validation.max = Math.floor(Number(validation.max) / schema.multipleOf) * schema.multipleOf\n }\n props.step = 1\n }\n if (schema.type === 'integer' || schema.type === 'number') {\n if (validation.min !== undefined) props.min = validation.min\n if (validation.max !== undefined) props.max = validation.max\n if (schema.multipleOf !== undefined) props.step = schema.multipleOf\n }\n if (schema.type === 'array' && reference !== 'path') {\n if (schema.items?.enum) props.options = [...schema.items.enum]\n else props.allowDuplicates = true\n }\n if (reference === 'path' && schema.type === 'array') props.multiple = true\n return {\n name,\n label: schema.title || humanize(name),\n type: fieldType(schema, reference),\n defaultValue: resolved.hasDefault ? structuredClone(resolved.defaultValue) : undefined,\n disabled: Object.prototype.hasOwnProperty.call(schema, 'const') || undefined,\n hint: schema.description,\n validation,\n props,\n itemType: schema.items?.type === 'number' || schema.items?.type === 'integer' ? 'number' : undefined,\n }\n}\n\nfunction resolveGeneratedField(\n root: GeneratedJsonSchema,\n field: GeneratedJsonSchema,\n): ResolvedGeneratedField {\n const candidate = field.anyOf?.find(item => item.type !== 'null')\n ?? field.allOf?.[0]\n ?? field\n let schema = { ...candidate, ...field }\n if (candidate.$ref) {\n const referenceParts = candidate.$ref.split('/')\n const key = referenceParts[referenceParts.length - 1]\n const referenced = key ? root.$defs?.[key] : undefined\n if (!referenced) throw new Error(`Generated field reference is missing: ${candidate.$ref}`)\n schema = { ...referenced, ...candidate, ...field }\n }\n if (schema.items) schema.items = resolveGeneratedField(root, schema.items).schema\n const constant = Object.prototype.hasOwnProperty.call(schema, 'const')\n return {\n schema,\n reference: schema['x-mint-component'],\n hasDefault: constant || hasOwnDefault(field) || allowsNull(schema),\n defaultValue: constant ? schema.const : hasOwnDefault(field) ? field.default : null,\n }\n}\n\nfunction fieldType(schema: GeneratedJsonSchema, reference?: GeneratedReference): FormFieldType {\n if (reference === 'path') return 'path'\n if (schema.enum) return 'select'\n const type = Array.isArray(schema.type) ? schema.type.find(value => value !== 'null') : schema.type\n if (type === 'boolean') return 'toggle'\n if (type === 'number' || type === 'integer') return 'number'\n if (type === 'array') return schema.items?.enum ? 'multiselect' : 'tags'\n return 'text'\n}\n\nfunction hasOwnDefault(schema: GeneratedJsonSchema): boolean {\n return Object.prototype.hasOwnProperty.call(schema, 'default')\n}\n\nfunction allowsNull(schema: GeneratedJsonSchema): boolean {\n return schema.type === 'null' || (Array.isArray(schema.type) && schema.type.includes('null'))\n || !!schema.anyOf?.some(item => item.type === 'null')\n}\n\nfunction humanize(value: string): string {\n return value.replace(/[_-]+/g, ' ').replace(/^\\w/, character => character.toUpperCase())\n}\n","<script setup lang=\"ts\">\n/**\n * Standard generated workspace for a plugin that exposes an SDK job manifest.\n *\n * @example Recommended\n * ```vue\n * <GeneratedPluginView base-url=\"/api/peak-qc\" />\n * ```\n */\nimport { computed, onMounted, provide, reactive, ref, watch } from 'vue'\n\nimport { generatedJobDefaults, generatedJobFormSchema, normalizeGeneratedJobInput } from '../generated/schema'\nimport type { FormSchema } from '../types/form-builder'\nimport type {\n GeneratedAnalysisJob,\n GeneratedAnalysisResult,\n GeneratedJobDefinition,\n} from '../types/generated-ui'\nimport type { PillNavItem, SidebarToolSection } from '../types'\nimport {\n useJobsEndpoint,\n type GeneratedAnalysisTransport,\n} from '../composables/useJobsEndpoint'\nimport AlertBox from './AlertBox.vue'\nimport EmptyState from './EmptyState.vue'\nimport GeneratedResultRenderer from './GeneratedResultRenderer.vue'\nimport JobsStatusTray from './JobsStatusTray.vue'\nimport LoadingSpinner from './LoadingSpinner.vue'\nimport PluginWorkspaceView from './PluginWorkspaceView.vue'\nimport { GENERATED_JOBS_API_KEY } from './internal/generatedJobsApi'\nimport { definePluginWorkspaceView } from '../composables/componentSpecs'\n\ninterface Props {\n baseUrl: string\n showStandaloneLabel?: boolean\n transport?: GeneratedAnalysisTransport\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showStandaloneLabel: false,\n})\n\nconst generated = useJobsEndpoint({\n baseUrl: props.baseUrl,\n transport: props.transport,\n manifest: true,\n})\nprovide(GENERATED_JOBS_API_KEY, { baseUrl: props.baseUrl, transport: props.transport })\nconst activeDefinitionId = ref('')\nconst selectedJobId = ref('')\nconst valuesByDefinition = reactive<Record<string, Record<string, unknown>>>({})\nconst definitions = computed(() => generated.manifest.value?.jobs ?? [])\nconst activeDefinition = computed(() => (\n definitions.value.find(definition => definition.id === activeDefinitionId.value) ?? null\n))\n\nconst pillNav = computed<PillNavItem[]>(() => definitions.value.map(definition => ({\n id: definition.id,\n label: definition.title,\n})))\n\nconst panels = computed<Record<string, SidebarToolSection[]>>(() => Object.fromEntries(\n definitions.value.map(definition => [definition.id, [{\n id: definition.id,\n label: 'Parameters',\n subtitle: resourceSummary(definition),\n defaultOpen: true,\n }]]),\n))\n\nconst forms = computed<Record<string, FormSchema>>(() => Object.fromEntries(\n definitions.value.map(definition => [definition.id, generatedJobFormSchema(definition)]),\n))\n\nconst workspace = computed(() => definePluginWorkspaceView({\n title: generated.manifest.value?.ui.title ?? 'Analysis',\n subtitle: generated.manifest.value?.ui.description,\n // The platform shell renders the toasts around this view.\n toasts: false,\n topBar: {\n pills: pillNav.value,\n settings: false,\n standaloneLabel: props.showStandaloneLabel ? 'Standalone' : false,\n },\n sidebar: { title: 'Parameters', panels: panels.value, forms: forms.value },\n}))\n\nconst currentValues = computed(() => valuesByDefinition[activeDefinitionId.value] ?? {})\nconst currentJob = computed(() => {\n const currentSessionId = generated.session.value?.id\n const currentDefinitionId = activeDefinitionId.value\n const selected = generated.jobs.value.find(candidate => (\n candidate.job_id === selectedJobId.value\n && candidate.status === 'completed'\n && candidate.metadata.definition_id === currentDefinitionId\n && candidate.metadata.has_result === true\n ))\n return selected ?? generated.jobs.value.find(candidate => (\n candidate.session_id === currentSessionId\n && candidate.status === 'completed'\n && candidate.metadata.definition_id === currentDefinitionId\n && candidate.metadata.has_result === true\n ))\n})\nconst currentResult = computed<GeneratedAnalysisResult | null>(() => (\n currentJob.value ? generated.resultForJob(currentJob.value.job_id) : null\n))\n\nwatch(definitions, (nextDefinitions) => {\n for (const definition of nextDefinitions) {\n valuesByDefinition[definition.id] ??= generatedJobDefaults(definition)\n }\n if (!nextDefinitions.some(definition => definition.id === activeDefinitionId.value)) {\n activeDefinitionId.value = nextDefinitions[0]?.id ?? ''\n }\n}, { immediate: true })\n\nwatch(currentJob, (job) => {\n if (job) void generated.result(job)\n}, { immediate: true })\n\nfunction updateValues(values: Record<string, unknown>): void {\n if (activeDefinitionId.value) valuesByDefinition[activeDefinitionId.value] = { ...values }\n}\n\nasync function submitJob(sectionId: string, values: Record<string, unknown>): Promise<void> {\n const definition = definitions.value.find(candidate => candidate.id === sectionId)\n if (!definition) return\n selectedJobId.value = ''\n valuesByDefinition[definition.id] = { ...values }\n await generated.submit(definition.id, normalizeGeneratedJobInput(definition, values))\n}\n\nfunction selectJob(job: GeneratedAnalysisJob): void {\n selectedJobId.value = job.job_id\n activeDefinitionId.value = String(job.metadata.definition_id ?? activeDefinitionId.value)\n}\n\nfunction resourceSummary(definition: GeneratedJobDefinition): string {\n if (definition.lifecycle === 'service' || definition.profile?.kind === 'service') {\n return 'Host service'\n }\n if (definition.lifecycle === 'staged' || definition.profile?.kind === 'staged') {\n return 'Staged upload'\n }\n return `Up to ${definition.cpu} CPU`\n}\n\nonMounted(() => {\n void generated.refresh().catch(() => undefined)\n})\n</script>\n\n<template>\n <PluginWorkspaceView\n v-model:view=\"activeDefinitionId\"\n :spec=\"workspace\"\n :values=\"currentValues\"\n :form-loading=\"generated.isSubmitting.value\"\n :form-disabled=\"generated.isSubmitting.value\"\n @update:values=\"updateValues\"\n @form-submit=\"submitJob\"\n >\n <main class=\"mint-generated-workspace\">\n <div v-if=\"generated.isLoading.value\" class=\"mint-generated-workspace__loading\">\n <LoadingSpinner size=\"lg\" />\n <span>Loading analysis workspace</span>\n </div>\n\n <template v-else>\n <AlertBox v-if=\"generated.error.value\" tone=\"error\">{{ generated.error.value }}</AlertBox>\n\n <header v-if=\"activeDefinition\" class=\"mint-generated-workspace__header\">\n <div>\n <p class=\"mint-generated-workspace__eyebrow\">Analysis result</p>\n <h1>{{ activeDefinition.title }}</h1>\n <p v-if=\"activeDefinition.description\">{{ activeDefinition.description }}</p>\n </div>\n <div class=\"mint-generated-workspace__resources\" aria-label=\"Job resource requirements\">\n <span>{{ resourceSummary(activeDefinition) }}</span>\n </div>\n </header>\n\n <section class=\"mint-generated-workspace__result\">\n <GeneratedResultRenderer\n v-if=\"currentResult\"\n :result=\"currentResult\"\n />\n <EmptyState\n v-else\n title=\"No result yet\"\n description=\"Set the parameters and run the analysis. Jobs continue independently if you switch tabs.\"\n size=\"md\"\n />\n </section>\n </template>\n\n <JobsStatusTray\n :source=\"generated\"\n :teleport-to=\"false\"\n @select=\"selectJob\"\n />\n </main>\n </PluginWorkspaceView>\n</template>\n\n<style scoped>\n.mint-generated-workspace {\n position: relative;\n min-width: 0;\n min-height: calc(100vh - 5rem);\n padding: clamp(1rem, 2.5vw, 2.5rem);\n background: var(--bg-primary);\n}\n\n.mint-generated-workspace__loading {\n display: flex;\n min-height: 24rem;\n align-items: center;\n justify-content: center;\n gap: 0.75rem;\n color: var(--text-secondary);\n}\n\n.mint-generated-workspace__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 1.5rem;\n max-width: 76rem;\n margin: 0 auto 1.25rem;\n}\n\n.mint-generated-workspace__header h1 {\n margin: 0;\n color: var(--text-primary);\n font-size: clamp(1.35rem, 2vw, 1.8rem);\n line-height: 1.2;\n}\n\n.mint-generated-workspace__header p:not(.mint-generated-workspace__eyebrow) {\n margin: 0.4rem 0 0;\n color: var(--text-secondary);\n}\n\n.mint-generated-workspace__eyebrow {\n margin: 0 0 0.35rem;\n color: var(--text-secondary);\n font-size: 0.72rem;\n font-weight: 700;\n}\n\n.mint-generated-workspace__resources {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: 0.4rem;\n}\n\n.mint-generated-workspace__resources span {\n padding: 0.3rem 0.55rem;\n border: 1px solid var(--border-color);\n border-radius: 999px;\n background: var(--bg-secondary);\n color: var(--text-secondary);\n font-size: 0.75rem;\n font-weight: 600;\n}\n\n.mint-generated-workspace__result {\n max-width: 76rem;\n min-height: 24rem;\n margin: 0 auto;\n padding: clamp(1rem, 2vw, 1.75rem);\n border: 1px solid var(--border-color);\n border-radius: 1rem;\n background: var(--bg-secondary);\n box-shadow: var(--shadow-sm);\n}\n\n@media (max-width: 640px) {\n .mint-generated-workspace__header {\n flex-direction: column;\n }\n\n .mint-generated-workspace__resources {\n justify-content: flex-start;\n }\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * Standard generated workspace for a plugin that exposes an SDK job manifest.\n *\n * @example Recommended\n * ```vue\n * <GeneratedPluginView base-url=\"/api/peak-qc\" />\n * ```\n */\nimport { computed, onMounted, provide, reactive, ref, watch } from 'vue'\n\nimport { generatedJobDefaults, generatedJobFormSchema, normalizeGeneratedJobInput } from '../generated/schema'\nimport type { FormSchema } from '../types/form-builder'\nimport type {\n GeneratedAnalysisJob,\n GeneratedAnalysisResult,\n GeneratedJobDefinition,\n} from '../types/generated-ui'\nimport type { PillNavItem, SidebarToolSection } from '../types'\nimport {\n useJobsEndpoint,\n type GeneratedAnalysisTransport,\n} from '../composables/useJobsEndpoint'\nimport AlertBox from './AlertBox.vue'\nimport EmptyState from './EmptyState.vue'\nimport GeneratedResultRenderer from './GeneratedResultRenderer.vue'\nimport JobsStatusTray from './JobsStatusTray.vue'\nimport LoadingSpinner from './LoadingSpinner.vue'\nimport PluginWorkspaceView from './PluginWorkspaceView.vue'\nimport { GENERATED_JOBS_API_KEY } from './internal/generatedJobsApi'\nimport { definePluginWorkspaceView } from '../composables/componentSpecs'\n\ninterface Props {\n baseUrl: string\n showStandaloneLabel?: boolean\n transport?: GeneratedAnalysisTransport\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showStandaloneLabel: false,\n})\n\nconst generated = useJobsEndpoint({\n baseUrl: props.baseUrl,\n transport: props.transport,\n manifest: true,\n})\nprovide(GENERATED_JOBS_API_KEY, { baseUrl: props.baseUrl, transport: props.transport })\nconst activeDefinitionId = ref('')\nconst selectedJobId = ref('')\nconst valuesByDefinition = reactive<Record<string, Record<string, unknown>>>({})\nconst definitions = computed(() => generated.manifest.value?.jobs ?? [])\nconst activeDefinition = computed(() => (\n definitions.value.find(definition => definition.id === activeDefinitionId.value) ?? null\n))\n\nconst pillNav = computed<PillNavItem[]>(() => definitions.value.map(definition => ({\n id: definition.id,\n label: definition.title,\n})))\n\nconst panels = computed<Record<string, SidebarToolSection[]>>(() => Object.fromEntries(\n definitions.value.map(definition => [definition.id, [{\n id: definition.id,\n label: 'Parameters',\n subtitle: resourceSummary(definition),\n defaultOpen: true,\n }]]),\n))\n\nconst forms = computed<Record<string, FormSchema>>(() => Object.fromEntries(\n definitions.value.map(definition => [definition.id, generatedJobFormSchema(definition)]),\n))\n\nconst workspace = computed(() => definePluginWorkspaceView({\n title: generated.manifest.value?.ui.title ?? 'Analysis',\n subtitle: generated.manifest.value?.ui.description,\n // The platform shell renders the toasts around this view.\n toasts: false,\n topBar: {\n pills: pillNav.value,\n settings: false,\n standaloneLabel: props.showStandaloneLabel ? 'Standalone' : false,\n },\n sidebar: { title: 'Parameters', panels: panels.value, forms: forms.value },\n}))\n\nconst currentValues = computed(() => valuesByDefinition[activeDefinitionId.value] ?? {})\nconst currentJob = computed(() => {\n const currentSessionId = generated.session.value?.id\n const currentDefinitionId = activeDefinitionId.value\n const selected = generated.jobs.value.find(candidate => (\n candidate.job_id === selectedJobId.value\n && candidate.status === 'completed'\n && candidate.metadata.definition_id === currentDefinitionId\n && candidate.metadata.has_result === true\n ))\n return selected ?? generated.jobs.value.find(candidate => (\n candidate.session_id === currentSessionId\n && candidate.status === 'completed'\n && candidate.metadata.definition_id === currentDefinitionId\n && candidate.metadata.has_result === true\n ))\n})\nconst currentResult = computed<GeneratedAnalysisResult | null>(() => (\n currentJob.value ? generated.resultForJob(currentJob.value.job_id) : null\n))\n\nwatch(definitions, (nextDefinitions) => {\n for (const definition of nextDefinitions) {\n valuesByDefinition[definition.id] ??= generatedJobDefaults(definition)\n }\n if (!nextDefinitions.some(definition => definition.id === activeDefinitionId.value)) {\n activeDefinitionId.value = nextDefinitions[0]?.id ?? ''\n }\n}, { immediate: true })\n\nwatch(currentJob, (job) => {\n if (job) void generated.result(job)\n}, { immediate: true })\n\nfunction updateValues(values: Record<string, unknown>): void {\n if (activeDefinitionId.value) valuesByDefinition[activeDefinitionId.value] = { ...values }\n}\n\nasync function submitJob(sectionId: string, values: Record<string, unknown>): Promise<void> {\n const definition = definitions.value.find(candidate => candidate.id === sectionId)\n if (!definition) return\n selectedJobId.value = ''\n valuesByDefinition[definition.id] = { ...values }\n await generated.submit(definition.id, normalizeGeneratedJobInput(definition, values))\n}\n\nfunction selectJob(job: GeneratedAnalysisJob): void {\n selectedJobId.value = job.job_id\n activeDefinitionId.value = String(job.metadata.definition_id ?? activeDefinitionId.value)\n}\n\nfunction resourceSummary(definition: GeneratedJobDefinition): string {\n if (definition.lifecycle === 'service' || definition.profile?.kind === 'service') {\n return 'Host service'\n }\n if (definition.lifecycle === 'staged' || definition.profile?.kind === 'staged') {\n return 'Staged upload'\n }\n return `Up to ${definition.cpu} CPU`\n}\n\nonMounted(() => {\n void generated.refresh().catch(() => undefined)\n})\n</script>\n\n<template>\n <PluginWorkspaceView\n v-model:view=\"activeDefinitionId\"\n :spec=\"workspace\"\n :values=\"currentValues\"\n :form-loading=\"generated.isSubmitting.value\"\n :form-disabled=\"generated.isSubmitting.value\"\n @update:values=\"updateValues\"\n @form-submit=\"submitJob\"\n >\n <main class=\"mint-generated-workspace\">\n <div v-if=\"generated.isLoading.value\" class=\"mint-generated-workspace__loading\">\n <LoadingSpinner size=\"lg\" />\n <span>Loading analysis workspace</span>\n </div>\n\n <template v-else>\n <AlertBox v-if=\"generated.error.value\" tone=\"error\">{{ generated.error.value }}</AlertBox>\n\n <header v-if=\"activeDefinition\" class=\"mint-generated-workspace__header\">\n <div>\n <p class=\"mint-generated-workspace__eyebrow\">Analysis result</p>\n <h1>{{ activeDefinition.title }}</h1>\n <p v-if=\"activeDefinition.description\">{{ activeDefinition.description }}</p>\n </div>\n <div class=\"mint-generated-workspace__resources\" aria-label=\"Job resource requirements\">\n <span>{{ resourceSummary(activeDefinition) }}</span>\n </div>\n </header>\n\n <section class=\"mint-generated-workspace__result\">\n <GeneratedResultRenderer\n v-if=\"currentResult\"\n :result=\"currentResult\"\n />\n <EmptyState\n v-else\n title=\"No result yet\"\n description=\"Set the parameters and run the analysis. Jobs continue independently if you switch tabs.\"\n size=\"md\"\n />\n </section>\n </template>\n\n <JobsStatusTray\n :source=\"generated\"\n :teleport-to=\"false\"\n @select=\"selectJob\"\n />\n </main>\n </PluginWorkspaceView>\n</template>\n\n<style scoped>\n.mint-generated-workspace {\n position: relative;\n min-width: 0;\n min-height: calc(100vh - 5rem);\n padding: clamp(1rem, 2.5vw, 2.5rem);\n background: var(--bg-primary);\n}\n\n.mint-generated-workspace__loading {\n display: flex;\n min-height: 24rem;\n align-items: center;\n justify-content: center;\n gap: 0.75rem;\n color: var(--text-secondary);\n}\n\n.mint-generated-workspace__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 1.5rem;\n max-width: 76rem;\n margin: 0 auto 1.25rem;\n}\n\n.mint-generated-workspace__header h1 {\n margin: 0;\n color: var(--text-primary);\n font-size: clamp(1.35rem, 2vw, 1.8rem);\n line-height: 1.2;\n}\n\n.mint-generated-workspace__header p:not(.mint-generated-workspace__eyebrow) {\n margin: 0.4rem 0 0;\n color: var(--text-secondary);\n}\n\n.mint-generated-workspace__eyebrow {\n margin: 0 0 0.35rem;\n color: var(--text-secondary);\n font-size: 0.72rem;\n font-weight: 700;\n}\n\n.mint-generated-workspace__resources {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: 0.4rem;\n}\n\n.mint-generated-workspace__resources span {\n padding: 0.3rem 0.55rem;\n border: 1px solid var(--border-color);\n border-radius: 999px;\n background: var(--bg-secondary);\n color: var(--text-secondary);\n font-size: 0.75rem;\n font-weight: 600;\n}\n\n.mint-generated-workspace__result {\n max-width: 76rem;\n min-height: 24rem;\n margin: 0 auto;\n padding: clamp(1rem, 2vw, 1.75rem);\n border: 1px solid var(--border-color);\n border-radius: 1rem;\n background: var(--bg-secondary);\n box-shadow: var(--shadow-sm);\n}\n\n@media (max-width: 640px) {\n .mint-generated-workspace__header {\n flex-direction: column;\n }\n\n .mint-generated-workspace__resources {\n justify-content: flex-start;\n }\n}\n</style>\n","<script setup lang=\"ts\">\n/** PlateEditor holding its own copy of the plates (useRackEditor), for ComponentBindingRenderer bindings. */\nimport { watch } from 'vue'\nimport type { PlateEditorSpec, Rack } from '../../types'\nimport { useRackEditor } from '../../composables/useRackEditor'\nimport PlateEditor from '../PlateEditor.vue'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = defineProps<{\n modelValue: Rack[]\n activeRack?: string\n spec?: PlateEditorSpec\n}>()\n\nconst editor = useRackEditor(props.modelValue)\nconst { racks, activeRackId, plateEditorListeners, canUndo, canRedo } = editor\n// A new binding (template reloaded) replaces the local copy and its history, then reselects: the\n// activeRack watch may have run first, before its rack existed.\nwatch(() => props.modelValue, (next) => {\n racks.value = next.map(rack => ({ ...rack, wells: { ...rack.wells } }))\n editor.clearHistory()\n if (props.activeRack) editor.setActiveRack(props.activeRack)\n})\nwatch(() => props.activeRack, (id) => { if (id) editor.setActiveRack(id) }, { immediate: true })\n</script>\n\n<template>\n <PlateEditor\n v-bind=\"$attrs\"\n :spec=\"{ history: true, ...spec }\"\n :model-value=\"racks\"\n :active-rack=\"activeRackId\"\n :can-undo=\"canUndo\"\n :can-redo=\"canRedo\"\n v-on=\"plateEditorListeners\"\n />\n</template>\n","<script setup lang=\"ts\">\n/** PlateEditor holding its own copy of the plates (useRackEditor), for ComponentBindingRenderer bindings. */\nimport { watch } from 'vue'\nimport type { PlateEditorSpec, Rack } from '../../types'\nimport { useRackEditor } from '../../composables/useRackEditor'\nimport PlateEditor from '../PlateEditor.vue'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = defineProps<{\n modelValue: Rack[]\n activeRack?: string\n spec?: PlateEditorSpec\n}>()\n\nconst editor = useRackEditor(props.modelValue)\nconst { racks, activeRackId, plateEditorListeners, canUndo, canRedo } = editor\n// A new binding (template reloaded) replaces the local copy and its history, then reselects: the\n// activeRack watch may have run first, before its rack existed.\nwatch(() => props.modelValue, (next) => {\n racks.value = next.map(rack => ({ ...rack, wells: { ...rack.wells } }))\n editor.clearHistory()\n if (props.activeRack) editor.setActiveRack(props.activeRack)\n})\nwatch(() => props.activeRack, (id) => { if (id) editor.setActiveRack(id) }, { immediate: true })\n</script>\n\n<template>\n <PlateEditor\n v-bind=\"$attrs\"\n :spec=\"{ history: true, ...spec }\"\n :model-value=\"racks\"\n :active-rack=\"activeRackId\"\n :can-undo=\"canUndo\"\n :can-redo=\"canRedo\"\n v-on=\"plateEditorListeners\"\n />\n</template>\n","<script setup lang=\"ts\">\n/**\n * Render generated SDK component bindings such as WellPlate, DoseCalculator, DataFrame, and PlateEditor.\n *\n * @example Recommended\n * ```vue\n * <ComponentBindingRenderer :bindings=\"workspace.componentBindings.value\" />\n * ```\n */\nimport { computed, type Component } from 'vue'\nimport DataFrame from './DataFrame.vue'\nimport DoseCalculator from './DoseCalculator.vue'\nimport PlateEditorBindingInternal from './internal/PlateEditorBindingInternal.vue'\nimport ScheduleCalendar from './ScheduleCalendar.vue'\nimport WellPlate from './WellPlate.vue'\nimport { isRecord } from '../utils/records'\n\nexport interface ComponentBindingRendererBinding {\n id?: string\n component: string\n props?: Record<string, unknown> | readonly string[]\n propsObject?: Record<string, unknown>\n description?: string\n}\n\ntype ComponentBindingRendererLayout = 'grid' | 'stack'\n\ninterface Props {\n /** Single generated SDK component binding to render. */\n binding?: ComponentBindingRendererBinding\n /** Generated SDK component bindings to render. */\n bindings?: ComponentBindingRendererBinding[]\n /** Optional allow-list of component names, for example ['WellPlate', 'DataFrame']. */\n include?: string[]\n /** Optional deny-list of component names. */\n exclude?: string[]\n /** Compact child component sizing. */\n dense?: boolean\n /** Prefer preview-safe props for editable components. */\n readonly?: boolean\n /** Show component labels above each rendered component. */\n showHeaders?: boolean\n /** Show binding descriptions in each header. */\n showDescriptions?: boolean\n /** Grid or vertical stack layout. */\n layout?: ComponentBindingRendererLayout\n /** Message shown when no binding can be rendered. */\n emptyText?: string\n}\n\ntype RenderableBinding = ComponentBindingRendererBinding & {\n id: string\n componentImpl: Component\n normalizedProps: Record<string, unknown>\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n binding: undefined,\n bindings: () => [],\n include: () => [],\n exclude: () => [],\n dense: false,\n readonly: true,\n showHeaders: true,\n showDescriptions: true,\n layout: 'grid',\n emptyText: 'No renderable SDK component bindings.',\n})\n\nconst componentRegistry: Record<string, Component> = {\n DataFrame,\n DoseCalculator,\n // Holds its own copy of the plates: PlateEditor itself is controlled.\n PlateEditor: PlateEditorBindingInternal,\n ScheduleCalendar,\n WellPlate,\n}\n\nconst inputBindings = computed<ComponentBindingRendererBinding[]>(() => [\n ...(props.binding ? [props.binding] : []),\n ...props.bindings,\n])\n\nconst renderableBindings = computed<RenderableBinding[]>(() =>\n inputBindings.value\n .filter(binding => isIncluded(binding.component))\n .map((binding, index) => {\n const componentImpl = componentRegistry[binding.component]\n if (!componentImpl) return null\n return {\n ...binding,\n id: binding.id ?? `${binding.component}-${index + 1}`,\n componentImpl,\n normalizedProps: normalizeProps(binding),\n }\n })\n .filter((binding): binding is RenderableBinding => binding !== null)\n)\n\nconst rendererClasses = computed(() => [\n 'mint-component-binding-renderer',\n `mint-component-binding-renderer--${props.layout}`,\n props.dense ? 'mint-component-binding-renderer--dense' : '',\n])\n\nfunction isIncluded(componentName: string): boolean {\n if (props.include.length > 0 && !props.include.includes(componentName)) return false\n return !props.exclude.includes(componentName)\n}\n\nfunction baseProps(binding: ComponentBindingRendererBinding): Record<string, unknown> {\n if (binding.propsObject) return { ...binding.propsObject }\n if (isRecord(binding.props)) return { ...binding.props }\n return {}\n}\n\nfunction normalizeProps(binding: ComponentBindingRendererBinding): Record<string, unknown> {\n const base = baseProps(binding)\n\n switch (binding.component) {\n case 'WellPlate':\n case 'PlateEditor': {\n const spec = isRecord(base.spec) ? base.spec : {}\n return {\n ...base,\n spec: { ...spec, size: props.dense ? 'md' : (spec.size ?? 'fill') },\n readonly: props.readonly || Boolean(base.readonly),\n }\n }\n case 'DataFrame': {\n const spec = isRecord(base.spec) ? base.spec : {}\n return {\n ...base,\n spec: {\n ...spec,\n size: props.dense ? 'sm' : (spec.size ?? 'md'),\n maxHeight: spec.maxHeight ?? (props.dense ? '280px' : undefined),\n },\n }\n }\n case 'ScheduleCalendar':\n return {\n ...base,\n readonly: props.readonly || Boolean(base.readonly),\n showNavigation: props.dense ? false : (base.showNavigation ?? true),\n showViewToggle: props.dense ? false : (base.showViewToggle ?? true),\n }\n default:\n return base\n }\n}\n\n</script>\n\n<template>\n <div :class=\"rendererClasses\">\n <section\n v-for=\"renderableBinding in renderableBindings\"\n :key=\"renderableBinding.id\"\n class=\"mint-component-binding-renderer__item\"\n :data-component-binding-id=\"renderableBinding.id\"\n >\n <header\n v-if=\"showHeaders\"\n class=\"mint-component-binding-renderer__header\"\n >\n <div class=\"mint-component-binding-renderer__title-group\">\n <p class=\"mint-component-binding-renderer__component\">\n {{ renderableBinding.component }}\n </p>\n <p\n v-if=\"renderableBinding.id\"\n class=\"mint-component-binding-renderer__source\"\n >\n {{ renderableBinding.id }}\n </p>\n </div>\n <p\n v-if=\"showDescriptions && renderableBinding.description\"\n class=\"mint-component-binding-renderer__description\"\n >\n {{ renderableBinding.description }}\n </p>\n </header>\n\n <div class=\"mint-component-binding-renderer__body\">\n <component\n :is=\"renderableBinding.componentImpl\"\n v-bind=\"renderableBinding.normalizedProps\"\n />\n </div>\n </section>\n\n <p\n v-if=\"renderableBindings.length === 0\"\n class=\"mint-component-binding-renderer__empty\"\n >\n {{ emptyText }}\n </p>\n </div>\n</template>\n\n<style scoped>\n.mint-component-binding-renderer {\n display: grid;\n gap: 1rem;\n min-width: 0;\n}\n\n.mint-component-binding-renderer--grid {\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 28rem), 1fr));\n}\n\n.mint-component-binding-renderer--stack {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.mint-component-binding-renderer--dense {\n gap: 0.75rem;\n}\n\n.mint-component-binding-renderer__item {\n min-width: 0;\n overflow: hidden;\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 0.5rem;\n background: var(--bg-card, #ffffff);\n box-shadow: var(--shadow-sm, 0 1px 2px rgb(15 23 42 / 0.06));\n}\n\n.mint-component-binding-renderer__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 1rem;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid var(--border-color, #e5e7eb);\n background: var(--bg-secondary, #f8fafc);\n}\n\n.mint-component-binding-renderer__title-group {\n min-width: 0;\n}\n\n.mint-component-binding-renderer__component {\n margin: 0;\n color: var(--text-primary, #0f172a);\n font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace);\n font-size: 0.8125rem;\n font-weight: 600;\n}\n\n.mint-component-binding-renderer__source,\n.mint-component-binding-renderer__description,\n.mint-component-binding-renderer__empty {\n margin: 0;\n color: var(--text-secondary, #475569);\n font-size: 0.75rem;\n line-height: 1.4;\n}\n\n.mint-component-binding-renderer__description {\n max-width: 24rem;\n text-align: right;\n}\n\n.mint-component-binding-renderer__body {\n min-width: 0;\n padding: 1rem;\n}\n\n.mint-component-binding-renderer--dense .mint-component-binding-renderer__header,\n.mint-component-binding-renderer--dense .mint-component-binding-renderer__body {\n padding: 0.75rem;\n}\n\n.mint-component-binding-renderer__empty {\n padding: 1rem;\n border: 1px dashed var(--border-color, #e5e7eb);\n border-radius: 0.5rem;\n background: var(--bg-secondary, #f8fafc);\n text-align: center;\n}\n\n@media (max-width: 720px) {\n .mint-component-binding-renderer__header {\n display: block;\n }\n\n .mint-component-binding-renderer__description {\n max-width: none;\n margin-top: 0.25rem;\n text-align: left;\n }\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * Render generated SDK component bindings such as WellPlate, DoseCalculator, DataFrame, and PlateEditor.\n *\n * @example Recommended\n * ```vue\n * <ComponentBindingRenderer :bindings=\"workspace.componentBindings.value\" />\n * ```\n */\nimport { computed, type Component } from 'vue'\nimport DataFrame from './DataFrame.vue'\nimport DoseCalculator from './DoseCalculator.vue'\nimport PlateEditorBindingInternal from './internal/PlateEditorBindingInternal.vue'\nimport ScheduleCalendar from './ScheduleCalendar.vue'\nimport WellPlate from './WellPlate.vue'\nimport { isRecord } from '../utils/records'\n\nexport interface ComponentBindingRendererBinding {\n id?: string\n component: string\n props?: Record<string, unknown> | readonly string[]\n propsObject?: Record<string, unknown>\n description?: string\n}\n\ntype ComponentBindingRendererLayout = 'grid' | 'stack'\n\ninterface Props {\n /** Single generated SDK component binding to render. */\n binding?: ComponentBindingRendererBinding\n /** Generated SDK component bindings to render. */\n bindings?: ComponentBindingRendererBinding[]\n /** Optional allow-list of component names, for example ['WellPlate', 'DataFrame']. */\n include?: string[]\n /** Optional deny-list of component names. */\n exclude?: string[]\n /** Compact child component sizing. */\n dense?: boolean\n /** Prefer preview-safe props for editable components. */\n readonly?: boolean\n /** Show component labels above each rendered component. */\n showHeaders?: boolean\n /** Show binding descriptions in each header. */\n showDescriptions?: boolean\n /** Grid or vertical stack layout. */\n layout?: ComponentBindingRendererLayout\n /** Message shown when no binding can be rendered. */\n emptyText?: string\n}\n\ntype RenderableBinding = ComponentBindingRendererBinding & {\n id: string\n componentImpl: Component\n normalizedProps: Record<string, unknown>\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n binding: undefined,\n bindings: () => [],\n include: () => [],\n exclude: () => [],\n dense: false,\n readonly: true,\n showHeaders: true,\n showDescriptions: true,\n layout: 'grid',\n emptyText: 'No renderable SDK component bindings.',\n})\n\nconst componentRegistry: Record<string, Component> = {\n DataFrame,\n DoseCalculator,\n // Holds its own copy of the plates: PlateEditor itself is controlled.\n PlateEditor: PlateEditorBindingInternal,\n ScheduleCalendar,\n WellPlate,\n}\n\nconst inputBindings = computed<ComponentBindingRendererBinding[]>(() => [\n ...(props.binding ? [props.binding] : []),\n ...props.bindings,\n])\n\nconst renderableBindings = computed<RenderableBinding[]>(() =>\n inputBindings.value\n .filter(binding => isIncluded(binding.component))\n .map((binding, index) => {\n const componentImpl = componentRegistry[binding.component]\n if (!componentImpl) return null\n return {\n ...binding,\n id: binding.id ?? `${binding.component}-${index + 1}`,\n componentImpl,\n normalizedProps: normalizeProps(binding),\n }\n })\n .filter((binding): binding is RenderableBinding => binding !== null)\n)\n\nconst rendererClasses = computed(() => [\n 'mint-component-binding-renderer',\n `mint-component-binding-renderer--${props.layout}`,\n props.dense ? 'mint-component-binding-renderer--dense' : '',\n])\n\nfunction isIncluded(componentName: string): boolean {\n if (props.include.length > 0 && !props.include.includes(componentName)) return false\n return !props.exclude.includes(componentName)\n}\n\nfunction baseProps(binding: ComponentBindingRendererBinding): Record<string, unknown> {\n if (binding.propsObject) return { ...binding.propsObject }\n if (isRecord(binding.props)) return { ...binding.props }\n return {}\n}\n\nfunction normalizeProps(binding: ComponentBindingRendererBinding): Record<string, unknown> {\n const base = baseProps(binding)\n\n switch (binding.component) {\n case 'WellPlate':\n case 'PlateEditor': {\n const spec = isRecord(base.spec) ? base.spec : {}\n return {\n ...base,\n spec: { ...spec, size: props.dense ? 'md' : (spec.size ?? 'fill') },\n readonly: props.readonly || Boolean(base.readonly),\n }\n }\n case 'DataFrame': {\n const spec = isRecord(base.spec) ? base.spec : {}\n return {\n ...base,\n spec: {\n ...spec,\n size: props.dense ? 'sm' : (spec.size ?? 'md'),\n maxHeight: spec.maxHeight ?? (props.dense ? '280px' : undefined),\n },\n }\n }\n case 'ScheduleCalendar':\n return {\n ...base,\n readonly: props.readonly || Boolean(base.readonly),\n showNavigation: props.dense ? false : (base.showNavigation ?? true),\n showViewToggle: props.dense ? false : (base.showViewToggle ?? true),\n }\n default:\n return base\n }\n}\n\n</script>\n\n<template>\n <div :class=\"rendererClasses\">\n <section\n v-for=\"renderableBinding in renderableBindings\"\n :key=\"renderableBinding.id\"\n class=\"mint-component-binding-renderer__item\"\n :data-component-binding-id=\"renderableBinding.id\"\n >\n <header\n v-if=\"showHeaders\"\n class=\"mint-component-binding-renderer__header\"\n >\n <div class=\"mint-component-binding-renderer__title-group\">\n <p class=\"mint-component-binding-renderer__component\">\n {{ renderableBinding.component }}\n </p>\n <p\n v-if=\"renderableBinding.id\"\n class=\"mint-component-binding-renderer__source\"\n >\n {{ renderableBinding.id }}\n </p>\n </div>\n <p\n v-if=\"showDescriptions && renderableBinding.description\"\n class=\"mint-component-binding-renderer__description\"\n >\n {{ renderableBinding.description }}\n </p>\n </header>\n\n <div class=\"mint-component-binding-renderer__body\">\n <component\n :is=\"renderableBinding.componentImpl\"\n v-bind=\"renderableBinding.normalizedProps\"\n />\n </div>\n </section>\n\n <p\n v-if=\"renderableBindings.length === 0\"\n class=\"mint-component-binding-renderer__empty\"\n >\n {{ emptyText }}\n </p>\n </div>\n</template>\n\n<style scoped>\n.mint-component-binding-renderer {\n display: grid;\n gap: 1rem;\n min-width: 0;\n}\n\n.mint-component-binding-renderer--grid {\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 28rem), 1fr));\n}\n\n.mint-component-binding-renderer--stack {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.mint-component-binding-renderer--dense {\n gap: 0.75rem;\n}\n\n.mint-component-binding-renderer__item {\n min-width: 0;\n overflow: hidden;\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 0.5rem;\n background: var(--bg-card, #ffffff);\n box-shadow: var(--shadow-sm, 0 1px 2px rgb(15 23 42 / 0.06));\n}\n\n.mint-component-binding-renderer__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 1rem;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid var(--border-color, #e5e7eb);\n background: var(--bg-secondary, #f8fafc);\n}\n\n.mint-component-binding-renderer__title-group {\n min-width: 0;\n}\n\n.mint-component-binding-renderer__component {\n margin: 0;\n color: var(--text-primary, #0f172a);\n font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace);\n font-size: 0.8125rem;\n font-weight: 600;\n}\n\n.mint-component-binding-renderer__source,\n.mint-component-binding-renderer__description,\n.mint-component-binding-renderer__empty {\n margin: 0;\n color: var(--text-secondary, #475569);\n font-size: 0.75rem;\n line-height: 1.4;\n}\n\n.mint-component-binding-renderer__description {\n max-width: 24rem;\n text-align: right;\n}\n\n.mint-component-binding-renderer__body {\n min-width: 0;\n padding: 1rem;\n}\n\n.mint-component-binding-renderer--dense .mint-component-binding-renderer__header,\n.mint-component-binding-renderer--dense .mint-component-binding-renderer__body {\n padding: 0.75rem;\n}\n\n.mint-component-binding-renderer__empty {\n padding: 1rem;\n border: 1px dashed var(--border-color, #e5e7eb);\n border-radius: 0.5rem;\n background: var(--bg-secondary, #f8fafc);\n text-align: center;\n}\n\n@media (max-width: 720px) {\n .mint-component-binding-renderer__header {\n display: block;\n }\n\n .mint-component-binding-renderer__description {\n max-width: none;\n margin-top: 0.25rem;\n text-align: left;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { RefreshCw } from 'lucide-vue-next'\n\ndefineProps<{\n visible: boolean\n}>()\n\nconst emit = defineEmits<{\n reload: []\n}>()\n</script>\n\n<template>\n <div v-if=\"visible\" class=\"mint-runtime-update\" role=\"status\">\n <RefreshCw :size=\"16\" aria-hidden=\"true\" />\n <span>A new version is ready.</span>\n <button type=\"button\" @click=\"emit('reload')\">\n Reload now\n </button>\n </div>\n</template>\n\n<style scoped>\n.mint-runtime-update {\n position: fixed;\n right: 20px;\n bottom: 20px;\n z-index: 1200;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n color: var(--text-primary);\n background: var(--bg-card);\n border: 1px solid var(--border-color);\n border-radius: 10px;\n box-shadow: 0 10px 28px rgb(15 23 42 / 16%);\n font-size: 13px;\n font-weight: 500;\n}\n\n.mint-runtime-update button {\n padding: 5px 9px;\n color: #fff;\n background: var(--color-primary);\n border: 0;\n border-radius: 6px;\n font: inherit;\n cursor: pointer;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { RefreshCw } from 'lucide-vue-next'\n\ndefineProps<{\n visible: boolean\n}>()\n\nconst emit = defineEmits<{\n reload: []\n}>()\n</script>\n\n<template>\n <div v-if=\"visible\" class=\"mint-runtime-update\" role=\"status\">\n <RefreshCw :size=\"16\" aria-hidden=\"true\" />\n <span>A new version is ready.</span>\n <button type=\"button\" @click=\"emit('reload')\">\n Reload now\n </button>\n </div>\n</template>\n\n<style scoped>\n.mint-runtime-update {\n position: fixed;\n right: 20px;\n bottom: 20px;\n z-index: 1200;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n color: var(--text-primary);\n background: var(--bg-card);\n border: 1px solid var(--border-color);\n border-radius: 10px;\n box-shadow: 0 10px 28px rgb(15 23 42 / 16%);\n font-size: 13px;\n font-weight: 500;\n}\n\n.mint-runtime-update button {\n padding: 5px 9px;\n color: #fff;\n background: var(--color-primary);\n border: 0;\n border-radius: 6px;\n font: inherit;\n cursor: pointer;\n}\n</style>\n","import {\n getCurrentScope,\n onScopeDispose,\n readonly,\n ref,\n toValue,\n watch,\n type MaybeRefOrGetter,\n type Ref,\n} from 'vue'\nimport { useApi } from './useApi'\nimport { currentPresence, subscribeRealtime, type RealtimeEvent } from './useRealtime'\n\n/**\n * What a viewer does on a topic. The platform accepts a fixed set per topic\n * kind: `experiment:{id}` takes all four labels, `project:{id}` only\n * `viewing` and `editing`. `editing` means a form with unsaved edits is open;\n * it is a hint, not a lock.\n */\nexport type PresenceActivity = 'viewing' | 'viewing_design' | 'viewing_results' | 'editing'\n\n/** One user with an open realtime stream on the topic. */\nexport interface PresenceViewer {\n user_id: string\n activity: PresenceActivity\n}\n\nexport interface UsePresenceReturn {\n /** The viewers, `editing` first, at most 20; the current user is included. Empty while the stream is closed. */\n viewers: Readonly<Ref<readonly PresenceViewer[]>>\n /** Every viewer, also those beyond the 20 in `viewers`. */\n count: Readonly<Ref<number>>\n /** True while the shared realtime stream is open. */\n connected: Readonly<Ref<boolean>>\n /** Unsubscribe; also runs when the calling component or effect scope is disposed. */\n stop: () => void\n}\n\n/**\n * Who else views an `experiment:{id}` or `project:{id}` topic (RFC #439).\n *\n * Built on `useRealtime`: the tab's open stream on the topic is its presence,\n * and `presence.changed` events update `viewers`. When `activity` is given,\n * the label is sent to `POST /api/presence/activity` when the call starts on\n * an open stream, each time the stream opens and each time the label changes;\n * `stop` (also the end of the calling scope) sets it back to `viewing`.\n * Without it, the platform shows the tab as `viewing`. Like `useRealtime`, it needs the platform's `realtime`\n * feature flag; check that flag first.\n *\n * @example\n * const { viewers } = usePresence(\n * () => `experiment:${id.value}`,\n * () => (dirty.value ? 'editing' : 'viewing'),\n * )\n */\nexport function usePresence(\n topic: MaybeRefOrGetter<string>,\n activity?: MaybeRefOrGetter<PresenceActivity>,\n): UsePresenceReturn {\n const viewers = ref<readonly PresenceViewer[]>([])\n const count = ref(0)\n const api = activity === undefined ? null : useApi({ baseUrl: '/api' })\n\n function report(label = toValue(activity)): void {\n // Presence is a hint: a failed report never reaches the view.\n api?.post('/presence/activity', { topic: toValue(topic), activity: label }).catch(() => {})\n }\n\n function show(event: RealtimeEvent | undefined): void {\n viewers.value = (event?.viewers ?? []) as PresenceViewer[]\n count.value = event?.count ?? 0\n }\n\n const realtime = subscribeRealtime(() => [toValue(topic)], (event) => {\n // ponytail: a resync after a queue overflow keeps the last viewers until\n // the next change; read the presence over REST here if that shows.\n if (event.type === 'resync') report()\n else if (event.type === 'presence.changed' && event.topic === toValue(topic)) show(event)\n }, true)\n\n // When the tab's open stream already views the topic, no open and no resync follow.\n function load(): void {\n const current = currentPresence(toValue(topic))\n show(current)\n if (current) report()\n }\n load()\n const stopTopic = watch(() => toValue(topic), load)\n // A closed stream shows nobody; the server sends the viewers again at the next open.\n const stopConnected = watch(realtime.connected, (open) => { if (!open) show(undefined) })\n // While the stream is closed the report waits for the resync of the next open.\n const stopActivity = watch(() => toValue(activity), () => {\n if (realtime.connected.value) report()\n })\n\n let stopped = false\n function stop(): void {\n if (stopped) return\n stopped = true\n stopTopic()\n stopConnected()\n stopActivity()\n // The stream can stay open on the topic for other callers: drop this caller's label.\n if (realtime.connected.value && toValue(activity) !== 'viewing') report('viewing')\n realtime.stop()\n }\n if (getCurrentScope()) onScopeDispose(stop)\n\n return { viewers: readonly(viewers), count: readonly(count), connected: realtime.connected, stop }\n}\n","import type { PresenceActivity } from '../composables/usePresence'\n\n/** One person on a presence topic, with the name to show. */\nexport interface PresencePerson {\n id: string\n name: string\n activity: PresenceActivity\n}\n\nexport interface PresenceArrangement {\n /** Every other person, `editing` first. */\n others: PresencePerson[]\n /** The people that get an avatar. */\n shown: PresencePerson[]\n /** The other people without an avatar (the `+N`). */\n overflow: number\n /** All other people, also those the platform did not list. */\n total: number\n}\n\nexport const PRESENCE_ACTIVITY_LABELS: Record<PresenceActivity, string> = {\n viewing: 'viewing',\n viewing_design: 'viewing design',\n viewing_results: 'viewing results',\n editing: 'editing',\n}\n\n/**\n * Remove the current user, sort `editing` first (the sort is stable, so the\n * platform order stays otherwise) and keep at most `max` avatars.\n * `count` is the platform's total, the current user included.\n */\nexport function arrangePresence(\n people: readonly PresencePerson[],\n options: { selfId?: string | null; count?: number; max?: number } = {},\n): PresenceArrangement {\n const max = options.max ?? 4\n const selfListed = people.some(person => person.id === options.selfId)\n const others = people\n .filter(person => person.id !== options.selfId)\n .sort((a, b) => Number(b.activity === 'editing') - Number(a.activity === 'editing'))\n // ponytail: past the platform's 20-viewer cap an unlisted current user counts as other.\n const total = Math.max(others.length, (options.count ?? people.length) - (selfListed ? 1 : 0))\n const shown = others.slice(0, max)\n return { others, shown, overflow: total - shown.length, total }\n}\n\n/** \"6 other people here: Alice Chen editing, Chen Li viewing design, and 4 more\". */\nexport function presenceSummary({ shown, overflow, total }: PresenceArrangement): string {\n const names = shown.map(person => `${person.name} ${PRESENCE_ACTIVITY_LABELS[person.activity]}`)\n if (overflow > 0) names.push(`and ${overflow} more`)\n return `${total} other ${total === 1 ? 'person' : 'people'} here: ${names.join(', ')}`\n}\n","<script setup lang=\"ts\">\n/** Who else is on a presence topic: at most `max` avatars (editing first), then `+N`; one button opens the list of each person and activity. */\nimport { computed, useId, useTemplateRef, watch, type Component } from 'vue'\nimport { ChartColumn, Eye, FlaskConical, Pencil } from 'lucide-vue-next'\nimport Avatar from './Avatar.vue'\nimport { useDropdownState } from '../composables/useDropdownState'\nimport { useEventListener } from '../composables/useEventListener'\nimport type { PresenceActivity } from '../composables/usePresence'\nimport {\n PRESENCE_ACTIVITY_LABELS,\n arrangePresence,\n presenceSummary,\n type PresencePerson,\n} from '../utils/presenceAvatars'\n\ninterface Props {\n /** The people on the topic, for example `usePresence().viewers` with names. */\n people: PresencePerson[]\n /** The current user; never shown. */\n selfId?: string | null\n /** All people on the topic (`usePresence().count`), when the list is capped. */\n count?: number\n /** Accessible name of the list. */\n label?: string\n /** Most avatars before `+N`. */\n max?: number\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n selfId: null,\n count: undefined,\n label: 'People here',\n max: 4,\n})\n\nconst ACTIVITY_ICONS: Record<PresenceActivity, Component> = {\n viewing: Eye,\n viewing_design: FlaskConical,\n viewing_results: ChartColumn,\n editing: Pencil,\n}\n\nconst arrangement = computed(() => arrangePresence(props.people, {\n selfId: props.selfId,\n count: props.count,\n max: props.max,\n}))\nconst summary = computed(() => presenceSummary(arrangement.value))\nconst unlisted = computed(() => arrangement.value.total - arrangement.value.others.length)\n\nconst root = useTemplateRef<HTMLElement>('root')\nconst { isOpen, toggle, close } = useDropdownState({\n rootRef: root,\n triggerRef: useTemplateRef<HTMLElement>('trigger'),\n closeOnEscape: false,\n})\n// Escape closes the list from anywhere, but takes the focus back to the button only from within it.\nuseEventListener(() => document, 'keydown', (event) => {\n if (event.key === 'Escape') close(root.value?.contains(event.target as Node) ?? false)\n})\n// The root unmounts when nobody else is here; the list must not reopen on its own when someone comes back.\nwatch(() => arrangement.value.total, (total) => { if (total === 0) close() })\nconst panelId = `mint-presence-${useId()}`\n</script>\n\n<template>\n <div v-if=\"arrangement.total > 0\" ref=\"root\" class=\"mint-presence\">\n <button\n ref=\"trigger\"\n type=\"button\"\n class=\"mint-presence__trigger\"\n :aria-expanded=\"isOpen\"\n :aria-controls=\"isOpen ? panelId : undefined\"\n :aria-label=\"summary\"\n @click=\"toggle\"\n >\n <span class=\"mint-presence__stack\" aria-hidden=\"true\">\n <span\n v-for=\"person in arrangement.shown\"\n :key=\"person.id\"\n :class=\"['mint-presence__avatar', { 'mint-presence__avatar--editing': person.activity === 'editing' }]\"\n >\n <Avatar :name=\"person.name\" size=\"xs\" />\n <span v-if=\"person.activity === 'editing'\" class=\"mint-presence__badge\"><Pencil /></span>\n </span>\n <span v-if=\"arrangement.overflow > 0\" class=\"mint-presence__more\">+{{ arrangement.overflow }}</span>\n </span>\n </button>\n\n <div v-if=\"isOpen\" :id=\"panelId\" class=\"mint-popover mint-presence__panel\">\n <div class=\"mint-presence__head\">Here now <span class=\"mint-presence__count\">{{ arrangement.total }}</span></div>\n <ul class=\"mint-presence__list\" :aria-label=\"label\">\n <li v-for=\"person in arrangement.others\" :key=\"person.id\" class=\"mint-presence__row\">\n <span\n :class=\"['mint-presence__avatar', { 'mint-presence__avatar--editing': person.activity === 'editing' }]\"\n aria-hidden=\"true\"\n >\n <Avatar :name=\"person.name\" size=\"xs\" />\n <span v-if=\"person.activity === 'editing'\" class=\"mint-presence__badge\"><Pencil /></span>\n </span>\n <span class=\"mint-presence__name\">{{ person.name }}</span>\n <span :class=\"['mint-presence__activity', { 'mint-presence__activity--editing': person.activity === 'editing' }]\">\n <component :is=\"ACTIVITY_ICONS[person.activity]\" aria-hidden=\"true\" />\n {{ PRESENCE_ACTIVITY_LABELS[person.activity] }}\n </span>\n </li>\n </ul>\n <p v-if=\"unlisted > 0\" class=\"mint-presence__rest\">and {{ unlisted }} more</p>\n <p class=\"mint-presence__foot\">\n <slot name=\"footer\">Editing is a hint, not a lock. You can still edit.</slot>\n </p>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Who else is on a presence topic: at most `max` avatars (editing first), then `+N`; one button opens the list of each person and activity. */\nimport { computed, useId, useTemplateRef, watch, type Component } from 'vue'\nimport { ChartColumn, Eye, FlaskConical, Pencil } from 'lucide-vue-next'\nimport Avatar from './Avatar.vue'\nimport { useDropdownState } from '../composables/useDropdownState'\nimport { useEventListener } from '../composables/useEventListener'\nimport type { PresenceActivity } from '../composables/usePresence'\nimport {\n PRESENCE_ACTIVITY_LABELS,\n arrangePresence,\n presenceSummary,\n type PresencePerson,\n} from '../utils/presenceAvatars'\n\ninterface Props {\n /** The people on the topic, for example `usePresence().viewers` with names. */\n people: PresencePerson[]\n /** The current user; never shown. */\n selfId?: string | null\n /** All people on the topic (`usePresence().count`), when the list is capped. */\n count?: number\n /** Accessible name of the list. */\n label?: string\n /** Most avatars before `+N`. */\n max?: number\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n selfId: null,\n count: undefined,\n label: 'People here',\n max: 4,\n})\n\nconst ACTIVITY_ICONS: Record<PresenceActivity, Component> = {\n viewing: Eye,\n viewing_design: FlaskConical,\n viewing_results: ChartColumn,\n editing: Pencil,\n}\n\nconst arrangement = computed(() => arrangePresence(props.people, {\n selfId: props.selfId,\n count: props.count,\n max: props.max,\n}))\nconst summary = computed(() => presenceSummary(arrangement.value))\nconst unlisted = computed(() => arrangement.value.total - arrangement.value.others.length)\n\nconst root = useTemplateRef<HTMLElement>('root')\nconst { isOpen, toggle, close } = useDropdownState({\n rootRef: root,\n triggerRef: useTemplateRef<HTMLElement>('trigger'),\n closeOnEscape: false,\n})\n// Escape closes the list from anywhere, but takes the focus back to the button only from within it.\nuseEventListener(() => document, 'keydown', (event) => {\n if (event.key === 'Escape') close(root.value?.contains(event.target as Node) ?? false)\n})\n// The root unmounts when nobody else is here; the list must not reopen on its own when someone comes back.\nwatch(() => arrangement.value.total, (total) => { if (total === 0) close() })\nconst panelId = `mint-presence-${useId()}`\n</script>\n\n<template>\n <div v-if=\"arrangement.total > 0\" ref=\"root\" class=\"mint-presence\">\n <button\n ref=\"trigger\"\n type=\"button\"\n class=\"mint-presence__trigger\"\n :aria-expanded=\"isOpen\"\n :aria-controls=\"isOpen ? panelId : undefined\"\n :aria-label=\"summary\"\n @click=\"toggle\"\n >\n <span class=\"mint-presence__stack\" aria-hidden=\"true\">\n <span\n v-for=\"person in arrangement.shown\"\n :key=\"person.id\"\n :class=\"['mint-presence__avatar', { 'mint-presence__avatar--editing': person.activity === 'editing' }]\"\n >\n <Avatar :name=\"person.name\" size=\"xs\" />\n <span v-if=\"person.activity === 'editing'\" class=\"mint-presence__badge\"><Pencil /></span>\n </span>\n <span v-if=\"arrangement.overflow > 0\" class=\"mint-presence__more\">+{{ arrangement.overflow }}</span>\n </span>\n </button>\n\n <div v-if=\"isOpen\" :id=\"panelId\" class=\"mint-popover mint-presence__panel\">\n <div class=\"mint-presence__head\">Here now <span class=\"mint-presence__count\">{{ arrangement.total }}</span></div>\n <ul class=\"mint-presence__list\" :aria-label=\"label\">\n <li v-for=\"person in arrangement.others\" :key=\"person.id\" class=\"mint-presence__row\">\n <span\n :class=\"['mint-presence__avatar', { 'mint-presence__avatar--editing': person.activity === 'editing' }]\"\n aria-hidden=\"true\"\n >\n <Avatar :name=\"person.name\" size=\"xs\" />\n <span v-if=\"person.activity === 'editing'\" class=\"mint-presence__badge\"><Pencil /></span>\n </span>\n <span class=\"mint-presence__name\">{{ person.name }}</span>\n <span :class=\"['mint-presence__activity', { 'mint-presence__activity--editing': person.activity === 'editing' }]\">\n <component :is=\"ACTIVITY_ICONS[person.activity]\" aria-hidden=\"true\" />\n {{ PRESENCE_ACTIVITY_LABELS[person.activity] }}\n </span>\n </li>\n </ul>\n <p v-if=\"unlisted > 0\" class=\"mint-presence__rest\">and {{ unlisted }} more</p>\n <p class=\"mint-presence__foot\">\n <slot name=\"footer\">Editing is a hint, not a lock. You can still edit.</slot>\n </p>\n </div>\n </div>\n</template>\n","// Generated-UI runtime components (`@morscherlab/mint-sdk/runtime`).\n\n// Layout components\nexport { default as GeneratedPluginView } from './components/GeneratedPluginView.vue'\nexport { default as GeneratedResultRenderer } from './components/GeneratedResultRenderer.vue'\nexport { default as GeneratedPlotlyResult } from './components/GeneratedPlotlyResult.vue'\nexport { default as ComponentBindingRenderer } from './components/ComponentBindingRenderer.vue'\n/** Modal picker over the read-only server mounts, recording paths rather than copying data. */\nexport { default as GeneratedPathInput } from './components/GeneratedPathInput.vue'\n\n// Feedback components\nexport { default as RuntimeUpdateNotice } from './components/RuntimeUpdateNotice.vue'\n\n// The realtime event stream (`GET /api/events`, behind the `realtime` feature flag).\nexport {\n useRealtime,\n type RealtimeEvent,\n type RealtimeHandler,\n type UseRealtimeReturn,\n} from './composables/useRealtime'\nexport {\n usePresence,\n type PresenceActivity,\n type PresenceViewer,\n type UsePresenceReturn,\n} from './composables/usePresence'\n/** Avatar stack of the other people on a presence topic, with a list of each person and activity. */\nexport { default as PresenceAvatars } from './components/PresenceAvatars.vue'\nexport type { PresencePerson } from './utils/presenceAvatars'\n\n// HTTP client and plugin endpoint helpers. Generated clients (`@/generated/mint-plugin`)\n// build on these; plugin code uses the generated `useClient`, `useSettings` and `useJobs`.\nexport {\n AuthenticationRequiredError,\n useApi,\n type ApiClientOptions,\n type UseApiReturn,\n} from './composables/useApi'\nexport {\n buildEndpointUrl,\n createClient,\n downloadEndpoint,\n pluginFormDataFromPayload,\n resolvePluginBaseUrl,\n uploadEndpoint,\n useEventStream,\n useSettingsEndpoint,\n type BuildEndpointUrlOptions,\n type CreateClientOptions,\n type DownloadEndpointOptions,\n type EventStreamMessage,\n type PluginClientRequestOptions,\n type PluginContract,\n type PluginContractSettings,\n type PluginEndpointContract,\n type PluginEndpointDefinition,\n type PluginEndpointRequestOptions,\n type PluginFormDataPayload,\n type PluginFormDataValue,\n type PluginHttpMethod,\n type PluginNavItemContract,\n type StreamOptions,\n type UseEventStreamReturn,\n type UseSettingsEndpointOptions,\n type UseSettingsEndpointReturn,\n} from './composables/createClient'\nexport {\n createGeneratedAnalysisTransport,\n useJobsEndpoint,\n type GeneratedAnalysisTransport,\n type PluginJobRequestOptions,\n type PluginJobWaitOptions,\n type UseJobsEndpointOptions,\n type UseJobsEndpointReturn,\n} from './composables/useJobsEndpoint'\nexport {\n combinePluginJobSources,\n useJobCenter,\n type CombinedPluginJobCenterSource,\n type JobsStatusTrayTab,\n type PluginJobCenterSource,\n type UseJobCenterOptions,\n type UseJobCenterReturn,\n} from './composables/useJobCenter'\nexport { controlsTo, type ControlsTarget } from './composables/controlSchemaAdapters'\nexport { controlBindings } from './composables/controlComponentBindings'\n\n// Forms, control schemas, job helpers and platform context helpers\nexport {\n useForm,\n type ValidationRule,\n type FieldRules,\n type FieldState,\n type UseFormReturn,\n} from './composables/useForm'\nexport {\n useFormBuilder,\n evaluateCondition,\n} from './composables/useFormBuilder'\nexport {\n getFieldRegistryEntry,\n getTypeDefault,\n type RegistryEntry,\n} from './composables/formBuilderRegistry'\nexport {\n defineControlComponentBindings,\n defineControls,\n getDefaultControlView,\n getControlDefaults,\n useControlSchema,\n useControlWorkspace,\n type ControlFormSchema,\n type ControlFormBinding,\n type ControlSettingsBinding,\n type ControlSidebarBinding,\n type ControlTopBarSettingsBinding,\n type ControlValues,\n type UseControlSchemaReturn,\n type ControlWorkspaceAppTopBarPillBinding,\n type ControlWorkspaceComponentBindings,\n type ControlWorkspaceFormBinding,\n type ControlWorkspacePillNavBinding,\n type ControlWorkspaceSidebarBinding,\n type ControlWorkspaceTopBarBinding,\n type ControlWorkspaceTopBarSettingsBinding,\n type UseControlWorkspaceReturn,\n} from './composables/useControlSchema'\nexport {\n resolveCurrentPluginId,\n} from './composables/platformContextHelpers'\nexport {\n resolveJobCapabilities,\n normalizeJobPercent,\n normalizeJobState,\n isActiveJobStatus,\n isTerminalJobStatus,\n jobStatusLabel,\n type JobCapabilityInput,\n type JobCapabilities,\n} from './jobs'\nexport {\n generatedJobFormSchema,\n generatedJobDefaults,\n normalizeGeneratedJobInput,\n} from './generated/schema'\n"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export { default as GeneratedPluginView } from './components/GeneratedPluginView.vue';
2
+ export { default as GeneratedResultRenderer } from './components/GeneratedResultRenderer.vue';
3
+ export { default as GeneratedPlotlyResult } from './components/GeneratedPlotlyResult.vue';
4
+ export { default as ComponentBindingRenderer } from './components/ComponentBindingRenderer.vue';
5
+ /** Modal picker over the read-only server mounts, recording paths rather than copying data. */
6
+ export { default as GeneratedPathInput } from './components/GeneratedPathInput.vue';
7
+ export { default as RuntimeUpdateNotice } from './components/RuntimeUpdateNotice.vue';
8
+ export { useRealtime, type RealtimeEvent, type RealtimeHandler, type UseRealtimeReturn, } from './composables/useRealtime';
9
+ export { usePresence, type PresenceActivity, type PresenceViewer, type UsePresenceReturn, } from './composables/usePresence';
10
+ /** Avatar stack of the other people on a presence topic, with a list of each person and activity. */
11
+ export { default as PresenceAvatars } from './components/PresenceAvatars.vue';
12
+ export type { PresencePerson } from './utils/presenceAvatars';
13
+ export { AuthenticationRequiredError, useApi, type ApiClientOptions, type UseApiReturn, } from './composables/useApi';
14
+ export { buildEndpointUrl, createClient, downloadEndpoint, pluginFormDataFromPayload, resolvePluginBaseUrl, uploadEndpoint, useEventStream, useSettingsEndpoint, type BuildEndpointUrlOptions, type CreateClientOptions, type DownloadEndpointOptions, type EventStreamMessage, type PluginClientRequestOptions, type PluginContract, type PluginContractSettings, type PluginEndpointContract, type PluginEndpointDefinition, type PluginEndpointRequestOptions, type PluginFormDataPayload, type PluginFormDataValue, type PluginHttpMethod, type PluginNavItemContract, type StreamOptions, type UseEventStreamReturn, type UseSettingsEndpointOptions, type UseSettingsEndpointReturn, } from './composables/createClient';
15
+ export { createGeneratedAnalysisTransport, useJobsEndpoint, type GeneratedAnalysisTransport, type PluginJobRequestOptions, type PluginJobWaitOptions, type UseJobsEndpointOptions, type UseJobsEndpointReturn, } from './composables/useJobsEndpoint';
16
+ export { combinePluginJobSources, useJobCenter, type CombinedPluginJobCenterSource, type JobsStatusTrayTab, type PluginJobCenterSource, type UseJobCenterOptions, type UseJobCenterReturn, } from './composables/useJobCenter';
17
+ export { controlsTo, type ControlsTarget } from './composables/controlSchemaAdapters';
18
+ export { controlBindings } from './composables/controlComponentBindings';
19
+ export { useForm, type ValidationRule, type FieldRules, type FieldState, type UseFormReturn, } from './composables/useForm';
20
+ export { useFormBuilder, evaluateCondition, } from './composables/useFormBuilder';
21
+ export { getFieldRegistryEntry, getTypeDefault, type RegistryEntry, } from './composables/formBuilderRegistry';
22
+ export { defineControlComponentBindings, defineControls, getDefaultControlView, getControlDefaults, useControlSchema, useControlWorkspace, type ControlFormSchema, type ControlFormBinding, type ControlSettingsBinding, type ControlSidebarBinding, type ControlTopBarSettingsBinding, type ControlValues, type UseControlSchemaReturn, type ControlWorkspaceAppTopBarPillBinding, type ControlWorkspaceComponentBindings, type ControlWorkspaceFormBinding, type ControlWorkspacePillNavBinding, type ControlWorkspaceSidebarBinding, type ControlWorkspaceTopBarBinding, type ControlWorkspaceTopBarSettingsBinding, type UseControlWorkspaceReturn, } from './composables/useControlSchema';
23
+ export { resolveCurrentPluginId, } from './composables/platformContextHelpers';
24
+ export { resolveJobCapabilities, normalizeJobPercent, normalizeJobState, isActiveJobStatus, isTerminalJobStatus, jobStatusLabel, type JobCapabilityInput, type JobCapabilities, } from './jobs';
25
+ export { generatedJobFormSchema, generatedJobDefaults, normalizeGeneratedJobInput, } from './generated/schema';
@@ -0,0 +1,8 @@
1
+ import { i as AuthenticationRequiredError, o as useApi } from "./experiment-43OJtH7R.js";
2
+ import { c as isTerminalJobStatus, d as normalizeJobState, f as resolveJobCapabilities, l as jobStatusLabel, o as resolveCurrentPluginId, s as isActiveJobStatus, u as normalizeJobPercent } from "./records-BzTcxekG.js";
3
+ import { A as createGeneratedAnalysisTransport, D as GeneratedPathInput_default, _ as getFieldRegistryEntry, j as useJobsEndpoint, v as getTypeDefault } from "./useListReorder-CcbEYxX-.js";
4
+ import { a as GeneratedPlotlyResult_default, c as downloadEndpoint, d as useEventStream, f as useSettingsEndpoint, i as GeneratedResultRenderer_default, l as pluginFormDataFromPayload, m as resolvePluginBaseUrl, o as createClient, p as buildEndpointUrl, u as uploadEndpoint } from "./useRackEditor-BD5NIo5s.js";
5
+ import { a as ComponentBindingRenderer_default, c as generatedJobFormSchema, f as useControlWorkspace, i as RuntimeUpdateNotice_default, l as normalizeGeneratedJobInput, n as PresenceAvatars_default, o as GeneratedPluginView_default, r as usePresence, s as generatedJobDefaults } from "./runtime-D6gVat6r.js";
6
+ import { E as controlsTo, S as controlBindings, b as getControlDefaults, d as useForm, k as getDefaultControlView, l as useFormBuilder, u as evaluateCondition, v as defineControlComponentBindings, x as useControlSchema, y as defineControls } from "./AppSidebar-BmiiPfz9.js";
7
+ import { a as combinePluginJobSources, o as useJobCenter, r as useRealtime } from "./useRealtime-PalKue84.js";
8
+ export { AuthenticationRequiredError, ComponentBindingRenderer_default as ComponentBindingRenderer, GeneratedPathInput_default as GeneratedPathInput, GeneratedPlotlyResult_default as GeneratedPlotlyResult, GeneratedPluginView_default as GeneratedPluginView, GeneratedResultRenderer_default as GeneratedResultRenderer, PresenceAvatars_default as PresenceAvatars, RuntimeUpdateNotice_default as RuntimeUpdateNotice, buildEndpointUrl, combinePluginJobSources, controlBindings, controlsTo, createClient, createGeneratedAnalysisTransport, defineControlComponentBindings, defineControls, downloadEndpoint, evaluateCondition, generatedJobDefaults, generatedJobFormSchema, getControlDefaults, getDefaultControlView, getFieldRegistryEntry, getTypeDefault, isActiveJobStatus, isTerminalJobStatus, jobStatusLabel, normalizeGeneratedJobInput, normalizeJobPercent, normalizeJobState, pluginFormDataFromPayload, resolveCurrentPluginId, resolveJobCapabilities, resolvePluginBaseUrl, uploadEndpoint, useApi, useControlSchema, useControlWorkspace, useEventStream, useForm, useFormBuilder, useJobCenter, useJobsEndpoint, usePresence, useRealtime, useSettingsEndpoint };
@@ -0,0 +1,197 @@
1
+ import { a as __exportAll, n as useFocusTrap, r as useEventListener } from "./BaseModal-DfRIuVoj.js";
2
+ import { A as useRovingFocus, E as useMenuKeyboard, F as useSelectionLimit, P as useListSelection } from "./records-BzTcxekG.js";
3
+ import { G as useSortedItems, W as compareSortValues, i as useReorderAnnouncer, n as reorderList, r as useListReorder, t as REORDER_ANNOUNCER_STYLE } from "./useListReorder-CcbEYxX-.js";
4
+ import { _ as usePluginWorkspace, f as AppTopBar_default, g as AppLayout_default, t as AppSidebar_default } from "./AppSidebar-BmiiPfz9.js";
5
+ import { t as useDebouncedWatch } from "./useDebouncedWatch-BPwyl6eS.js";
6
+ import { t as useExpansionSet } from "./useExpansionSet-CvoNMZJi.js";
7
+ import { computed, createElementBlock, createElementVNode, defineComponent, normalizeClass, onBeforeUnmount, openBlock, shallowRef, toValue, watch } from "vue";
8
+ //#region src/components/LayoutResizeHandle.vue?vue&type=script&setup=true&lang.ts
9
+ var _hoisted_1 = [
10
+ "tabindex",
11
+ "aria-label",
12
+ "aria-orientation",
13
+ "aria-valuemin",
14
+ "aria-valuemax",
15
+ "aria-valuenow",
16
+ "aria-disabled"
17
+ ];
18
+ //#endregion
19
+ //#region src/components/LayoutResizeHandle.vue
20
+ var LayoutResizeHandle_default = /* @__PURE__ */ defineComponent({
21
+ __name: "LayoutResizeHandle",
22
+ props: {
23
+ modelValue: {},
24
+ min: {},
25
+ max: {},
26
+ label: {},
27
+ orientation: {},
28
+ edge: { default: void 0 },
29
+ step: { default: 10 },
30
+ disabled: {
31
+ type: Boolean,
32
+ default: false
33
+ }
34
+ },
35
+ emits: ["update:modelValue", "resize-start"],
36
+ setup(__props, { emit: __emit }) {
37
+ /** Accessible pointer and keyboard handle for resizable workbench panes. */
38
+ const props = __props;
39
+ const emit = __emit;
40
+ function update(value) {
41
+ emit("update:modelValue", Math.min(props.max, Math.max(props.min, value)));
42
+ }
43
+ function handleKeydown(event) {
44
+ if (props.disabled) return;
45
+ const decrement = props.orientation === "vertical" ? "ArrowLeft" : "ArrowUp";
46
+ const increment = props.orientation === "vertical" ? "ArrowRight" : "ArrowDown";
47
+ if (event.key === decrement) update(props.modelValue - props.step);
48
+ else if (event.key === increment) update(props.modelValue + props.step);
49
+ else if (event.key === "Home") update(props.min);
50
+ else if (event.key === "End") update(props.max);
51
+ else return;
52
+ event.preventDefault();
53
+ }
54
+ return (_ctx, _cache) => {
55
+ return openBlock(), createElementBlock("div", {
56
+ role: "separator",
57
+ tabindex: __props.disabled ? -1 : 0,
58
+ class: normalizeClass([
59
+ "mint-layout-resize-handle",
60
+ `mint-layout-resize-handle--${__props.orientation}`,
61
+ __props.edge ? `mint-layout-resize-handle--edge-${__props.edge}` : ""
62
+ ]),
63
+ "aria-label": __props.label,
64
+ "aria-orientation": __props.orientation,
65
+ "aria-valuemin": __props.min,
66
+ "aria-valuemax": __props.max,
67
+ "aria-valuenow": __props.modelValue,
68
+ "aria-disabled": __props.disabled || void 0,
69
+ onPointerdown: _cache[0] || (_cache[0] = ($event) => !__props.disabled && emit("resize-start", $event)),
70
+ onKeydown: handleKeydown
71
+ }, [..._cache[1] || (_cache[1] = [createElementVNode("span", {
72
+ class: "mint-layout-resize-handle__bar",
73
+ "aria-hidden": "true"
74
+ }, null, -1)])], 42, _hoisted_1);
75
+ };
76
+ }
77
+ });
78
+ //#endregion
79
+ //#region src/composables/useManualLayoutResize.ts
80
+ function clamp(value, min, max) {
81
+ return Math.min(max, Math.max(min, value));
82
+ }
83
+ function availablePanelWidth(containerWidth, constraints) {
84
+ return Math.min(constraints.maxWidth, containerWidth - (constraints.mainMinWidth ?? 0) - (constraints.layoutGap ?? 0));
85
+ }
86
+ function resizedLeadingPanelWidth(startWidth, deltaX, containerWidth, constraints) {
87
+ return Math.round(clamp(startWidth + deltaX, constraints.minWidth, Math.max(constraints.minWidth, availablePanelWidth(containerWidth, constraints))));
88
+ }
89
+ function resizedTrailingPanelWidth(startWidth, deltaX, containerWidth, constraints) {
90
+ return resizedLeadingPanelWidth(startWidth, -deltaX, containerWidth, constraints);
91
+ }
92
+ function resizedVerticalSplitPercent(startPercent, deltaY, containerHeight, constraints) {
93
+ if (containerHeight <= 0) return startPercent;
94
+ return Math.round(clamp(startPercent + deltaY / containerHeight * 100, constraints.minPercent, constraints.maxPercent));
95
+ }
96
+ /** Coordinates pointer-driven resizing for one or more layout splitters. */
97
+ function useManualLayoutResize(options) {
98
+ const activeResize = shallowRef(null);
99
+ const isResizing = computed(() => activeResize.value !== null);
100
+ let previousBodyCursor = "";
101
+ let previousBodyUserSelect = "";
102
+ function stopResize() {
103
+ if (!activeResize.value) return;
104
+ activeResize.value = null;
105
+ window.removeEventListener("pointermove", handlePointerMove);
106
+ window.removeEventListener("pointerup", stopResize);
107
+ window.removeEventListener("pointercancel", stopResize);
108
+ if (typeof document !== "undefined") {
109
+ document.body.style.cursor = previousBodyCursor;
110
+ document.body.style.userSelect = previousBodyUserSelect;
111
+ }
112
+ }
113
+ function handlePointerMove(event) {
114
+ const state = activeResize.value;
115
+ if (!state) return;
116
+ options.resolveTarget(state.kind)?.onResize({
117
+ kind: state.kind,
118
+ startValue: state.startValue,
119
+ deltaX: event.clientX - state.startClientX,
120
+ deltaY: event.clientY - state.startClientY,
121
+ containerRect: state.containerRect,
122
+ secondaryRect: state.secondaryRect
123
+ });
124
+ }
125
+ function startResize(kind, event) {
126
+ if (!toValue(options.enabled) || event.button !== 0) return;
127
+ const target = options.resolveTarget(kind);
128
+ const containerRect = target?.getContainerElement()?.getBoundingClientRect();
129
+ if (!target || !containerRect) return;
130
+ event.preventDefault();
131
+ if (event.currentTarget instanceof HTMLElement) event.currentTarget.setPointerCapture(event.pointerId);
132
+ const secondary = target.getSecondaryElement?.() ?? null;
133
+ activeResize.value = {
134
+ kind,
135
+ startClientX: event.clientX,
136
+ startClientY: event.clientY,
137
+ startValue: target.getStartValue(),
138
+ containerRect,
139
+ secondaryRect: secondary?.getBoundingClientRect() ?? null,
140
+ cursor: target.cursor ?? "col-resize"
141
+ };
142
+ if (typeof document !== "undefined") {
143
+ previousBodyCursor = document.body.style.cursor;
144
+ previousBodyUserSelect = document.body.style.userSelect;
145
+ document.body.style.cursor = activeResize.value.cursor;
146
+ document.body.style.userSelect = "none";
147
+ }
148
+ window.addEventListener("pointermove", handlePointerMove);
149
+ window.addEventListener("pointerup", stopResize);
150
+ window.addEventListener("pointercancel", stopResize);
151
+ }
152
+ function isResizingKind(kind) {
153
+ return activeResize.value?.kind === kind;
154
+ }
155
+ watch(() => toValue(options.enabled), (enabled) => {
156
+ if (!enabled) stopResize();
157
+ });
158
+ onBeforeUnmount(stopResize);
159
+ return {
160
+ activeResize,
161
+ isResizing,
162
+ isResizingKind,
163
+ startResize,
164
+ stopResize
165
+ };
166
+ }
167
+ //#endregion
168
+ //#region src/shell.ts
169
+ var shell_exports = /* @__PURE__ */ __exportAll({
170
+ AppLayout: () => AppLayout_default,
171
+ AppSidebar: () => AppSidebar_default,
172
+ AppTopBar: () => AppTopBar_default,
173
+ LayoutResizeHandle: () => LayoutResizeHandle_default,
174
+ REORDER_ANNOUNCER_STYLE: () => REORDER_ANNOUNCER_STYLE,
175
+ compareSortValues: () => compareSortValues,
176
+ reorderList: () => reorderList,
177
+ resizedLeadingPanelWidth: () => resizedLeadingPanelWidth,
178
+ resizedTrailingPanelWidth: () => resizedTrailingPanelWidth,
179
+ resizedVerticalSplitPercent: () => resizedVerticalSplitPercent,
180
+ useDebouncedWatch: () => useDebouncedWatch,
181
+ useEventListener: () => useEventListener,
182
+ useExpansionSet: () => useExpansionSet,
183
+ useFocusTrap: () => useFocusTrap,
184
+ useListReorder: () => useListReorder,
185
+ useListSelection: () => useListSelection,
186
+ useManualLayoutResize: () => useManualLayoutResize,
187
+ useMenuKeyboard: () => useMenuKeyboard,
188
+ usePluginWorkspace: () => usePluginWorkspace,
189
+ useReorderAnnouncer: () => useReorderAnnouncer,
190
+ useRovingFocus: () => useRovingFocus,
191
+ useSelectionLimit: () => useSelectionLimit,
192
+ useSortedItems: () => useSortedItems
193
+ });
194
+ //#endregion
195
+ export { useManualLayoutResize as a, resizedVerticalSplitPercent as i, resizedLeadingPanelWidth as n, LayoutResizeHandle_default as o, resizedTrailingPanelWidth as r, shell_exports as t };
196
+
197
+ //# sourceMappingURL=shell-5ju97nOS.js.map