@morscherlab/mint-sdk 1.5.0-beta.1 → 1.5.0-beta.10

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 (174) hide show
  1. package/dist/{AlertBox-CIhqsWbN.js → AlertBox-Cai0w7gF.js} +3 -3
  2. package/dist/{AlertBox-CIhqsWbN.js.map → AlertBox-Cai0w7gF.js.map} +1 -1
  3. package/dist/{AppSidebar-BDrd7Kwn.js → AppSidebar-C-Vq5x4I.js} +410 -127
  4. package/dist/AppSidebar-C-Vq5x4I.js.map +1 -0
  5. package/dist/{ConfirmDialog-CjWoxAD1.js → ConfirmDialog-BjFsOpBe.js} +3 -3
  6. package/dist/ConfirmDialog-BjFsOpBe.js.map +1 -0
  7. package/dist/{ExperimentPopover-BM92LlrQ.js → ExperimentPopover-DYy_s0kI.js} +25 -37
  8. package/dist/ExperimentPopover-DYy_s0kI.js.map +1 -0
  9. package/dist/{ExperimentSelectorModal-LsB1ABmh.js → ExperimentSelectorModal-Bfh5bdkv.js} +37 -8
  10. package/dist/ExperimentSelectorModal-Bfh5bdkv.js.map +1 -0
  11. package/dist/{SegmentedControl-Dz41vAFM.js → SegmentedControl-B8KgyOjd.js} +2 -2
  12. package/dist/{SegmentedControl-Dz41vAFM.js.map → SegmentedControl-B8KgyOjd.js.map} +1 -1
  13. package/dist/{SettingsModal-C-MSR-bk.js → SettingsModal-DwfrD1ER.js} +7 -7
  14. package/dist/{SettingsModal-C-MSR-bk.js.map → SettingsModal-DwfrD1ER.js.map} +1 -1
  15. package/dist/__tests__/components/AppTopBarCompact.test.d.ts +1 -0
  16. package/dist/__tests__/components/AppTopBarCompactReset.test.d.ts +1 -0
  17. package/dist/__tests__/components/AutoGroupModal.experimentLoad.test.d.ts +1 -0
  18. package/dist/components/AppTopBar.compact.d.ts +5 -0
  19. package/dist/components/AppTopBar.vue.d.ts +17 -17
  20. package/dist/components/FormBuilder.vue.d.ts +1 -1
  21. package/dist/components/PluginIcon.vue.d.ts +2 -2
  22. package/dist/components/PluginWorkspaceView.vue.d.ts +4 -0
  23. package/dist/components/SectionCard.vue.d.ts +13 -1
  24. package/dist/components/SettingsModal.vue.d.ts +1 -1
  25. package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +2 -2
  26. package/dist/components/internal/FormSchemaInternal.vue.d.ts +9 -9
  27. package/dist/components/internal/FormSectionRenderer.vue.d.ts +4 -4
  28. package/dist/components/internal/LucideIconInternal.vue.d.ts +17 -0
  29. package/dist/composables/appLayoutSidebar.d.ts +9 -0
  30. package/dist/composables/useExperimentSelector.d.ts +2 -0
  31. package/dist/composables/useOnboarding.d.ts +1 -1
  32. package/dist/composables/usePluginWorkspace.d.ts +2 -0
  33. package/dist/composables/useVersionedSave.d.ts +5 -2
  34. package/dist/{controlSchemaModel-BbXbMgc6.js → controlSchemaModel-BtFNZj8t.js} +2 -2
  35. package/dist/{controlSchemaModel-BbXbMgc6.js.map → controlSchemaModel-BtFNZj8t.js.map} +1 -1
  36. package/dist/{data-LzdkEZJ-.js → data-CJztFns8.js} +31 -15
  37. package/dist/{data-LzdkEZJ-.js.map → data-CJztFns8.js.map} +1 -1
  38. package/dist/data.js +8 -8
  39. package/dist/{experimentStatus-DCn2QKG7.js → experimentStatus-Deokk7Br.js} +2 -2
  40. package/dist/{experimentStatus-DCn2QKG7.js.map → experimentStatus-Deokk7Br.js.map} +1 -1
  41. package/dist/index.d.ts +0 -1
  42. package/dist/index.js +15 -20
  43. package/dist/index.js.map +1 -1
  44. package/dist/{install-UTqrAgHe.js → install-Bk02tJ5M.js} +15 -40
  45. package/dist/install-Bk02tJ5M.js.map +1 -0
  46. package/dist/install.js +1 -1
  47. package/dist/{lab-CbdDLAVr.js → lab-BYhb_cJI.js} +47 -117
  48. package/dist/lab-BYhb_cJI.js.map +1 -0
  49. package/dist/lab.js +4 -4
  50. package/dist/{records-CWRztE5M.js → records-GtiVMlTQ.js} +207 -171
  51. package/dist/records-GtiVMlTQ.js.map +1 -0
  52. package/dist/{runtime-DrL6lKAb.js → runtime-aZPUPxoB.js} +112 -54
  53. package/dist/runtime-aZPUPxoB.js.map +1 -0
  54. package/dist/runtime.js +6 -6
  55. package/dist/{shell-Ch7cJnjo.js → shell-Bk9mD4Lc.js} +5 -5
  56. package/dist/{shell-Ch7cJnjo.js.map → shell-Bk9mD4Lc.js.map} +1 -1
  57. package/dist/shell.js +5 -5
  58. package/dist/styles.css +315 -134
  59. package/dist/styles.d.ts +1 -0
  60. package/dist/types/components.d.ts +22 -2
  61. package/dist/types/generated-ui.d.ts +2 -0
  62. package/dist/types/index.d.ts +2 -2
  63. package/dist/types/instrument.d.ts +5 -17
  64. package/dist/{useDropdownState-uFIz6Yv8.js → useDropdownState-CcBzUYZ6.js} +14 -5
  65. package/dist/useDropdownState-CcBzUYZ6.js.map +1 -0
  66. package/dist/{useExperimentSamples-Cz2v3V_q.js → useExperimentSamples-CpNXvpUn.js} +3 -3
  67. package/dist/{useExperimentSamples-Cz2v3V_q.js.map → useExperimentSamples-CpNXvpUn.js.map} +1 -1
  68. package/dist/{useListReorder-QqJc1dpX.js → useListReorder-Bp4EAI2w.js} +16 -4
  69. package/dist/useListReorder-Bp4EAI2w.js.map +1 -0
  70. package/dist/{useRackEditor-BHGM1Ngz.js → useRackEditor-i2bdPUFf.js} +156 -27
  71. package/dist/useRackEditor-i2bdPUFf.js.map +1 -0
  72. package/dist/{useRealtime-CNQbrS01.js → useRealtime-BLQEjbuq.js} +3 -3
  73. package/dist/{useRealtime-CNQbrS01.js.map → useRealtime-BLQEjbuq.js.map} +1 -1
  74. package/dist/useRequest-CXyPw3eh.js +76 -0
  75. package/dist/useRequest-CXyPw3eh.js.map +1 -0
  76. package/dist/utils/deprecation.d.ts +2 -0
  77. package/dist/utils/lucideIcon.d.ts +4 -0
  78. package/package.json +7 -4
  79. package/src/__tests__/components/AppTopBar.test.ts +102 -20
  80. package/src/__tests__/components/AppTopBarCompact.test.ts +65 -0
  81. package/src/__tests__/components/AppTopBarCompactReset.test.ts +24 -0
  82. package/src/__tests__/components/AppTopBarOnboarding.test.ts +10 -0
  83. package/src/__tests__/components/AutoGroupModal.experimentLoad.test.ts +58 -0
  84. package/src/__tests__/components/BaseModal.test.ts +33 -2
  85. package/src/__tests__/components/ConfirmDialog.test.ts +2 -2
  86. package/src/__tests__/components/ExperimentPopover.test.ts +32 -0
  87. package/src/__tests__/components/ExperimentSelectorModal.test.ts +16 -0
  88. package/src/__tests__/components/PluginWorkspaceView.test.ts +20 -1
  89. package/src/__tests__/components/SectionCard.test.ts +33 -0
  90. package/src/__tests__/components/deprecationTags.test.ts +4 -18
  91. package/src/__tests__/composables/useJobCenter.test.ts +35 -0
  92. package/src/__tests__/composables/useJobsEndpoint.test.ts +50 -0
  93. package/src/__tests__/composables/useOnboarding.test.ts +2 -2
  94. package/src/__tests__/composables/useVersionedSave.test.ts +71 -6
  95. package/src/__tests__/docs/frontendDocsCatalog.test.ts +3 -3
  96. package/src/__tests__/styles/menusShellRefresh.test.ts +10 -0
  97. package/src/components/AppLayout.story.vue +5 -5
  98. package/src/components/AppLayout.vue +13 -1
  99. package/src/components/AppSidebar.vue +2 -2
  100. package/src/components/AppTopBar.compact.ts +60 -0
  101. package/src/components/AppTopBar.story.vue +39 -14
  102. package/src/components/AppTopBar.vue +222 -89
  103. package/src/components/BaseModal.vue +16 -5
  104. package/src/components/CollapsibleCard.vue +1 -1
  105. package/src/components/ConfirmDialog.vue +1 -1
  106. package/src/components/ExperimentPopover.story.vue +2 -2
  107. package/src/components/ExperimentPopover.vue +6 -22
  108. package/src/components/ExperimentSelectorModal.vue +35 -0
  109. package/src/components/FileUploader.vue +3 -35
  110. package/src/components/GeneratedPluginView.vue +34 -81
  111. package/src/components/GeneratedResultRenderer.vue +2 -1
  112. package/src/components/InstrumentStatusPanels.vue +3 -3
  113. package/src/components/PlotlyChart.vue +1 -1
  114. package/src/components/PluginIcon.story.vue +2 -2
  115. package/src/components/PluginIcon.vue +2 -2
  116. package/src/components/PluginWorkspaceView.vue +10 -1
  117. package/src/components/SectionCard.vue +42 -6
  118. package/src/components/internal/AppTopBarOnboardingInternal.vue +30 -14
  119. package/src/components/internal/AppTopBarPageSelectorInternal.vue +12 -0
  120. package/src/components/internal/AutoGroupModalInternal.vue +14 -3
  121. package/src/components/internal/LucideIconInternal.vue +23 -0
  122. package/src/composables/appLayoutSidebar.ts +11 -0
  123. package/src/composables/index.ts +1 -2
  124. package/src/composables/useExperimentSelector.ts +4 -0
  125. package/src/composables/useJobCenter.ts +21 -1
  126. package/src/composables/useJobsEndpoint.ts +15 -4
  127. package/src/composables/useOnboarding.ts +3 -3
  128. package/src/composables/usePluginWorkspace.ts +15 -4
  129. package/src/composables/useVersionedSave.ts +32 -7
  130. package/src/generated-ui/main.ts +3 -1
  131. package/src/index.ts +0 -3
  132. package/src/styles/components/alert-box.css +1 -1
  133. package/src/styles/components/app-layout.css +5 -0
  134. package/src/styles/components/app-sidebar.css +5 -5
  135. package/src/styles/components/app-top-bar.css +130 -9
  136. package/src/styles/components/button.css +3 -3
  137. package/src/styles/components/checkbox.css +1 -1
  138. package/src/styles/components/collapsible-card.css +1 -1
  139. package/src/styles/components/confirm-dialog.css +2 -2
  140. package/src/styles/components/file-uploader.css +3 -3
  141. package/src/styles/components/icon-button.css +3 -3
  142. package/src/styles/components/loading-spinner.css +1 -1
  143. package/src/styles/components/onboarding.css +39 -0
  144. package/src/styles/components/pill.css +1 -1
  145. package/src/styles/components/plugin-icon.css +2 -2
  146. package/src/styles/components/presence-avatars.css +4 -4
  147. package/src/styles/components/progress-bar.css +1 -1
  148. package/src/styles/components/section-card.css +65 -6
  149. package/src/styles/components/sequence-input.css +1 -1
  150. package/src/styles/components/slider.css +1 -1
  151. package/src/styles/components/toggle.css +1 -1
  152. package/src/styles/variables.css +10 -4
  153. package/src/types/components.ts +23 -2
  154. package/src/types/generated-ui.ts +2 -0
  155. package/src/types/index.ts +1 -1
  156. package/src/types/instrument.ts +5 -18
  157. package/src/utils/deprecation.ts +8 -0
  158. package/src/utils/lucideIcon.ts +25 -0
  159. package/src/utils/lucideIconIndex.d.ts +2 -0
  160. package/dist/AppSidebar-BDrd7Kwn.js.map +0 -1
  161. package/dist/ConfirmDialog-CjWoxAD1.js.map +0 -1
  162. package/dist/ExperimentPopover-BM92LlrQ.js.map +0 -1
  163. package/dist/ExperimentSelectorModal-LsB1ABmh.js.map +0 -1
  164. package/dist/deprecatedRootExports.d.ts +0 -191
  165. package/dist/install-UTqrAgHe.js.map +0 -1
  166. package/dist/lab-CbdDLAVr.js.map +0 -1
  167. package/dist/records-CWRztE5M.js.map +0 -1
  168. package/dist/runtime-DrL6lKAb.js.map +0 -1
  169. package/dist/useDropdownState-uFIz6Yv8.js.map +0 -1
  170. package/dist/useListReorder-QqJc1dpX.js.map +0 -1
  171. package/dist/useRackEditor-BHGM1Ngz.js.map +0 -1
  172. package/dist/useRequest-Bfsh7gIm.js +0 -215
  173. package/dist/useRequest-Bfsh7gIm.js.map +0 -1
  174. package/src/deprecatedRootExports.ts +0 -226
