@morscherlab/mint-sdk 1.4.0-beta.9 → 1.4.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 (198) hide show
  1. package/README.md +14 -3
  2. package/dist/{AlertBox-B2Bgr3ei.js → AlertBox-DwgNTEqf.js} +3 -3
  3. package/dist/{AlertBox-B2Bgr3ei.js.map → AlertBox-DwgNTEqf.js.map} +1 -1
  4. package/dist/{AppSidebar-Dq9W1jE2.js → AppSidebar-CZZaxni0.js} +1103 -144
  5. package/dist/AppSidebar-CZZaxni0.js.map +1 -0
  6. package/dist/{ConfirmDialog-nbJj51is.js → ConfirmDialog-CjWoxAD1.js} +2 -2
  7. package/dist/{ConfirmDialog-nbJj51is.js.map → ConfirmDialog-CjWoxAD1.js.map} +1 -1
  8. package/dist/{ExperimentPopover-5T1fAq2L.js → ExperimentPopover-DujiuQIO.js} +5 -5
  9. package/dist/{ExperimentPopover-5T1fAq2L.js.map → ExperimentPopover-DujiuQIO.js.map} +1 -1
  10. package/dist/{ExperimentSelectorModal-65peG4Up.js → ExperimentSelectorModal-B4j4eUOJ.js} +114 -98
  11. package/dist/ExperimentSelectorModal-B4j4eUOJ.js.map +1 -0
  12. package/dist/{SegmentedControl-BtnnjWzs.js → SegmentedControl-DyUPH3I5.js} +2 -2
  13. package/dist/{SegmentedControl-BtnnjWzs.js.map → SegmentedControl-DyUPH3I5.js.map} +1 -1
  14. package/dist/{SettingsModal-483nyI6b.js → SettingsModal-D2MOOtuO.js} +26 -25
  15. package/dist/SettingsModal-D2MOOtuO.js.map +1 -0
  16. package/dist/__stories__/experiment-helpers.d.ts +10 -0
  17. package/dist/__tests__/components/AppTopBarOnboarding.test.d.ts +1 -0
  18. package/dist/__tests__/components/FloatingPanelsInModal.test.d.ts +1 -0
  19. package/dist/__tests__/composables/useFloatingPanel.test.d.ts +1 -0
  20. package/dist/__tests__/composables/useOnboarding.test.d.ts +1 -0
  21. package/dist/__tests__/styles/paletteTokens.test.d.ts +1 -0
  22. package/dist/__tests__/styles/v2AuditRules.test.d.ts +1 -0
  23. package/dist/components/AppTopBar.vue.d.ts +20 -5
  24. package/dist/components/BaseButton.vue.d.ts +4 -2
  25. package/dist/components/ExperimentSelectorModal.vue.d.ts +15 -1
  26. package/dist/components/JobsStatusTray.vue.d.ts +15 -4
  27. package/dist/components/PluginWorkspaceView.props.d.ts +3 -0
  28. package/dist/components/PluginWorkspaceView.vue.d.ts +3 -0
  29. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +3 -3
  30. package/dist/components/internal/AppTopBarOnboardingInternal.vue.d.ts +7 -0
  31. package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +2 -1
  32. package/dist/components/internal/AutoGroupModalInternal.vue.d.ts +2 -2
  33. package/dist/components/internal/OnboardingLayerInternal.vue.d.ts +7 -0
  34. package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +8 -0
  35. package/dist/composables/pluginWorkspaceModel.d.ts +2 -2
  36. package/dist/composables/useFileImport.d.ts +7 -0
  37. package/dist/composables/useFloatingPanel.d.ts +29 -0
  38. package/dist/composables/useJobCenter.d.ts +41 -3
  39. package/dist/composables/useOnboarding.d.ts +119 -0
  40. package/dist/{controlSchemaModel-B8CTXagP.js → controlSchemaModel-Bsg0t5Ab.js} +2 -2
  41. package/dist/{controlSchemaModel-B8CTXagP.js.map → controlSchemaModel-Bsg0t5Ab.js.map} +1 -1
  42. package/dist/{data-CgILxDLW.js → data-Boeh4uPI.js} +13 -12
  43. package/dist/{data-CgILxDLW.js.map → data-Boeh4uPI.js.map} +1 -1
  44. package/dist/data.d.ts +1 -1
  45. package/dist/data.js +9 -9
  46. package/dist/{experiment-43OJtH7R.js → experiment-DyO54FQB.js} +25 -61
  47. package/dist/experiment-DyO54FQB.js.map +1 -0
  48. package/dist/{experimentStatus-Cqp6qNrR.js → experimentStatus-DCn2QKG7.js} +2 -2
  49. package/dist/{experimentStatus-Cqp6qNrR.js.map → experimentStatus-DCn2QKG7.js.map} +1 -1
  50. package/dist/index.js +20 -20
  51. package/dist/{install-BtLWTk6H.js → install-BEHp7Mo-.js} +15 -15
  52. package/dist/{install-BtLWTk6H.js.map → install-BEHp7Mo-.js.map} +1 -1
  53. package/dist/install.js +1 -1
  54. package/dist/{lab-MHzp-_J8.js → lab-D61eaX6f.js} +68 -61
  55. package/dist/{lab-MHzp-_J8.js.map → lab-D61eaX6f.js.map} +1 -1
  56. package/dist/lab.js +4 -4
  57. package/dist/{records-B6gpM_3e.js → records-D4aQXyZu.js} +193 -133
  58. package/dist/records-D4aQXyZu.js.map +1 -0
  59. package/dist/{runtime-7vfl_bI3.js → runtime-q-R0CNLh.js} +400 -33
  60. package/dist/runtime-q-R0CNLh.js.map +1 -0
  61. package/dist/runtime.d.ts +1 -1
  62. package/dist/runtime.js +7 -7
  63. package/dist/{shell-Cs9OJMnm.js → shell-6CGFvUUw.js} +10 -5
  64. package/dist/{shell-Cs9OJMnm.js.map → shell-6CGFvUUw.js.map} +1 -1
  65. package/dist/shell.d.ts +1 -0
  66. package/dist/shell.js +6 -6
  67. package/dist/stores/index.d.ts +1 -1
  68. package/dist/stores/index.js +2 -2
  69. package/dist/stores/settings.d.ts +4 -12
  70. package/dist/styles.css +1191 -479
  71. package/dist/types/components.d.ts +2 -0
  72. package/dist/types/index.d.ts +1 -1
  73. package/dist/types/jobs.d.ts +9 -0
  74. package/dist/types/platform.d.ts +1 -1
  75. package/dist/{useDropdownState-8yWMu-7_.js → useDropdownState-uFIz6Yv8.js} +16 -4
  76. package/dist/useDropdownState-uFIz6Yv8.js.map +1 -0
  77. package/dist/{useExperimentSamples-DHnxKFAF.js → useExperimentSamples-QEFoq4tf.js} +48 -6
  78. package/dist/useExperimentSamples-QEFoq4tf.js.map +1 -0
  79. package/dist/{useListReorder-BitdUhxn.js → useListReorder-DsuzwWGS.js} +122 -172
  80. package/dist/useListReorder-DsuzwWGS.js.map +1 -0
  81. package/dist/{useRackEditor-DiwCt77M.js → useRackEditor-KpZ4iJ6o.js} +22 -32
  82. package/dist/useRackEditor-KpZ4iJ6o.js.map +1 -0
  83. package/dist/useRealtime-B58Lo-Tm.js +508 -0
  84. package/dist/useRealtime-B58Lo-Tm.js.map +1 -0
  85. package/dist/{useRequest-D506eHi8.js → useRequest-BuDmW8Jc.js} +8 -37
  86. package/dist/useRequest-BuDmW8Jc.js.map +1 -0
  87. package/package.json +3 -2
  88. package/src/__stories__/experiment-helpers.ts +3 -3
  89. package/src/__tests__/components/ActionMenu.test.ts +2 -2
  90. package/src/__tests__/components/AppTopBar.test.ts +206 -1
  91. package/src/__tests__/components/AppTopBarOnboarding.test.ts +160 -0
  92. package/src/__tests__/components/AppTopBarPageSelector.test.ts +125 -9
  93. package/src/__tests__/components/BaseButton.test.ts +19 -0
  94. package/src/__tests__/components/BaseModal.test.ts +13 -0
  95. package/src/__tests__/components/ExperimentSelectorModal.test.ts +34 -1
  96. package/src/__tests__/components/FloatingPanelsInModal.test.ts +94 -0
  97. package/src/__tests__/components/GeneratedPluginView.test.ts +1 -1
  98. package/src/__tests__/components/JobsStatusTray.test.ts +373 -71
  99. package/src/__tests__/components/PluginWorkspaceView.test.ts +63 -1
  100. package/src/__tests__/components/SampleSelector.test.ts +20 -0
  101. package/src/__tests__/components/SettingsModal.test.ts +9 -2
  102. package/src/__tests__/composables/useFileImport.test.ts +36 -0
  103. package/src/__tests__/composables/useFloatingPanel.test.ts +68 -0
  104. package/src/__tests__/composables/useJobCenter.test.ts +262 -3
  105. package/src/__tests__/composables/useOnboarding.test.ts +317 -0
  106. package/src/__tests__/docs/frontendDocsCatalog.test.ts +4 -3
  107. package/src/__tests__/fixtures/table-import/cells.xlsx +0 -0
  108. package/src/__tests__/fixtures/table-import/samples.xlsx +0 -0
  109. package/src/__tests__/stores/settings.test.ts +21 -21
  110. package/src/__tests__/styles/cssTokens.test.ts +4 -1
  111. package/src/__tests__/styles/menusShellRefresh.test.ts +8 -2
  112. package/src/__tests__/styles/paletteTokens.test.ts +44 -0
  113. package/src/__tests__/styles/v2AuditRules.test.ts +104 -0
  114. package/src/components/ActionMenu.vue +6 -37
  115. package/src/components/AppTopBar.onboarding.story.vue +69 -0
  116. package/src/components/AppTopBar.story.vue +59 -4
  117. package/src/components/AppTopBar.vue +132 -10
  118. package/src/components/BaseButton.vue +16 -2
  119. package/src/components/BaseModal.vue +2 -1
  120. package/src/components/ExperimentSelectorModal.story.vue +38 -0
  121. package/src/components/ExperimentSelectorModal.vue +20 -1
  122. package/src/components/GeneratedPluginView.vue +4 -9
  123. package/src/components/GeneratedResultRenderer.vue +3 -4
  124. package/src/components/JobsStatusTray.story.vue +97 -43
  125. package/src/components/JobsStatusTray.vue +287 -290
  126. package/src/components/LayoutResizeHandle.story.vue +65 -4
  127. package/src/components/PluginWorkspaceView.props.ts +3 -0
  128. package/src/components/PluginWorkspaceView.vue +17 -0
  129. package/src/components/SampleSelector.story.vue +21 -6
  130. package/src/components/SampleSelector.vue +10 -3
  131. package/src/components/SectionCard.story.vue +33 -0
  132. package/src/components/SettingsModal.vue +7 -12
  133. package/src/components/Tooltip.vue +9 -32
  134. package/src/components/internal/AppTopBarOnboardingInternal.vue +172 -0
  135. package/src/components/internal/AppTopBarPageSelectorInternal.vue +140 -72
  136. package/src/components/internal/DatePickerDateInternal.vue +7 -45
  137. package/src/components/internal/DatePickerDateTimeInternal.vue +7 -1
  138. package/src/components/internal/DatePickerTimeInternal.vue +8 -1
  139. package/src/components/internal/NumberUnitInputInternal.vue +4 -18
  140. package/src/components/internal/OnboardingLayerInternal.vue +173 -0
  141. package/src/components/internal/SelectMultipleInternal.vue +6 -1
  142. package/src/components/internal/SelectSearchableInternal.vue +6 -1
  143. package/src/components/internal/WellEditPopupInternal.vue +11 -22
  144. package/src/components/internal/WorkspaceShellInternal.vue +12 -0
  145. package/src/composables/pluginWorkspaceModel.ts +2 -2
  146. package/src/composables/useFileImport.ts +51 -1
  147. package/src/composables/useFloatingPanel.ts +107 -0
  148. package/src/composables/useJobCenter.ts +188 -6
  149. package/src/composables/useOnboarding.ts +465 -0
  150. package/src/composables/usePluginWorkspace.ts +1 -1
  151. package/src/data.ts +1 -0
  152. package/src/runtime.ts +2 -1
  153. package/src/shell.ts +17 -0
  154. package/src/stores/index.ts +0 -2
  155. package/src/stores/settings.ts +20 -50
  156. package/src/styles/components/action-menu.css +1 -1
  157. package/src/styles/components/app-layout.css +6 -3
  158. package/src/styles/components/app-page-selector.css +120 -45
  159. package/src/styles/components/app-top-bar.css +165 -3
  160. package/src/styles/components/button.css +8 -0
  161. package/src/styles/components/dataframe.css +1 -1
  162. package/src/styles/components/date-picker.css +4 -2
  163. package/src/styles/components/datetime-picker.css +4 -4
  164. package/src/styles/components/experiment-selector-modal.css +13 -0
  165. package/src/styles/components/jobs-status-tray.css +134 -296
  166. package/src/styles/components/layout-resize-handle.css +59 -16
  167. package/src/styles/components/modal.css +3 -3
  168. package/src/styles/components/number-input.css +1 -1
  169. package/src/styles/components/onboarding.css +368 -0
  170. package/src/styles/components/progress-bar.css +3 -3
  171. package/src/styles/components/sample-selector.css +43 -0
  172. package/src/styles/components/searchable-select.css +3 -7
  173. package/src/styles/components/section-card.css +30 -6
  174. package/src/styles/components/settings-modal.css +7 -2
  175. package/src/styles/components/time-picker.css +3 -6
  176. package/src/styles/components/toast.css +1 -1
  177. package/src/styles/components/tooltip.css +2 -2
  178. package/src/styles/components/unit-input.css +1 -1
  179. package/src/styles/components/well-edit-popup.css +2 -2
  180. package/src/styles/index.css +1 -0
  181. package/src/styles/variables.css +153 -15
  182. package/src/types/components.ts +2 -0
  183. package/src/types/index.ts +1 -0
  184. package/src/types/jobs.ts +10 -0
  185. package/src/types/platform.ts +1 -1
  186. package/dist/AppSidebar-Dq9W1jE2.js.map +0 -1
  187. package/dist/ExperimentSelectorModal-65peG4Up.js.map +0 -1
  188. package/dist/SettingsModal-483nyI6b.js.map +0 -1
  189. package/dist/experiment-43OJtH7R.js.map +0 -1
  190. package/dist/records-B6gpM_3e.js.map +0 -1
  191. package/dist/runtime-7vfl_bI3.js.map +0 -1
  192. package/dist/useDropdownState-8yWMu-7_.js.map +0 -1
  193. package/dist/useExperimentSamples-DHnxKFAF.js.map +0 -1
  194. package/dist/useListReorder-BitdUhxn.js.map +0 -1
  195. package/dist/useRackEditor-DiwCt77M.js.map +0 -1
  196. package/dist/useRealtime-C3iy9QkU.js +0 -699
  197. package/dist/useRealtime-C3iy9QkU.js.map +0 -1
  198. package/dist/useRequest-D506eHi8.js.map +0 -1
