@morscherlab/mint-sdk 1.4.0-beta.17 → 1.4.0-beta.18

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 (76) hide show
  1. package/README.md +14 -3
  2. package/dist/{AlertBox-SnsbVow-.js → AlertBox-CzLg0UaL.js} +2 -2
  3. package/dist/{AlertBox-SnsbVow-.js.map → AlertBox-CzLg0UaL.js.map} +1 -1
  4. package/dist/{AppSidebar-CB0-RQ4m.js → AppSidebar-6oTT-gPO.js} +43 -13
  5. package/dist/AppSidebar-6oTT-gPO.js.map +1 -0
  6. package/dist/{ExperimentPopover-ChKCrklH.js → ExperimentPopover-9l4QZlvQ.js} +2 -2
  7. package/dist/{ExperimentPopover-ChKCrklH.js.map → ExperimentPopover-9l4QZlvQ.js.map} +1 -1
  8. package/dist/{ExperimentSelectorModal-BqifjNaN.js → ExperimentSelectorModal-pR5fK3pA.js} +3 -3
  9. package/dist/{ExperimentSelectorModal-BqifjNaN.js.map → ExperimentSelectorModal-pR5fK3pA.js.map} +1 -1
  10. package/dist/{SegmentedControl-hOgBVdju.js → SegmentedControl-CJ7EAmOq.js} +2 -2
  11. package/dist/{SegmentedControl-hOgBVdju.js.map → SegmentedControl-CJ7EAmOq.js.map} +1 -1
  12. package/dist/{SettingsModal-CoZK3EDN.js → SettingsModal-Dyitgzfp.js} +6 -6
  13. package/dist/{SettingsModal-CoZK3EDN.js.map → SettingsModal-Dyitgzfp.js.map} +1 -1
  14. package/dist/components/AppTopBar.vue.d.ts +7 -0
  15. package/dist/components/JobsStatusTray.vue.d.ts +11 -4
  16. package/dist/components/PluginWorkspaceView.props.d.ts +3 -0
  17. package/dist/components/PluginWorkspaceView.vue.d.ts +3 -0
  18. package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +8 -0
  19. package/dist/composables/useJobCenter.d.ts +11 -3
  20. package/dist/{controlSchemaModel-CIH5Hqpw.js → controlSchemaModel-DCUOx8ll.js} +2 -2
  21. package/dist/{controlSchemaModel-CIH5Hqpw.js.map → controlSchemaModel-DCUOx8ll.js.map} +1 -1
  22. package/dist/{data-OZ94DhVC.js → data-BIiV4kKw.js} +9 -9
  23. package/dist/{data-OZ94DhVC.js.map → data-BIiV4kKw.js.map} +1 -1
  24. package/dist/data.js +7 -7
  25. package/dist/index.js +16 -16
  26. package/dist/{install-BKgb5qZw.js → install-Dg-Z6ze5.js} +13 -13
  27. package/dist/{install-BKgb5qZw.js.map → install-Dg-Z6ze5.js.map} +1 -1
  28. package/dist/install.js +1 -1
  29. package/dist/{lab-ZDKlx1Oo.js → lab-BHVT1qN2.js} +9 -9
  30. package/dist/{lab-ZDKlx1Oo.js.map → lab-BHVT1qN2.js.map} +1 -1
  31. package/dist/lab.js +4 -4
  32. package/dist/{records-B4yl2oIu.js → records-CR_pYzIP.js} +62 -62
  33. package/dist/{records-B4yl2oIu.js.map → records-CR_pYzIP.js.map} +1 -1
  34. package/dist/{runtime-Cz1GJa_O.js → runtime-cHv1phcc.js} +379 -31
  35. package/dist/runtime-cHv1phcc.js.map +1 -0
  36. package/dist/runtime.d.ts +1 -1
  37. package/dist/runtime.js +6 -6
  38. package/dist/{shell-kq9p4VsX.js → shell-BDuZf2zb.js} +4 -4
  39. package/dist/{shell-kq9p4VsX.js.map → shell-BDuZf2zb.js.map} +1 -1
  40. package/dist/shell.js +4 -4
  41. package/dist/styles.css +147 -307
  42. package/dist/types/components.d.ts +2 -0
  43. package/dist/{useExperimentSamples-BLx29CkM.js → useExperimentSamples-Dno1fFMq.js} +3 -3
  44. package/dist/{useExperimentSamples-BLx29CkM.js.map → useExperimentSamples-Dno1fFMq.js.map} +1 -1
  45. package/dist/{useListReorder-C_8RYeVP.js → useListReorder-CQ9OCScc.js} +76 -76
  46. package/dist/useListReorder-CQ9OCScc.js.map +1 -0
  47. package/dist/{useRackEditor-BhYlXKFM.js → useRackEditor-wL3kPrRT.js} +6 -6
  48. package/dist/{useRackEditor-BhYlXKFM.js.map → useRackEditor-wL3kPrRT.js.map} +1 -1
  49. package/dist/useRealtime-BW02xy4Z.js +398 -0
  50. package/dist/useRealtime-BW02xy4Z.js.map +1 -0
  51. package/dist/{useRequest-C9uwM79q.js → useRequest-CDkrXNU7.js} +2 -2
  52. package/dist/{useRequest-C9uwM79q.js.map → useRequest-CDkrXNU7.js.map} +1 -1
  53. package/package.json +1 -1
  54. package/src/__tests__/components/AppTopBar.test.ts +33 -2
  55. package/src/__tests__/components/GeneratedPluginView.test.ts +1 -1
  56. package/src/__tests__/components/JobsStatusTray.test.ts +137 -71
  57. package/src/__tests__/components/PluginWorkspaceView.test.ts +56 -1
  58. package/src/__tests__/composables/useJobCenter.test.ts +223 -3
  59. package/src/__tests__/docs/frontendDocsCatalog.test.ts +3 -3
  60. package/src/components/AppTopBar.vue +14 -0
  61. package/src/components/GeneratedPluginView.vue +4 -9
  62. package/src/components/JobsStatusTray.story.vue +78 -43
  63. package/src/components/JobsStatusTray.vue +171 -279
  64. package/src/components/PluginWorkspaceView.props.ts +3 -0
  65. package/src/components/PluginWorkspaceView.vue +17 -0
  66. package/src/components/internal/WorkspaceShellInternal.vue +12 -0
  67. package/src/composables/useJobCenter.ts +127 -6
  68. package/src/runtime.ts +0 -1
  69. package/src/styles/components/app-top-bar.css +7 -0
  70. package/src/styles/components/jobs-status-tray.css +129 -296
  71. package/src/types/components.ts +2 -0
  72. package/dist/AppSidebar-CB0-RQ4m.js.map +0 -1
  73. package/dist/runtime-Cz1GJa_O.js.map +0 -1
  74. package/dist/useListReorder-C_8RYeVP.js.map +0 -1
  75. package/dist/useRealtime-CUMbW_ln.js +0 -699
  76. package/dist/useRealtime-CUMbW_ln.js.map +0 -1