@@ -1,12 +1,12 @@
1
- import { i as useEventListener, o as __exportAll, t as useDropdownState } from "./useDropdownState-uFIz6Yv8.js";
1
+ import { i as useEventListener, o as __exportAll, t as useDropdownState } from "./useDropdownState-CcBzUYZ6.js";
2
2
  import { i as AuthenticationRequiredError, o as useApi } from "./experiment-DyO54FQB.js";
3
- import { L as EmptyState_default, d as isActiveJobStatus, f as isTerminalJobStatus, g as resolveJobCapabilities, h as normalizeJobState, m as normalizeJobPercent, o as resolveCurrentPluginId, p as jobStatusLabel, t as isRecord, v as useAppExperiment } from "./records-CWRztE5M.js";
4
- import { A as useJobsEndpoint, D as _plugin_vue_export_helper_default, E as GeneratedPathInput_default, M as usePlatform, O as GENERATED_JOBS_API_KEY, R as definePluginWorkspaceView, _ as getTypeDefault, g as getFieldRegistryEntry, h as replaceRecord, k as createGeneratedAnalysisTransport } from "./useListReorder-QqJc1dpX.js";
5
- import { r as LoadingSpinner_default, t as AlertBox_default } from "./AlertBox-CIhqsWbN.js";
6
- import { D as DataFrame_default, T as WellPlate_default, a as GeneratedPlotlyResult_default, b as PlateEditor_default, c as downloadEndpoint, d as useEventStream, f as useSettingsEndpoint, i as GeneratedResultRenderer_default, l as pluginFormDataFromPayload, m as resolvePluginBaseUrl, n as ScheduleCalendar_default, o as createClient, p as buildEndpointUrl, t as useRackEditor, u as uploadEndpoint, v as DoseCalculator_default } from "./useRackEditor-BHGM1Ngz.js";
7
- import { A as controlValuesToComponentBindingsById, C as usePluginWorkspace, D as useControlSchema, E as getControlDefaults, F as getDefaultControlView, M as controlsTo, O as controlBindings, S as AppLayout_default, T as defineControls, d as useForm, f as AppTopBar_default, j as controlValuesToComponentProps, k as controlValuesToComponentBindings, l as useFormBuilder, p as providePluginIdentity, t as AppSidebar_default, u as evaluateCondition, w as defineControlComponentBindings } from "./AppSidebar-BDrd7Kwn.js";
8
- import { n as isControlModelBinding } from "./controlSchemaModel-BbXbMgc6.js";
9
- import { i as JobsStatusTray_default, n as subscribeRealtime, r as useRealtime, t as currentPresence } from "./useRealtime-CNQbrS01.js";
3
+ import { R as EmptyState_default, d as isActiveJobStatus, f as isTerminalJobStatus, g as resolveJobCapabilities, h as normalizeJobState, m as normalizeJobPercent, o as resolveCurrentPluginId, p as jobStatusLabel, t as isRecord, v as useAppExperiment } from "./records-GtiVMlTQ.js";
4
+ import { A as useJobsEndpoint, D as _plugin_vue_export_helper_default, E as GeneratedPathInput_default, M as usePlatform, O as GENERATED_JOBS_API_KEY, R as definePluginWorkspaceView, _ as getTypeDefault, g as getFieldRegistryEntry, h as replaceRecord, k as createGeneratedAnalysisTransport } from "./useListReorder-Bp4EAI2w.js";
5
+ import { r as LoadingSpinner_default, t as AlertBox_default } from "./AlertBox-Cai0w7gF.js";
6
+ import { D as SectionCard_default, O as DataFrame_default, T as WellPlate_default, a as GeneratedPlotlyResult_default, b as PlateEditor_default, c as downloadEndpoint, d as useEventStream, f as useSettingsEndpoint, i as GeneratedResultRenderer_default, l as pluginFormDataFromPayload, m as resolvePluginBaseUrl, n as ScheduleCalendar_default, o as createClient, p as buildEndpointUrl, t as useRackEditor, u as uploadEndpoint, v as DoseCalculator_default } from "./useRackEditor-i2bdPUFf.js";
7
+ import { A as controlValuesToComponentBindings, C as warnDeprecatedOnce, D as getControlDefaults, E as defineControls, I as getDefaultControlView, M as controlValuesToComponentProps, N as controlsTo, O as useControlSchema, S as AppLayout_default, T as defineControlComponentBindings, d as useForm, f as AppTopBar_default, j as controlValuesToComponentBindingsById, k as controlBindings, l as useFormBuilder, p as providePluginIdentity, t as AppSidebar_default, u as evaluateCondition, w as usePluginWorkspace } from "./AppSidebar-C-Vq5x4I.js";
8
+ import { n as isControlModelBinding } from "./controlSchemaModel-BtFNZj8t.js";
9
+ import { i as JobsStatusTray_default, n as subscribeRealtime, r as useRealtime, t as currentPresence } from "./useRealtime-BLQEjbuq.js";
10
10
  import { Fragment, Teleport, TransitionGroup, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createTextVNode, createVNode, defineComponent, getCurrentScope, guardReactiveProps, mergeProps, normalizeClass, normalizeProps, normalizeStyle, onMounted, onScopeDispose, onUnmounted, openBlock, provide, reactive, readonly, ref, renderList, renderSlot, resolveDynamicComponent, shallowRef, toDisplayString, toHandlers, toValue, unref, useId, useSlots, useTemplateRef, watch, withCtx, withModifiers } from "vue";