@@ -130,10 +130,9 @@ function humanize(value: string): string {
130
130
 
131
131
  .mint-generated-result__json {
132
132
  overflow: auto;
133
- padding: 1rem;
134
- border: 1px solid var(--border-color);
135
- border-radius: 0.75rem;
136
- background: var(--bg-secondary);
133
+ padding: 0.75rem 1rem;
134
+ border-radius: var(--radius-md);
135
+ background: var(--bg-tertiary);
137
136
  font-size: 0.8125rem;
138
137
  line-height: 1.55;
139
138
  white-space: pre-wrap;
@@ -1,6 +1,9 @@
1
1
  <script setup lang="ts">
2
+ import { defineComponent, h, onMounted, type PropType } from 'vue'
3
+ import AppTopBar from './AppTopBar.vue'
2
4
  import JobsStatusTray from './JobsStatusTray.vue'
3
- import type { JobStateInput, JobStatus } from '../types/jobs'
5
+ import { useJobCenter } from '../composables/useJobCenter'
6
+ import type { JobState, JobStateInput, JobStatus } from '../types/jobs'
4
7
 
5
8
  function job(
6
9
  status: JobStatus,
@@ -43,13 +46,6 @@ function job(
43
46
  }
44
47
  }
45
48
 
46
- const mixedJobs = [
47
- job('awaiting_input', 'J-104'),
48
- job('running', 'J-103'),
49
- job('queued', 'J-102'),
50
- job('completed', 'J-101'),
51
- job('failed', 'J-100'),
52
- ]
53
49
  const explicitActionJobs = [
54
50
  job('awaiting_input', 'J-201', { can_cancel: true }),
55
51
  job('completed', 'J-200', { can_delete: false }),
@@ -57,69 +53,127 @@ const explicitActionJobs = [
57
53
  const cancelJob = async () => undefined
58
54
  const deleteJob = async () => true
59
55
 
60
- function openJob(jobId: string) {
61
- console.info('open', jobId)
56
+ function openJob(selected: JobState) {
57
+ console.info('open', selected.job_id)
58
+ }
59
+
60
+ /** The parent owns the job center: it feeds the top-bar chip and the tray. */
61
+ const TrayDemo = defineComponent({
62
+ props: {
63
+ jobs: { type: Array as PropType<JobStateInput[]>, required: true },
64
+ title: { type: String, default: undefined },
65
+ open: Boolean,
66
+ confirm: Boolean,
67
+ /** Show the awaiting-input job as a browser decode, as LEAF does. */
68
+ decode: Boolean,
69
+ },
70
+ setup(props) {
71
+ // One source object: a new source identity resets the just-completed hold.
72
+ const center = useJobCenter({
73
+ source: { jobs: () => props.jobs, cancel: cancelJob, delete: deleteJob },
74
+ rowJob: row => (props.decode && row.status === 'awaiting_input'
75
+ ? { status: 'running', percent: 62, message: 'Decoding in the browser · 5/8' }
76
+ : null),
77
+ topBarJob: shown => (shown.status === 'completed' ? { status: 'completed', label: `Saved to ${shown.experiment_id}` } : null),
78
+ })
79
+ onMounted(() => { if (props.open) center.open() })
80
+ return () => [
81
+ h(AppTopBar, {
82
+ title: 'Peak QC',
83
+ job: center.topBarJob.value,
84
+ jobsDone: center.completedCount.value,
85
+ jobsOpen: center.isOpen.value,
86
+ jobsPanelId: center.panelId,
87
+ onJobClick: () => center.handleTopBarClick(openJob),
88
+ }),
89
+ h(JobsStatusTray, { center, title: props.title, confirm: props.confirm, onSelect: openJob }, {
90
+ 'job-actions': ({ job: row }: { job: JobState }) => row.status === 'completed'
91
+ ? h('button', { type: 'button', class: 'mint-jobs-tray__section-action', onClick: () => openJob(row) }, 'Open')
92
+ : null,
93
+ }),
94
+ ]
95
+ },
96
+ })
97
+
98
+ function playgroundJobs(percent: number, finished: boolean): JobStateInput[] {
99
+ const running = finished
100
+ ? job('completed', 'J-103', { completed_at: '2026-07-14T10:12:00+00:00' })
101
+ : job('running', 'J-103', {
102
+ progress: { ...job('running', 'J-103').progress, percent, message: 'Integrating peaks' },
103
+ })
104
+ return [
105
+ job('awaiting_input', 'J-104'),
106
+ running,
107
+ job('queued', 'J-102'),
108
+ job('completed', 'J-101'),
109
+ job('failed', 'J-100'),
110
+ ]
62
111
  }
63
112
 
64
113
  function initState() {
65
114
  return {
66
- title: 'Analysis jobs',
67
- jobs: mixedJobs,
115
+ title: 'Jobs',
116
+ percent: 37,
117
+ finished: false,
118
+ open: true,
119
+ confirm: false,
120
+ decode: false,
68
121
  }
69
122
  }
70
123
  </script>
71
124
 
72
125
  <template>
73
- <Story title="Workflow/JobsStatusTray">
126
+ <Story title="Workflow/JobsStatusTray" :layout="{ type: 'single', iframe: true }">
74
127
  <Variant title="Playground" :init-state="initState">
75
128
  <template #default="{ state }">
76
- <div style="padding: 2rem; min-height: 520px;">
77
- <JobsStatusTray
129
+ <div style="min-height: 560px;">
130
+ <TrayDemo
131
+ :key="String(state.open)"
132
+ :jobs="playgroundJobs(state.percent, state.finished)"
78
133
  :title="state.title"
79
- :source="{ jobs: state.jobs, cancel: cancelJob, delete: deleteJob }"
80
- :load-on-mount="false"
81
- :teleport-to="false"
82
- >
83
- <template #job-actions="{ job }">
84
- <button type="button" class="mint-jobs-tray__action" @click="() => openJob(job.job_id)">
85
- Open
86
- </button>
87
- </template>
88
- </JobsStatusTray>
134
+ :open="state.open"
135
+ :confirm="state.confirm"
136
+ :decode="state.decode"
137
+ />
89
138
  </div>
90
139
  </template>
91
140
  <template #controls="{ state }">
92
141
  <HstText v-model="state.title" title="Title" />
142
+ <HstSlider v-model="state.percent" title="Running percent" :min="0" :max="100" />
143
+ <HstCheckbox v-model="state.finished" title="Running job completed (6 s chip)" />
144
+ <HstCheckbox v-model="state.open" title="Open on mount" />
145
+ <HstCheckbox v-model="state.confirm" title="Confirm cancel, delete and clear" />
146
+ <HstCheckbox v-model="state.decode" title="Row override: J-104 as a browser decode" />
93
147
  </template>
94
148
  </Variant>
95
149
 
150
+ <Variant title="Confirm and row override">
151
+ <div style="min-height: 560px;">
152
+ <TrayDemo :jobs="playgroundJobs(37, false)" open confirm decode />
153
+ </div>
154
+ </Variant>
155
+
96
156
  <Variant title="Awaiting input">
97
- <div style="padding: 2rem; min-height: 520px;">
98
- <JobsStatusTray
99
- :source="{ jobs: [job('awaiting_input', 'J-301')] }"
100
- :load-on-mount="false"
101
- :teleport-to="false"
102
- />
157
+ <div style="min-height: 560px;">
158
+ <TrayDemo :jobs="[job('awaiting_input', 'J-301')]" open />
103
159
  </div>
104
160
  </Variant>
105
161
 
106
162
  <Variant title="Explicit actions">
107
- <div style="padding: 2rem; min-height: 520px;">
108
- <JobsStatusTray
109
- :source="{ jobs: explicitActionJobs, cancel: cancelJob, delete: deleteJob }"
110
- :load-on-mount="false"
111
- :teleport-to="false"
112
- />
163
+ <div style="min-height: 560px;">
164
+ <TrayDemo :jobs="explicitActionJobs" open />
165
+ </div>
166
+ </Variant>
167
+
168
+ <Variant title="Idle with completed jobs">
169
+ <div style="min-height: 560px;">
170
+ <TrayDemo :jobs="[job('completed', 'J-401'), job('completed', 'J-402'), job('cancelled', 'J-403')]" />
113
171
  </div>
114
172
  </Variant>
115
173
 
116
174
  <Variant title="Empty">
117
- <div style="padding: 2rem; min-height: 520px;">
118
- <JobsStatusTray
119
- :source="{ jobs: [] }"
120
- :load-on-mount="false"
121
- :teleport-to="false"
122
- />
175
+ <div style="min-height: 560px;">
176
+ <TrayDemo :jobs="[]" open />
123
177
  </div>
124
178
  </Variant>
125
179
  </Story>