@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
@@ -5,6 +5,10 @@
5
5
 
6
6
  @import url('https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600;700&family=Geist+Mono:wght@400;500;600&display=swap');
7
7
 
8
+ /* Tailwind v4's layer order, declared first so the SDK's base and utilities
9
+ layers sort the same way with or without Tailwind in the host. */
10
+ @layer theme, base, components, utilities;
11
+
8
12
  /* ==========================================================================
9
13
  CSS Variables - Light Mode
10
14
  ========================================================================== */
@@ -47,13 +51,8 @@
47
51
  where --text-secondary would drop to ~4.35:1. */
48
52
  --text-secondary-strong: #475569;
49
53
 
50
- /* Brand colors — one teal accent: teal-600 fills, teal-700 hover + ink,
51
- teal-800 pressed. White on #0D9488 is 3.74:1, a known AA exception. */
52
- --color-primary: #0D9488;
53
- --color-primary-hover: #0F766E;
54
- --color-primary-pressed: #115E59;
55
- --color-primary-soft: rgba(13, 148, 136, 0.10);
56
- --color-primary-border: #99F6E4;
54
+ /* Brand colors: the accent (--color-primary*) comes from the palette
55
+ blocks below the dark block (html[data-palette], default teal). */
57
56
  /* Fixed teal scale, the same in both themes. */
58
57
  --color-primary-50: #F0FDFA;
59
58
  --color-primary-100: #CCFBF1;
@@ -135,6 +134,8 @@
135
134
  --form-height-md: 2rem;
136
135
  --form-height-lg: 2.5rem;
137
136
  --mint-gutter: 0.5rem;
137
+ /* Distance from the outermost cards to the window edge, in every density. */
138
+ --mint-page-inset: 1rem;
138
139
 
139
140
  /* Semantic colors */
140
141
  --mint-success: #10B981;
@@ -169,7 +170,7 @@
169
170
  /* Soft focus rings — 3px translucent. Used by all form primitives
170
171
  post-0.16 visual refresh. Solid variants above kept for legacy
171
172
  components that haven't migrated yet. */
172
- --focus-ring-soft: 0 0 0 3px rgba(13, 148, 136, 0.18);
173
+ --focus-ring-soft: 0 0 0 3px color-mix(in srgb, var(--color-primary) 18%, transparent);
173
174
  /* Red is perceptually brighter than teal at equal alpha; drop 2pp to keep visual weight matched. */
174
175
  --focus-ring-soft-error: 0 0 0 3px rgba(239, 68, 68, 0.18);
175
176
 
@@ -191,6 +192,12 @@
191
192
  --mint-border-focus: var(--color-primary);
192
193
  /* Colour-only transitions; no lift, bounce or glow. */
193
194
  --mint-transition: 120ms ease;
195
+ /* Stacking layers: modal < jobs tray < onboarding tour < floating panels < tooltips and toasts. */
196
+ --mint-z-modal: 50;
197
+ --mint-z-tray: 1000;
198
+ --mint-z-tour: 1100;
199
+ --mint-z-popover: 1200;
200
+ --mint-z-toast: 9999;
194
201
  }
195
202
 
196
203
  /* ==========================================================================
@@ -207,12 +214,7 @@ html.dark {
207
214
  --border-light: #172033;
208
215
  --border-strong: #334155;
209
216
 
210
- /* Brand colors - Dark mode (CTA, purple and entity aliases follow) */
211
- --color-primary: #2DD4BF;
212
- --color-primary-hover: #5EEAD4;
213
- --color-primary-pressed: #99F6E4;
214
- --color-primary-soft: rgba(45, 212, 191, 0.12);
215
- --color-primary-border: rgba(45, 212, 191, 0.35);
217
+ /* Brand colors - Dark mode: the accent comes from the palette blocks below. */
216
218
  /* Dark ink on the light accent fill (10.1:1 on #2DD4BF). */
217
219
  --text-on-accent: #0B1120;
218
220
  --color-experiment-hover: #E2E8F0;