11
11
  import { ChartColumn, Eye, FlaskConical, Pencil, RefreshCw } from "lucide-vue-next";
12
12
  //#region src/composables/useToast.ts
@@ -81,7 +81,7 @@ var _hoisted_3$4 = {
81
81
  "stroke-linejoin": "round",
82
82
  "aria-hidden": "true"
83
83
  };
84
- var _hoisted_4$4 = {
84
+ var _hoisted_4$3 = {
85
85
  key: 1,
86
86
  class: "mint-toast__icon",
87
87
  viewBox: "0 0 24 24",
@@ -92,7 +92,7 @@ var _hoisted_4$4 = {
92
92
  "stroke-linejoin": "round",
93
93
  "aria-hidden": "true"
94
94
  };
95
- var _hoisted_5$3 = {
95
+ var _hoisted_5$2 = {
96
96
  key: 2,
97
97
  class: "mint-toast__icon",
98
98
  viewBox: "0 0 24 24",
@@ -103,7 +103,7 @@ var _hoisted_5$3 = {
103
103
  "stroke-linejoin": "round",
104
104
  "aria-hidden": "true"
105
105
  };
106
- var _hoisted_6$3 = {
106
+ var _hoisted_6$2 = {
107
107
  key: 3,
108
108
  class: "mint-toast__icon",
109
109
  viewBox: "0 0 24 24",
@@ -172,7 +172,7 @@ var AppToastContainer_default = /* @__PURE__ */ defineComponent({
172
172
  cx: "12",
173
173
  cy: "12",
174
174
  r: "10"
175
- }, null, -1), createElementVNode("path", { d: "m9 12 2 2 4-4" }, null, -1)])])) : toast.type === "error" ? (openBlock(), createElementBlock("svg", _hoisted_4$4, [..._cache[1] || (_cache[1] = [
175
+ }, null, -1), createElementVNode("path", { d: "m9 12 2 2 4-4" }, null, -1)])])) : toast.type === "error" ? (openBlock(), createElementBlock("svg", _hoisted_4$3, [..._cache[1] || (_cache[1] = [
176
176
  createElementVNode("circle", {
177
177
  cx: "12",
178
178
  cy: "12",
@@ -180,11 +180,11 @@ var AppToastContainer_default = /* @__PURE__ */ defineComponent({
180
180
  }, null, -1),
181
181
  createElementVNode("path", { d: "m15 9-6 6" }, null, -1),
182
182
  createElementVNode("path", { d: "m9 9 6 6" }, null, -1)
183
- ])])) : toast.type === "warning" ? (openBlock(), createElementBlock("svg", _hoisted_5$3, [..._cache[2] || (_cache[2] = [
183
+ ])])) : toast.type === "warning" ? (openBlock(), createElementBlock("svg", _hoisted_5$2, [..._cache[2] || (_cache[2] = [
184
184
  createElementVNode("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" }, null, -1),
185
185
  createElementVNode("path", { d: "M12 9v4" }, null, -1),
186
186
  createElementVNode("path", { d: "M12 17h.01" }, null, -1)
187
- ])])) : (openBlock(), createElementBlock("svg", _hoisted_6$3, [..._cache[3] || (_cache[3] = [
187
+ ])])) : (openBlock(), createElementBlock("svg", _hoisted_6$2, [..._cache[3] || (_cache[3] = [
188
188
  createElementVNode("circle", {
189
189
  cx: "12",
190
190
  cy: "12",
@@ -369,6 +369,11 @@ function useJobCenter(options = {}) {
369
369
  watch([source, ownActiveJobs], ([currentSource, now], [previousSource, before]) => {
370
370
  if (currentSource !== previousSource) {
371
371
  justFinished.value = null;
372
+ if (previousSource) {
373
+ hasBaseline = false;
374
+ awaitingLoad = false;
375
+ if (jobs.value.length > 0) takeBaseline();
376
+ }
372
377
  return;
373
378
  }
374
379
  const nowIds = new Set(now.map((job) => job.job_id));
@@ -462,19 +467,31 @@ function useJobCenter(options = {}) {
462
467
  if (active && generation === requestGeneration) isLoading.value = false;
463
468
  }
464
469
  }
470
+ const cancelling = /* @__PURE__ */ new Map();
471
+ watch(jobs, (list) => {
472
+ for (const [jobId, status] of cancelling) {
473
+ if (list.find((job) => job.job_id === jobId)?.status === status) continue;
474
+ cancelling.delete(jobId);
475
+ setPending(jobId, false);
476
+ }
477
+ });
465
478
  async function cancelJob(job) {
466
479
  const sourceCancel = source.value?.cancel;
467
480
  if (!job.can_cancel || !sourceCancel || pendingJobIds.value.has(job.job_id)) return false;
468
481
  setPending(job.job_id, true);
469
482
  error.value = null;
483
+ let cancelled = false;
470
484
  try {
471
485
  await sourceCancel(job.job_id);
486
+ cancelled = true;
472
487
  return active;
473
488
  } catch (cause) {
474
489
  if (active) error.value = errorMessage(cause, "Failed to cancel job");
475
490
  return false;
476
491
  } finally {
477
- if (active) setPending(job.job_id, false);
492
+ const status = jobs.value.find((listed) => listed.job_id === job.job_id)?.status;
493
+ if (cancelled && status === job.status) cancelling.set(job.job_id, status);
494
+ else if (active) setPending(job.job_id, false);
478
495
  }
479
496
  }
480
497
  async function deleteJob(job) {
@@ -917,6 +934,7 @@ var PluginWorkspaceView_default = /* @__PURE__ */ defineComponent({
917
934
  const props = __props;
918
935
  const emit = __emit;
919
936
  const slots = useSlots();
937
+ if (slots.topbar) warnDeprecatedOnce("workspace.slot.topbar", "PluginWorkspaceView #topbar is deprecated: configure spec.topBar and give pages icons. It is removed in 2.0.");
920
938
  if (props.spec.experiment) {
921
939
  const save = props.spec.save;
922
940
  useAppExperiment({
@@ -932,7 +950,7 @@ var PluginWorkspaceView_default = /* @__PURE__ */ defineComponent({
932
950
  function handleJobSelect(job) {
933
951
  emit("job-select", job);
934
952
  }
935
- const { shell, sidebar, controls, handleControlValuesUpdate, handlePillSelect } = usePluginWorkspace({
953
+ const { shell, sidebar, controls, handleControlValuesUpdate, handlePillSelect, handleSidebarCollapsedUpdate } = usePluginWorkspace({
936
954
  props,
937
955
  slots,
938
956
  emit
@@ -953,10 +971,10 @@ var PluginWorkspaceView_default = /* @__PURE__ */ defineComponent({
953
971
  "jobs-done": unref(jobCenter)?.completedCount.value,
954
972
  "jobs-open": unref(jobCenter)?.isOpen.value,
955
973
  "jobs-panel-id": unref(jobCenter)?.panelId,
956
- onJobClick: _cache[2] || (_cache[2] = ($event) => unref(jobCenter)?.handleTopBarClick(handleJobSelect)),
974
+ onJobClick: _cache[1] || (_cache[1] = ($event) => unref(jobCenter)?.handleTopBarClick(handleJobSelect)),
957
975
  onPillSelect: unref(handlePillSelect),
958
- onPillOptionSelect: _cache[3] || (_cache[3] = (option, item) => emit("pill-option-select", option, item)),
959
- onSettingsValuesChange: _cache[4] || (_cache[4] = ($event) => emit("settings-values-change", $event))
976
+ onPillOptionSelect: _cache[2] || (_cache[2] = (option, item) => emit("pill-option-select", option, item)),
977
+ onSettingsValuesChange: _cache[3] || (_cache[3] = ($event) => emit("settings-values-change", $event))
960
978
  }, createSlots({
961
979
  default: withCtx(() => [
962
980
  createVNode(WorkspaceControlsInternal_default, { controls: unref(controls) }, {
@@ -988,9 +1006,9 @@ var PluginWorkspaceView_default = /* @__PURE__ */ defineComponent({
988
1006
  fn: withCtx((scope) => [renderSlot(_ctx.$slots, "sidebar", normalizeProps(guardReactiveProps(scope)), () => [createVNode(WorkspaceSidebarInternal_default, {
989
1007
  sidebar: unref(sidebar),
990
1008
  "onUpdate:values": unref(handleControlValuesUpdate),
991
- "onUpdate:collapsed": _cache[0] || (_cache[0] = ($event) => emit("update:sidebarCollapsed", $event)),
1009
+ "onUpdate:collapsed": unref(handleSidebarCollapsedUpdate),
992
1010
  "onUpdate:toggle": handleToggle,
993
- onSectionAction: _cache[1] || (_cache[1] = (sectionId, actionId) => emit("section-action", sectionId, actionId)),
1011
+ onSectionAction: _cache[0] || (_cache[0] = (sectionId, actionId) => emit("section-action", sectionId, actionId)),
994
1012
  onFormSubmit: handleFormSubmit,
995
1013
  onFormCancel: handleFormCancel
996
1014
  }, createSlots({ _: 2 }, [renderList(unref(sidebar).slotNames, (slotName) => {
@@ -998,7 +1016,11 @@ var PluginWorkspaceView_default = /* @__PURE__ */ defineComponent({
998
1016
  name: slotName,
999
1017
  fn: withCtx((slotProps) => [renderSlot(_ctx.$slots, slotName, normalizeProps(guardReactiveProps(slotProps ?? {})))])
1000
1018
  };
1001
- })]), 1032, ["sidebar", "onUpdate:values"])])]),
1019
+ })]), 1032, [
1020
+ "sidebar",
1021
+ "onUpdate:values",
1022
+ "onUpdate:collapsed"
1023
+ ])])]),
1002
1024
  key: "1"
1003
1025
  } : void 0
1004
1026
  ]), 1032, [
@@ -1013,6 +1035,30 @@ var PluginWorkspaceView_default = /* @__PURE__ */ defineComponent({
1013
1035
  }
1014
1036
  });
1015
1037
  //#endregion
1038
+ //#region src/components/AppContainer.vue
1039
+ var AppContainer_default = /* @__PURE__ */ defineComponent({
1040
+ __name: "AppContainer",
1041
+ props: {
1042
+ scrollable: {
1043
+ type: Boolean,
1044
+ default: false
1045
+ },
1046
+ direction: {},
1047
+ gap: { default: "1rem" }
1048
+ },
1049
+ setup(__props) {
1050
+ /** Content card with optional scroll lock, or a transparent flex layout shell with configurable direction and gap. */
1051
+ const props = __props;
1052
+ const isLayout = computed(() => !!props.direction);
1053
+ return (_ctx, _cache) => {
1054
+ return openBlock(), createElementBlock("div", {
1055
+ class: normalizeClass(["mint-container", isLayout.value ? ["mint-container--layout", __props.direction === "row" ? "mint-container--row" : "mint-container--column"] : ["mint-container--card", __props.scrollable ? "mint-container--scrollable" : ""]]),
1056
+ style: normalizeStyle(isLayout.value ? { gap: __props.gap } : void 0)
1057
+ }, [renderSlot(_ctx.$slots, "default")], 6);
1058
+ };
1059
+ }
1060
+ });
1061
+ //#endregion
1016
1062
  //#region src/components/Avatar.vue?vue&type=script&setup=true&lang.ts
1017
1063
  var _hoisted_1$4 = ["aria-label"];
1018
1064
  var _hoisted_2$3 = ["src", "alt"];
@@ -1020,7 +1066,7 @@ var _hoisted_3$3 = {
1020
1066
  key: 1,
1021
1067
  class: "mint-avatar__initials"
1022
1068
  };
1023
- var _hoisted_4$3 = {
1069
+ var _hoisted_4$2 = {
1024
1070
  key: 2,
1025
1071
  class: "mint-avatar__fallback",
1026
1072
  viewBox: "0 0 24 24",
@@ -1061,7 +1107,7 @@ var Avatar_default = /* @__PURE__ */ defineComponent({
1061
1107
  src: __props.src,
1062
1108
  alt: __props.alt || __props.name || "",
1063
1109
  class: "mint-avatar__image"
1064
- }, null, 8, _hoisted_2$3)) : computedInitials.value ? (openBlock(), createElementBlock("span", _hoisted_3$3, toDisplayString(computedInitials.value), 1)) : (openBlock(), createElementBlock("svg", _hoisted_4$3, [..._cache[0] || (_cache[0] = [createElementVNode("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" }, null, -1)])]))], 4), __props.status ? (openBlock(), createElementBlock("span", {
1110
+ }, null, 8, _hoisted_2$3)) : computedInitials.value ? (openBlock(), createElementBlock("span", _hoisted_3$3, toDisplayString(computedInitials.value), 1)) : (openBlock(), createElementBlock("svg", _hoisted_4$2, [..._cache[0] || (_cache[0] = [createElementVNode("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" }, null, -1)])]))], 4), __props.status ? (openBlock(), createElementBlock("span", {
1065
1111
  key: 0,
1066
1112
  class: normalizeClass(["mint-avatar__status", `mint-avatar__status--${__props.status}`]),
1067
1113
  "aria-hidden": "true"
@@ -1195,21 +1241,18 @@ function humanize(value) {
1195
1241
  }
1196
1242
  //#endregion
1197
1243
  //#region src/components/GeneratedPluginView.vue?vue&type=script&setup=true&lang.ts
1198
- var _hoisted_1$3 = { class: "mint-generated-workspace" };
1199
- var _hoisted_2$2 = {
1244
+ var _hoisted_1$3 = {
1200
1245
  key: 0,
1201
1246
  class: "mint-generated-workspace__loading"
1202
1247
  };
1203
- var _hoisted_3$2 = {
1204
- key: 1,
1205
- class: "mint-generated-workspace__header"
1206
- };
1207
- var _hoisted_4$2 = { key: 0 };
1208
- var _hoisted_5$2 = {
1248
+ var _hoisted_2$2 = {
1209
1249
  class: "mint-generated-workspace__resources",
1210
1250
  "aria-label": "Job resource requirements"
1211
1251
  };
1212
- var _hoisted_6$2 = { class: "mint-generated-workspace__result" };
1252
+ var _hoisted_3$2 = {
1253
+ key: 0,
1254
+ class: "mint-generated-workspace__description"
1255
+ };
1213
1256
  //#endregion
1214
1257
  //#region src/components/GeneratedPluginView.vue
1215
1258
  var GeneratedPluginView_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -1243,6 +1286,7 @@ var GeneratedPluginView_default = /*#__PURE__*/ _plugin_vue_export_helper_defaul
1243
1286
  });
1244
1287
  const activeDefinitionId = ref("");
1245
1288
  const selectedJobId = ref("");
1289
+ const sidebarCollapsed = ref(false);
1246
1290
  const valuesByDefinition = reactive({});
1247
1291
  const definitions = computed(() => generated.manifest.value?.jobs ?? []);
1248
1292
  const activeDefinition = computed(() => definitions.value.find((definition) => definition.id === activeDefinitionId.value) ?? null);
@@ -1261,13 +1305,18 @@ var GeneratedPluginView_default = /*#__PURE__*/ _plugin_vue_export_helper_defaul
1261
1305
  title: generated.manifest.value?.ui.title ?? "Analysis",
1262
1306
  subtitle: generated.manifest.value?.ui.subtitle || generated.manifest.value?.ui.description,
1263
1307
  toasts: false,
1308
+ floating: true,
1264
1309
  topBar: {
1310
+ variant: "card",
1265
1311
  pills: pillNav.value,
1266
1312
  settings: false,
1267
1313
  standaloneLabel: props.showStandaloneLabel ? "Standalone" : false
1268
1314
  },
1269
1315
  sidebar: {
1270
1316
  title: "Parameters",
1317
+ width: "300px",
1318
+ collapsible: true,
1319
+ collapsedWidth: "3rem",
1271
1320
  panels: panels.value,
1272
1321
  forms: forms.value
1273
1322
  },
@@ -1321,6 +1370,8 @@ var GeneratedPluginView_default = /*#__PURE__*/ _plugin_vue_export_helper_defaul
1321
1370
  return openBlock(), createBlock(PluginWorkspaceView_default, {
1322
1371
  view: activeDefinitionId.value,
1323
1372
  "onUpdate:view": _cache[0] || (_cache[0] = ($event) => activeDefinitionId.value = $event),
1373
+ "sidebar-collapsed": sidebarCollapsed.value,
1374
+ "onUpdate:sidebarCollapsed": _cache[1] || (_cache[1] = ($event) => sidebarCollapsed.value = $event),
1324
1375
  spec: workspace.value,
1325
1376
  values: currentValues.value,
1326
1377
  "form-loading": unref(generated).isSubmitting.value,
@@ -1329,32 +1380,39 @@ var GeneratedPluginView_default = /*#__PURE__*/ _plugin_vue_export_helper_defaul
1329
1380
  onFormSubmit: submitJob,
1330
1381
  onJobSelect: selectJob
1331
1382
  }, {
1332
- default: withCtx(() => [createElementVNode("main", _hoisted_1$3, [unref(generated).isLoading.value ? (openBlock(), createElementBlock("div", _hoisted_2$2, [createVNode(LoadingSpinner_default, { size: "lg" }), _cache[1] || (_cache[1] = createElementVNode("span", null, "Loading analysis workspace", -1))])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
1333
- unref(generated).error.value ? (openBlock(), createBlock(AlertBox_default, {
1383
+ default: withCtx(() => [createVNode(AppContainer_default, {
1384
+ direction: "column",
1385
+ gap: "var(--mint-gutter)",
1386
+ class: "mint-generated-workspace"
1387
+ }, {
1388
+ default: withCtx(() => [unref(generated).isLoading.value ? (openBlock(), createElementBlock("div", _hoisted_1$3, [createVNode(LoadingSpinner_default, { size: "lg" }), _cache[2] || (_cache[2] = createElementVNode("span", null, "Loading analysis workspace", -1))])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [unref(generated).error.value ? (openBlock(), createBlock(AlertBox_default, {
1334
1389
  key: 0,
1335
1390
  tone: "error"
1336
1391
  }, {
1337
1392
  default: withCtx(() => [createTextVNode(toDisplayString(unref(generated).error.value), 1)]),
1338
1393
  _: 1
1339
- })) : createCommentVNode("", true),
1340
- activeDefinition.value ? (openBlock(), createElementBlock("header", _hoisted_3$2, [createElementVNode("div", null, [
1341
- _cache[2] || (_cache[2] = createElementVNode("p", { class: "mint-generated-workspace__eyebrow" }, "Analysis result", -1)),
1342
- createElementVNode("h1", null, toDisplayString(activeDefinition.value.title), 1),
1343
- activeDefinition.value.description ? (openBlock(), createElementBlock("p", _hoisted_4$2, toDisplayString(activeDefinition.value.description), 1)) : createCommentVNode("", true)
1344
- ]), createElementVNode("div", _hoisted_5$2, [createElementVNode("span", null, toDisplayString(resourceSummary(activeDefinition.value)), 1)])])) : createCommentVNode("", true),
1345
- createElementVNode("section", _hoisted_6$2, [currentResult.value ? (openBlock(), createBlock(GeneratedResultRenderer_default, {
1346
- key: 0,
1347
- result: currentResult.value
1348
- }, null, 8, ["result"])) : (openBlock(), createBlock(EmptyState_default, {
1349
- key: 1,
1350
- title: "No result yet",
1351
- description: "Set the parameters and run the analysis. Jobs continue independently if you switch tabs.",
1352
- size: "md"
1353
- }))])
1354
- ], 64))])]),
1394
+ })) : createCommentVNode("", true), createVNode(SectionCard_default, { title: activeDefinition.value?.title ?? "Result" }, createSlots({
1395
+ default: withCtx(() => [activeDefinition.value?.description ? (openBlock(), createElementBlock("p", _hoisted_3$2, toDisplayString(activeDefinition.value.description), 1)) : createCommentVNode("", true), currentResult.value ? (openBlock(), createBlock(GeneratedResultRenderer_default, {
1396
+ key: 1,
1397
+ result: currentResult.value
1398
+ }, null, 8, ["result"])) : (openBlock(), createBlock(EmptyState_default, {
1399
+ key: 2,
1400
+ title: "No result yet",
1401
+ description: "Set the parameters and run the analysis. Jobs continue independently if you switch tabs.",
1402
+ size: "md"
1403
+ }))]),
1404
+ _: 2
1405
+ }, [activeDefinition.value ? {
1406
+ name: "actions",
1407
+ fn: withCtx(() => [createElementVNode("span", _hoisted_2$2, toDisplayString(resourceSummary(activeDefinition.value)), 1)]),
1408
+ key: "0"
1409
+ } : void 0]), 1032, ["title"])], 64))]),
1410
+ _: 1
1411
+ })]),
1355
1412
  _: 1
1356
1413
  }, 8, [
1357
1414
  "view",
1415
+ "sidebar-collapsed",
1358
1416
  "spec",
1359
1417
  "values",
1360
1418
  "form-loading",
@@ -1362,7 +1420,7 @@ var GeneratedPluginView_default = /*#__PURE__*/ _plugin_vue_export_helper_defaul
1362
1420
  ]);
1363
1421
  };
1364
1422
  }
1365
- }), [["__scopeId", "data-v-c8ff991b"]]);
1423
+ }), [["__scopeId", "data-v-7ba9e342"]]);
1366
1424
  //#endregion
1367
1425
  //#region src/components/internal/PlateEditorBindingInternal.vue
1368
1426
  var PlateEditorBindingInternal_default = /* @__PURE__ */ defineComponent({
@@ -1853,6 +1911,6 @@ var runtime_exports = /* @__PURE__ */ __exportAll({
1853
1911
  useSettingsEndpoint: () => useSettingsEndpoint
1854
1912
  });
1855
1913
  //#endregion
1856
- export { ComponentBindingRenderer_default as a, generatedJobFormSchema as c, PluginWorkspaceView_default as d, useControlWorkspace as f, useToast as g, AppToastContainer_default as h, RuntimeUpdateNotice_default as i, normalizeGeneratedJobInput as l, useJobCenter as m, PresenceAvatars_default as n, GeneratedPluginView_default as o, combinePluginJobSources as p, usePresence as r, generatedJobDefaults as s, runtime_exports as t, Avatar_default as u };
1914
+ export { useToast as _, ComponentBindingRenderer_default as a, generatedJobFormSchema as c, AppContainer_default as d, PluginWorkspaceView_default as f, AppToastContainer_default as g, useJobCenter as h, RuntimeUpdateNotice_default as i, normalizeGeneratedJobInput as l, combinePluginJobSources as m, PresenceAvatars_default as n, GeneratedPluginView_default as o, useControlWorkspace as p, usePresence as r, generatedJobDefaults as s, runtime_exports as t, Avatar_default as u };
1857
1915
 
1858
- //# sourceMappingURL=runtime-DrL6lKAb.js.map
1916
+ //# sourceMappingURL=runtime-aZPUPxoB.js.map