@@ -1,8 +1,6 @@
1
+ /* The compact jobs panel of design v2: opened from the top-bar run slot, one list
2
+ (Active, then Finished), one row per job. Non-modal: the page is not dimmed. */
1
3
  .mint-jobs-tray {
2
- position: fixed;
3
- right: max(1.25rem, env(safe-area-inset-right));
4
- bottom: max(1.25rem, env(safe-area-inset-bottom));
5
- z-index: 1000;
6
4
  color: var(--text-primary);
7
5
  font-family: var(--font-sans);
8
6
  }
@@ -12,146 +10,79 @@
12
10
  --border-light: var(--border-color);
13
11
  }
14
12
 
15
- .mint-jobs-tray__trigger {
16
- display: inline-flex;
17
- min-height: 2.75rem;
18
- align-items: center;
19
- gap: 0.625rem;
20
- padding: 0.5rem 1rem;
21
- border: 0;
22
- border-radius: var(--radius-lg);
23
- background: var(--color-primary);
24
- color: var(--text-on-accent);
25
- box-shadow: var(--mint-shadow-pop);
26
- cursor: pointer;
27
- transition: background var(--mint-transition);
28
- }
29
-
30
- .mint-jobs-tray__trigger:hover {
31
- background: var(--color-primary-hover);
32
- }
33
-
34
- .mint-jobs-tray__trigger:focus-visible,
35
- .mint-jobs-tray__panel:focus-visible,
36
- .mint-jobs-tray button:focus-visible {
37
- outline: none;
38
- box-shadow: var(--focus-ring-offset);
39
- }
40
-
41
- .mint-jobs-tray__trigger-icon {
42
- width: 1.125rem;
43
- height: 1.125rem;
44
- stroke-width: 1.8;
45
- stroke-linecap: round;
46
- stroke-linejoin: round;
47
- }
48
-
49
- .mint-jobs-tray__trigger-icon--active {
50
- animation: mint-jobs-tray-pulse 1.8s ease-in-out infinite;
51
- }
52
-
53
- .mint-jobs-tray__trigger-label {
54
- font-size: 0.875rem;
55
- font-weight: 600;
56
- }
57
-
58
- .mint-jobs-tray__count,
59
- .mint-jobs-tray__tab-count {
60
- display: inline-flex;
61
- min-width: 1.25rem;
62
- height: 1.25rem;
63
- align-items: center;
64
- justify-content: center;
65
- padding: 0 0.375rem;
66
- border-radius: var(--radius-sm);
67
- font: 600 0.6875rem/1 var(--font-mono);
68
- }
69
-
70
- /* Inverted on the accent fill: accent ink on the on-accent colour, in both themes. */
71
- .mint-jobs-tray__count {
72
- background: var(--text-on-accent);
73
- color: var(--_ink-primary);
74
- }
75
-
76
- .mint-jobs-tray__backdrop {
13
+ /* Transparent: catches clicks outside the panel. */
14
+ .mint-jobs-tray__scrim {
77
15
  position: fixed;
78
16
  inset: 0;
79
- z-index: -2;
80
- background: rgb(15 23 42 / 0.22);
17
+ z-index: 999;
81
18
  }
82
19
 
83
20
  .mint-jobs-tray__panel {
84
- position: absolute;
85
- right: 0;
86
- bottom: 3.75rem;
21
+ position: fixed;
22
+ top: calc(4.5rem + env(safe-area-inset-top));
23
+ right: max(1rem, env(safe-area-inset-right));
24
+ z-index: 1000;
87
25
  display: flex;
88
- width: min(21.25rem, calc(100vw - 2rem));
89
- max-height: min(42rem, calc(100vh - 7rem));
26
+ width: min(360px, calc(100vw - 2rem));
27
+ max-height: 75vh;
90
28
  flex-direction: column;
91
29
  overflow: hidden;
92
30
  border: 1px solid var(--border-color);
93
31
  border-radius: var(--radius-lg);
94
32
  background: var(--bg-card);
95
33
  box-shadow: var(--mint-shadow-pop);
34
+ font-size: 0.8125rem;
96
35
  }
97
36
 
98
- .mint-jobs-tray__header,
99
- .mint-jobs-tray__job-heading,
100
- .mint-jobs-tray__job-footer,
101
- .mint-jobs-tray__header-actions,
102
- .mint-jobs-tray__clear-row {
103
- display: flex;
104
- align-items: center;
37
+ /* The panel takes focus only so Escape and Tab start inside it; it shows no ring. */
38
+ .mint-jobs-tray__panel:focus {
39
+ outline: none;
105
40
  }
106
41
 
107
- .mint-jobs-tray__header {
108
- justify-content: space-between;
109
- height: 2.5rem;
110
- padding: 0 0.5rem 0 0.75rem;
111
- border-bottom: 1px solid var(--border-color);
42
+ .mint-jobs-tray button:focus-visible {
43
+ outline: none;
44
+ box-shadow: var(--focus-ring);
112
45
  }
113
46
 
114
- .mint-jobs-tray__header > div:first-child {
47
+ .mint-jobs-tray__head {
115
48
  display: flex;
116
- align-items: baseline;
49
+ flex-shrink: 0;
50
+ align-items: center;
117
51
  gap: 0.5rem;
118
- min-width: 0;
52
+ height: 40px;
53
+ padding: 0 0.5rem 0 0.75rem;
54
+ border-bottom: 1px solid var(--border-color);
119
55
  }
120
56
 
121
57
  .mint-jobs-tray__title {
122
- flex-shrink: 0;
123
58
  margin: 0;
124
- color: var(--text-primary);
125
59
  font-size: 0.8125rem;
126
60
  font-weight: 600;
127
61
  white-space: nowrap;
128
62
  }
129
63
 
130
- .mint-jobs-tray__subtitle {
64
+ .mint-jobs-tray__head-count {
65
+ flex: 1;
131
66
  min-width: 0;
132
- margin: 0;
133
67
  overflow: hidden;
134
- color: var(--text-muted);
135
- font: 0.6875rem/1.3 var(--font-mono);
68
+ color: var(--text-secondary);
69
+ font-family: var(--font-mono);
70
+ font-size: 0.6875rem;
136
71
  text-overflow: ellipsis;
137
72
  white-space: nowrap;
138
73
  }
139
74
 
140
- .mint-jobs-tray__header-actions {
141
- gap: 0.25rem;
142
- }
143
-
144
75
  .mint-jobs-tray__icon-button {
145
- display: inline-flex;
146
- width: 2rem;
147
- height: 2rem;
148
- align-items: center;
149
- justify-content: center;
76
+ display: inline-grid;
77
+ width: 28px;
78
+ height: 28px;
79
+ flex-shrink: 0;
80
+ place-items: center;
150
81
  padding: 0;
151
82
  border: 0;
152
83
  border-radius: var(--radius-md);
153
84
  background: transparent;
154
- color: var(--text-secondary-strong);
85
+ color: var(--text-secondary);
155
86
  cursor: pointer;
156
87
  transition: background var(--mint-transition), color var(--mint-transition);
157
88
  }
@@ -161,175 +92,143 @@
161
92
  color: var(--text-primary);
162
93
  }
163
94
 
164
- .mint-jobs-tray__icon-button svg {
165
- width: 1rem;
166
- height: 1rem;
167
- stroke-width: 1.8;
168
- stroke-linecap: round;
169
- stroke-linejoin: round;
170
- }
171
-
172
- .mint-jobs-tray__icon-button--danger {
95
+ .mint-jobs-tray__icon-button--danger,
96
+ .mint-jobs-tray__icon-button--danger:hover {
173
97
  color: var(--mint-error);
174
98
  }
175
99
 
176
- .mint-jobs-tray__tabs {
177
- display: grid;
178
- grid-template-columns: 1fr 1fr;
179
- border-bottom: 1px solid var(--border-color);
180
- }
181
-
182
- .mint-jobs-tray__tab {
183
- position: relative;
184
- display: inline-flex;
185
- min-height: 2.75rem;
186
- align-items: center;
187
- justify-content: center;
188
- gap: 0.375rem;
189
- padding: 0.5rem 1rem;
190
- border: 0;
191
- background: transparent;
192
- color: var(--text-secondary-strong);
193
- font: 500 0.8125rem/1 var(--font-sans);
194
- cursor: pointer;
195
- }
196
-
197
- .mint-jobs-tray__tab--active {
198
- color: var(--_ink-primary);
199
- }
200
-
201
- .mint-jobs-tray__tab--active::after {
202
- position: absolute;
203
- right: 1rem;
204
- bottom: 0;
205
- left: 1rem;
206
- height: 2px;
207
- background: var(--color-primary);
208
- content: '';
209
- }
210
-
211
- .mint-jobs-tray__tab-count {
212
- background: var(--bg-tertiary);
213
- color: currentColor;
214
- }
215
-
216
100
  .mint-jobs-tray__error {
217
- margin: 0.75rem 1rem;
218
- padding: 0.625rem 0.75rem;
101
+ margin: 0.5rem 0.75rem 0;
102
+ padding: 0.5rem 0.75rem;
219
103
  border: 1px solid var(--mint-error-border);
220
104
  border-radius: var(--radius-md);
221
105
  background: var(--mint-error-bg);
222
- color: var(--mint-error);
106
+ color: var(--_ink-error);
223
107
  font-size: 0.75rem;
224
108
  }
225
109
 
226
110
  .mint-jobs-tray__body {
227
111
  flex: 1;
112
+ min-height: 0;
228
113
  overflow-y: auto;
229
114
  scrollbar-color: var(--scrollbar-thumb) transparent;
230
115
  }
231
116
 
232
117
  .mint-jobs-tray__empty {
233
118
  margin: 0;
234
- padding: 3rem 1rem;
119
+ padding: 1.5rem 0.75rem;
235
120
  color: var(--text-secondary);
236
121
  text-align: center;
237
- font-size: 0.8125rem;
238
122
  }
239
123
 
240
- /* 2f: rows + hairlines, no card per job. */
241
- .mint-jobs-tray__job {
242
- padding: 0.625rem 0.75rem;
124
+ .mint-jobs-tray__section {
125
+ display: flex;
126
+ align-items: center;
127
+ gap: 0.375rem;
128
+ padding: 0.625rem 0.75rem 0.25rem;
129
+ color: var(--text-secondary);
130
+ font-size: 0.6875rem;
131
+ font-weight: 600;
132
+ }
133
+
134
+ .mint-jobs-tray__section-count {
135
+ color: var(--text-muted);
136
+ font-family: var(--font-mono);
137
+ font-weight: 500;
138
+ }
139
+
140
+ .mint-jobs-tray__section-action {
141
+ margin-left: auto;
142
+ padding: 0;
143
+ border: 0;
144
+ border-radius: var(--radius-sm);
145
+ background: transparent;
146
+ color: var(--text-secondary);
147
+ font: inherit;
148
+ font-weight: 500;
149
+ cursor: pointer;
150
+ }
151
+
152
+ .mint-jobs-tray__section-action:hover {
153
+ color: var(--mint-error);
154
+ }
155
+
156
+ /* Rows + hairlines, no card per job. */
157
+ .mint-jobs-tray__row {
158
+ display: grid;
159
+ grid-template-columns: 16px minmax(0, 1fr) auto;
160
+ align-items: center;
161
+ gap: 0.25rem 0.625rem;
162
+ padding: 0.5rem 0.5rem 0.5rem 0.75rem;
243
163
  border-bottom: 1px solid var(--border-light);
244
164
  }
245
165
 
166
+ .mint-jobs-tray__row:hover {
167
+ background: var(--bg-hover);
168
+ }
169
+
246
170
  /* The one state that needs a person: tinted and pinned first. */
247
- .mint-jobs-tray__job--awaiting-input {
171
+ .mint-jobs-tray__row--awaiting-input,
172
+ .mint-jobs-tray__row--awaiting-input:hover {
248
173
  background: var(--mint-warning-bg);
249
174
  }
250
175
 
251
- .mint-jobs-tray__job-heading,
252
- .mint-jobs-tray__job-footer {
253
- justify-content: space-between;
254
- gap: 0.75rem;
176
+ .mint-jobs-tray__status {
177
+ color: var(--text-muted);
255
178
  }
256
179
 
257
- .mint-jobs-tray__job-identity {
258
- flex: 1;
259
- min-width: 0;
180
+ .mint-jobs-tray__status--running {
181
+ color: var(--color-primary);
182
+ animation: mint-jobs-tray-spin 1s linear infinite;
260
183
  }
261
184
 
262
- .mint-jobs-tray__job-select {
263
- display: block;
264
- max-width: 100%;
185
+ .mint-jobs-tray__status--awaiting-input { color: var(--mint-warning); }
186
+ .mint-jobs-tray__status--completed { color: var(--mint-success); }
187
+ .mint-jobs-tray__status--failed { color: var(--mint-error); }
188
+
189
+ @keyframes mint-jobs-tray-spin {
190
+ to { transform: rotate(360deg); }
191
+ }
192
+
193
+ .mint-jobs-tray__row-title {
194
+ min-width: 0;
265
195
  padding: 0;
266
196
  overflow: hidden;
267
197
  border: 0;
198
+ border-radius: var(--radius-sm);
268
199
  background: transparent;
269
200
  color: var(--text-primary);
270
- cursor: pointer;
271
- font-size: 0.8125rem;
201
+ font: inherit;
272
202
  font-weight: 500;
273
203
  text-align: left;
274
204
  text-overflow: ellipsis;
275
205
  white-space: nowrap;
206
+ cursor: pointer;
276
207
  }
277
208
 
278
- .mint-jobs-tray__kind {
279
- display: block;
280
- margin-top: 0.125rem;
281
- color: var(--text-secondary);
282
- font: 0.6875rem/1.3 var(--font-mono);
283
- }
284
-
285
- /* Status: tone dot + neutral text. Only "waiting for input" and "failed"
286
- color their text. */
287
- .mint-jobs-tray__status {
288
- display: inline-flex;
289
- flex: 0 0 auto;
209
+ .mint-jobs-tray__tools {
210
+ display: flex;
290
211
  align-items: center;
291
- gap: 0.375rem;
292
- color: var(--text-secondary-strong);
293
- font-size: 0.75rem;
294
- --mint-jobs-tray-tone: var(--text-muted);
212
+ gap: 2px;
295
213
  }
296
214
 
297
- .mint-jobs-tray__status-dot {
298
- width: 0.375rem;
299
- height: 0.375rem;
300
- border-radius: 9999px;
301
- background: var(--mint-jobs-tray-tone);
302
- }
303
-
304
- .mint-jobs-tray__status--running { --mint-jobs-tray-tone: var(--color-primary); }
305
- .mint-jobs-tray__status--completed { --mint-jobs-tray-tone: var(--mint-success); }
306
-
307
- .mint-jobs-tray__status--awaiting-input {
308
- --mint-jobs-tray-tone: var(--mint-warning);
309
- color: var(--mint-warning-text);
310
- font-weight: 600;
311
- }
312
-
313
- .mint-jobs-tray__status--failed {
314
- --mint-jobs-tray-tone: var(--mint-error);
315
- color: var(--_ink-error);
316
- }
317
-
318
- .mint-jobs-tray__percent {
319
- flex: 0 0 auto;
320
- min-width: 2.125rem;
321
- color: var(--text-primary);
215
+ .mint-jobs-tray__value {
216
+ margin-right: 0.375rem;
217
+ color: var(--text-secondary);
322
218
  font-family: var(--font-mono);
323
- font-size: 0.75rem;
219
+ font-size: 0.6875rem;
324
220
  font-variant-numeric: tabular-nums;
325
- text-align: right;
221
+ }
222
+
223
+ .mint-jobs-tray__progress,
224
+ .mint-jobs-tray__detail {
225
+ grid-column: 2 / 4;
326
226
  }
327
227
 
328
228
  .mint-jobs-tray__progress {
329
- height: 4px;
330
- margin-top: 0.375rem;
229
+ height: 2px;
331
230
  overflow: hidden;
332
- border-radius: 2px;
231
+ border-radius: 1px;
333
232
  background: var(--bg-tertiary);
334
233
  }
335
234
 
@@ -340,56 +239,17 @@
340
239
  transition: width var(--mint-transition);
341
240
  }
342
241
 
343
- .mint-jobs-tray__job-footer {
344
- min-height: 1.75rem;
345
- margin-top: 0.375rem;
242
+ .mint-jobs-tray__detail {
243
+ min-width: 0;
244
+ overflow: hidden;
346
245
  color: var(--text-secondary);
347
246
  font-size: 0.75rem;
247
+ text-overflow: ellipsis;
248
+ white-space: nowrap;
348
249
  }
349
250
 
350
- .mint-jobs-tray__action {
351
- min-height: 1.75rem;
352
- padding: 0.375rem 0.625rem;
353
- border: 1px solid var(--border-color);
354
- border-radius: var(--radius);
355
- background: var(--bg-secondary);
356
- color: var(--text-secondary-strong);
357
- font: 500 0.75rem/1 var(--font-sans);
358
- cursor: pointer;
359
- transition: background var(--mint-transition), border-color var(--mint-transition), color var(--mint-transition);
360
- }
361
-
362
- .mint-jobs-tray__job-actions {
363
- display: inline-flex;
364
- align-items: center;
365
- gap: 0.25rem;
366
- }
367
-
368
- /* 2f: the inline action of a row waiting for input is the primary one. */
369
- .mint-jobs-tray__job--awaiting-input .mint-jobs-tray__action:not(.mint-jobs-tray__action--danger) {
370
- border-color: var(--color-primary);
371
- background: var(--color-primary);
372
- color: var(--text-on-accent);
373
- }
374
-
375
- .mint-jobs-tray__job--awaiting-input .mint-jobs-tray__action:not(.mint-jobs-tray__action--danger):hover {
376
- border-color: var(--color-primary-hover);
377
- background: var(--color-primary-hover);
378
- }
379
-
380
- .mint-jobs-tray__action--danger {
381
- border-color: var(--mint-error-border);
382
- color: var(--mint-error);
383
- }
384
-
385
- .mint-jobs-tray__action--danger:hover {
386
- background: var(--mint-error-bg);
387
- }
388
-
389
- .mint-jobs-tray__clear-row {
390
- justify-content: flex-end;
391
- padding: 0.5rem 0.75rem;
392
- border-bottom: 1px solid var(--border-light);
251
+ .mint-jobs-tray__detail--error {
252
+ color: var(--_ink-error);
393
253
  }
394
254
 
395
255
  .mint-jobs-tray button:disabled {
@@ -397,12 +257,10 @@
397
257
  cursor: not-allowed;
398
258
  }
399
259
 
400
- /* Overlays fade in 180ms; no lift or scale (v2). */
260
+ /* Overlays fade in; no lift or scale (v2). */
401
261
  .mint-jobs-tray-fade-enter-active,
402
- .mint-jobs-tray-fade-leave-active,
403
- .mint-jobs-tray-slide-enter-active,
404
- .mint-jobs-tray-slide-leave-active {
405
- transition: opacity 180ms ease;
262
+ .mint-jobs-tray-fade-leave-active {
263
+ transition: opacity 150ms ease;
406
264
  }
407
265
 
408
266
  .mint-jobs-tray-fade-enter-from,
@@ -410,31 +268,6 @@
410
268
  opacity: 0;
411
269
  }
412
270
 
413
- .mint-jobs-tray-slide-enter-from,
414
- .mint-jobs-tray-slide-leave-to {
415
- opacity: 0;
416
- }
417
-
418
- @keyframes mint-jobs-tray-pulse {
419
- 50% { opacity: 0.55; }
420
- }
421
-
422
- @media (max-width: 480px) {
423
- .mint-jobs-tray {
424
- right: max(1rem, env(safe-area-inset-right));
425
- bottom: max(1rem, env(safe-area-inset-bottom));
426
- }
427
-
428
- .mint-jobs-tray__panel {
429
- position: fixed;
430
- right: 1rem;
431
- bottom: 4.75rem;
432
- left: 1rem;
433
- width: auto;
434
- max-height: calc(100vh - 6.75rem - env(safe-area-inset-bottom));
435
- }
436
- }
437
-
438
271
  @media (prefers-reduced-motion: reduce) {
439
272
  .mint-jobs-tray *,
440
273
  .mint-jobs-tray *::before,
@@ -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