@@ -248,7 +250,7 @@ html.dark {
248
250
 
249
251
  /* Focus ring - dark mode offset uses bg-primary instead of white */
250
252
  --focus-ring-offset: 0 0 0 2px var(--bg-primary), 0 0 0 4px var(--color-primary);
251
- --focus-ring-soft: 0 0 0 3px rgba(45, 212, 191, 0.22);
253
+ --focus-ring-soft: 0 0 0 3px color-mix(in srgb, var(--color-primary) 22%, transparent);
252
254
  --focus-ring-soft-error: 0 0 0 3px rgba(248, 113, 113, 0.26);
253
255
 
254
256
  /* Legacy aliases */
@@ -258,6 +260,122 @@ html.dark {
258
260
  color-scheme: dark;
259
261
  }
260
262
 
263
+ /* Accent palettes (Settings → Color palette). The settings store writes
264
+ html[data-palette]; the palette swatches set the same attribute on their
265
+ strip to preview a palette. Each palette is one accent in both themes: white
266
+ text on the light-mode fill, dark text (--text-on-accent) on the dark-mode
267
+ fill. Hues come from the biology plot-style palettes. */
268
+
269
+ /* Teal (default): teal-600 fill, teal-700 hover + ink, teal-800 pressed.
270
+ White on #0D9488 is 3.74:1, a known AA exception. */
271
+ :root,
272
+ [data-palette="default"] {
273
+ --color-primary: #0D9488;
274
+ --color-primary-hover: #0F766E;
275
+ --color-primary-pressed: #115E59;
276
+ --color-primary-soft: rgba(13, 148, 136, 0.10);
277
+ --color-primary-border: #99F6E4;
278
+ }
279
+ html.dark,
280
+ html.dark [data-palette="default"] {
281
+ --color-primary: #2DD4BF;
282
+ --color-primary-hover: #5EEAD4;
283
+ --color-primary-pressed: #99F6E4;
284
+ --color-primary-soft: rgba(45, 212, 191, 0.12);
285
+ --color-primary-border: rgba(45, 212, 191, 0.35);
286
+ }
287
+
288
+ /* Colour-blind safe: Okabe-Ito blue accent, and Okabe-Ito bluish green,
289
+ vermilion and orange for status, so success and error differ for every
290
+ colour-vision type. White on #0072B2 is 5.19:1. */
291
+ :root[data-palette="colorblind"],
292
+ [data-palette="colorblind"] {
293
+ --color-primary: #0072B2;
294
+ --color-primary-hover: #005F94;
295
+ --color-primary-pressed: #004C77;
296
+ --color-primary-soft: rgba(0, 114, 178, 0.10);
297
+ --color-primary-border: #B3D5EA;
298
+ --mint-success: #009E73;
299
+ --mint-success-hover: #00805D;
300
+ --mint-success-bg: rgba(0, 158, 115, 0.1);
301
+ --mint-success-border: rgba(0, 158, 115, 0.3);
302
+ --mint-error: #D55E00;
303
+ --mint-error-hover: #B34E00;
304
+ --mint-error-bg: rgba(213, 94, 0, 0.1);
305
+ --mint-error-border: rgba(213, 94, 0, 0.3);
306
+ --mint-warning: #E69F00;
307
+ --mint-warning-hover: #C78800;
308
+ --mint-warning-bg: rgba(230, 159, 0, 0.1);
309
+ --mint-warning-border: rgba(230, 159, 0, 0.3);
310
+ --mint-warning-text: #8F5F00;
311
+ }
312
+ html.dark[data-palette="colorblind"],
313
+ html.dark [data-palette="colorblind"] {
314
+ --color-primary: #56B4E9;
315
+ --color-primary-hover: #7CC5EE;
316
+ --color-primary-pressed: #A3D6F3;
317
+ --color-primary-soft: rgba(86, 180, 233, 0.14);
318
+ --color-primary-border: rgba(86, 180, 233, 0.38);
319
+ --mint-success-bg: rgba(0, 158, 115, 0.15);
320
+ --mint-error-bg: rgba(213, 94, 0, 0.15);
321
+ --mint-warning-bg: rgba(230, 159, 0, 0.15);
322
+ --mint-warning-text: #FCD34D;
323
+ }
324
+
325
+ /* Purple: plot-style purple #8781bd, deepened so white text is 5.15:1. */
326
+ :root[data-palette="purple"],
327
+ [data-palette="purple"] {
328
+ --color-primary: #6B64B0;
329
+ --color-primary-hover: #5A539E;
330
+ --color-primary-pressed: #4A448A;
331
+ --color-primary-soft: rgba(107, 100, 176, 0.10);
332
+ --color-primary-border: #D3D0EC;
333
+ }
334
+ html.dark[data-palette="purple"],
335
+ html.dark [data-palette="purple"] {
336
+ --color-primary: #A9A3DB;
337
+ --color-primary-hover: #C2BDE7;
338
+ --color-primary-pressed: #D8D4F1;
339
+ --color-primary-soft: rgba(169, 163, 219, 0.14);
340
+ --color-primary-border: rgba(169, 163, 219, 0.38);
341
+ }
342
+
343
+ /* Ocean: plot-style ocean ramp, #2171B5 fill (white 5.13:1), #6BAED6 dark. */
344
+ :root[data-palette="ocean"],
345
+ [data-palette="ocean"] {
346
+ --color-primary: #2171B5;
347
+ --color-primary-hover: #1B5F99;
348
+ --color-primary-pressed: #164E7E;
349
+ --color-primary-soft: rgba(33, 113, 181, 0.10);
350
+ --color-primary-border: #BBD7EE;
351
+ }
352
+ html.dark[data-palette="ocean"],
353
+ html.dark [data-palette="ocean"] {
354
+ --color-primary: #6BAED6;
355
+ --color-primary-hover: #8EC2E2;
356
+ --color-primary-pressed: #B0D5EC;
357
+ --color-primary-soft: rgba(107, 174, 214, 0.14);
358
+ --color-primary-border: rgba(107, 174, 214, 0.38);
359
+ }
360
+
361
+ /* Forest: plot-style forest_clay, #2F6B4F fill (white 6.29:1), #7AA874 dark. */
362
+ :root[data-palette="forest"],
363
+ [data-palette="forest"] {
364
+ --color-primary: #2F6B4F;
365
+ --color-primary-hover: #275A42;
366
+ --color-primary-pressed: #1F4935;
367
+ --color-primary-soft: rgba(47, 107, 79, 0.10);
368
+ --color-primary-border: #BFD8C6;
369
+ }
370
+ html.dark[data-palette="forest"],
371
+ html.dark [data-palette="forest"] {
372
+ --color-primary: #7AA874;
373
+ --color-primary-hover: #95BC90;
374
+ --color-primary-pressed: #B1CFAD;
375
+ --color-primary-soft: rgba(122, 168, 116, 0.14);
376
+ --color-primary-border: rgba(122, 168, 116, 0.38);
377
+ }
378
+
261
379
  /* Comfortable density (html[data-density], written by the settings store):
262
380
  the pre-v2 control heights and a wider gutter. */
263
381
  [data-density="comfortable"] {
@@ -281,6 +399,22 @@ body {
281
399
  transition: background-color 0.15s, color 0.15s;
282
400
  }
283
401
 
402
+ /* No page-level rubber-band bounce or pull-to-refresh; overflow: hidden does
403
+ not stop it. Panels still scroll, and their overscroll stops at their own
404
+ edge. A browser tab keeps the horizontal swipe for back and forward; an
405
+ installed PWA has no history swipe, so it drops both axes. */
406
+ html,
407
+ body {
408
+ overscroll-behavior-y: none;
409
+ }
410
+
411
+ @media (display-mode: standalone) {
412
+ html,
413
+ body {
414
+ overscroll-behavior: none;
415
+ }
416
+ }
417
+
284
418
  code, pre {
285
419
  font-family: var(--font-mono);
286
420
  }
@@ -344,6 +478,9 @@ button, input, select, textarea {
344
478
  /* ==========================================================================
345
479
  MINT Utility Classes (for Tailwind v4 compatibility)
346
480
  ========================================================================== */
481
+ /* In Tailwind's utilities layer: unlayered, these beat every layered rule, so a
482
+ host's responsive variant (`lg:flex-row`) lost to the SDK's `.flex-col`. */
483
+ @layer utilities {
347
484
  .bg-bg-hover {
348
485
  background-color: var(--bg-tertiary);
349
486
  }
@@ -719,6 +856,7 @@ button, input, select, textarea {
719
856
  .max-w-sm {
720
857
  max-width: 24rem;
721
858
  }
859
+ } /* @layer utilities */
722
860
 
723
861
  /* ==========================================================================
724
862
  Reduced Motion
@@ -317,6 +317,8 @@ export interface PluginWorkspaceViewSpec {
317
317
  disabled?: import('vue').MaybeRefOrGetter<boolean>
318
318
  reason?: import('vue').MaybeRefOrGetter<string | undefined>
319
319
  }
320
+ /** Job source: the top bar shows the viewer's job and opens a JobsStatusTray. Read once at setup, like `experiment`. */
321
+ jobs?: import('vue').MaybeRefOrGetter<import('../composables/useJobCenter').PluginJobCenterSource | undefined>
320
322
  }
321
323
 
322
324
 
@@ -207,6 +207,7 @@ export type {
207
207
  JobStateInput,
208
208
  JobStatus,
209
209
  JobStreamData,
210
+ TopBarJob,
210
211
  } from './jobs'
211
212
 
212
213
  export type {
package/src/types/jobs.ts CHANGED
@@ -68,3 +68,13 @@ export interface JobSnapshotPayload {
68
68
  }
69
69
 
70
70
  export type JobStreamData = JobStateInput | JobSnapshotPayload
71
+
72
+ /** What the top-bar run slot shows for the viewer's own job. The plugin picks the job. */
73
+ export interface TopBarJob {
74
+ /** Lifecycle of the shown job; sets the icon and the tone. */
75
+ status: JobStatus
76
+ /** Tooltip and accessible name, e.g. "Extracting", "Saved to EXP-0142". Not shown as text. */
77
+ label: string
78
+ /** 0-100; drawn as a small bar after the icon. */
79
+ percent?: number | null
80
+ }
@@ -66,5 +66,5 @@ export type PlatformContext = Partial<Omit<PlatformFrontendContext, 'plugin'>> &
66
66
 
67
67
  // Settings state types
68
68
  export type ThemeMode = 'light' | 'dark' | 'system'
69
- export type ColorPalette = 'default' | 'colorblind' | 'viridis' | 'pastel'
69
+ export type ColorPalette = 'default' | 'colorblind' | 'purple' | 'ocean' | 'forest'
70
70
  export type TableDensity = 'compact' | 'normal' | 'comfortable'