@morscherlab/mint-sdk 1.4.0-beta.9 → 1.4.0

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
@@ -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: calc(var(--mint-z-tray) - 1);
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: var(--mint-z-tray);
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);
295
- }
296
-
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);
212
+ gap: 2px;
302
213
  }
303
214
 
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,
@@ -445,3 +278,8 @@
445
278
  transition-duration: 0.01ms !important;
446
279
  }
447
280
  }
281
+
282
+ /* The tray's confirm dialog sits above the tray and its scrim (BaseModal drops class fallthrough). */
283
+ .mint-modal:has(.mint-jobs-tray__confirm) {
284
+ z-index: calc(var(--mint-z-tray) + 1);
285
+ }
@@ -1,26 +1,72 @@
1
+ /* The handle is the gap between two panels: its layout width (horizontal: height)
2
+ is the gap, --mint-layout-resize-gap or else --mint-gutter (8px compact, 12px
3
+ normal). It stretches along the panels, and its bar and a 12px hit area are
4
+ centred in it, the hit area drawn above the neighbouring panels. */
1
5
  .mint-layout-resize-handle {
2
- display: flex;
3
- flex-shrink: 0;
4
- align-items: center;
5
- justify-content: center;
6
+ --_size: var(--mint-layout-resize-gap, var(--mint-gutter, 0.75rem));
7
+ --_hit: 0.75rem;
8
+ position: relative;
9
+ z-index: 10;
10
+ flex: 0 0 auto;
11
+ align-self: stretch;
6
12
  background: transparent;
7
13
  cursor: col-resize;
14
+ outline: none;
8
15
  }
9
16
 
10
- .mint-layout-resize-handle--vertical { width: 1rem; min-height: 2.75rem; }
11
- .mint-layout-resize-handle--horizontal { min-width: 2.75rem; height: 1rem; cursor: row-resize; }
17
+ .mint-layout-resize-handle--vertical {
18
+ justify-self: center;
19
+ width: var(--_size);
20
+ min-height: 2.75rem;
21
+ }
22
+
23
+ .mint-layout-resize-handle--horizontal {
24
+ justify-self: stretch;
25
+ min-width: 2.75rem;
26
+ height: var(--_size);
27
+ cursor: row-resize;
28
+ }
29
+
30
+ /* Hit area and focus ring. Pointer events on it go to the handle. */
31
+ .mint-layout-resize-handle::before {
32
+ position: absolute;
33
+ border-radius: var(--radius-sm);
34
+ content: '';
35
+ }
36
+
37
+ .mint-layout-resize-handle--vertical::before {
38
+ top: 0;
39
+ bottom: 0;
40
+ left: 50%;
41
+ width: var(--_hit);
42
+ transform: translateX(-50%);
43
+ }
44
+
45
+ .mint-layout-resize-handle--horizontal::before {
46
+ top: 50%;
47
+ right: 0;
48
+ left: 0;
49
+ height: var(--_hit);
50
+ transform: translateY(-50%);
51
+ }
52
+
53
+ /* Edge handles lie outside the edge and cover exactly the gap. */
12
54
  .mint-layout-resize-handle--edge-left,
13
- .mint-layout-resize-handle--edge-right { position: absolute; top: 0; bottom: 0; z-index: 10; height: auto; }
55
+ .mint-layout-resize-handle--edge-right { position: absolute; top: 0; bottom: 0; }
14
56
  .mint-layout-resize-handle--edge-left { left: 0; transform: translateX(-100%); }
15
57
  .mint-layout-resize-handle--edge-right { right: 0; transform: translateX(100%); }
16
58
 
17
59
  .mint-layout-resize-handle__bar {
60
+ position: absolute;
61
+ top: 50%;
62
+ left: 50%;
18
63
  display: block;
19
64
  width: 0.25rem;
20
65
  height: 2.75rem;
21
66
  border-radius: 999px;
22
67
  background: var(--border-color);
23
68
  opacity: 0.72;
69
+ transform: translate(-50%, -50%);
24
70
  transition: background-color 150ms ease, opacity 150ms ease, transform 150ms ease;
25
71
  }
26
72
 
@@ -36,25 +82,22 @@
36
82
  }
37
83
 
38
84
  .mint-layout-resize-handle--vertical:hover .mint-layout-resize-handle__bar,
39
- .mint-layout-resize-handle--vertical:focus-visible .mint-layout-resize-handle__bar { transform: scaleX(1.35); }
85
+ .mint-layout-resize-handle--vertical:focus-visible .mint-layout-resize-handle__bar { transform: translate(-50%, -50%) scaleX(1.35); }
40
86
  .mint-layout-resize-handle--horizontal:hover .mint-layout-resize-handle__bar,
41
- .mint-layout-resize-handle--horizontal:focus-visible .mint-layout-resize-handle__bar { transform: scaleY(1.35); }
87
+ .mint-layout-resize-handle--horizontal:focus-visible .mint-layout-resize-handle__bar { transform: translate(-50%, -50%) scaleY(1.35); }
42
88
 
43
- .mint-layout-resize-handle:focus-visible {
89
+ .mint-layout-resize-handle:focus-visible::before {
44
90
  outline: 2px solid var(--color-primary);
45
- outline-offset: 2px;
91
+ outline-offset: -2px;
46
92
  }
47
93
 
48
- .mint-layout-resize-handle--edge-left:focus-visible,
49
- .mint-layout-resize-handle--edge-right:focus-visible { outline-offset: -2px; }
50
-
51
94
  .mint-layout-resize-handle[aria-disabled='true'] { cursor: not-allowed; opacity: 0.5; }
52
95
 
53
96
  @media (prefers-reduced-motion: reduce) {
54
97
  .mint-layout-resize-handle__bar { transition: none; }
55
98
  }
56
99
 
100
+ /* Touch: the handle reserves its full 2.75rem hit area in the layout. */
57
101
  @media (pointer: coarse) {
58
- .mint-layout-resize-handle--vertical { width: 2.75rem; }
59
- .mint-layout-resize-handle--horizontal { height: 2.75rem; }
102
+ .mint-layout-resize-handle { --_size: 2.75rem; --_hit: 2.75rem; }
60
103
  }
@@ -11,7 +11,7 @@
11
11
  .mint-modal {
12
12
  position: fixed;
13
13
  inset: 0;
14
- z-index: 50;
14
+ z-index: var(--mint-z-modal);
15
15
  display: flex;
16
16
  padding: 1rem;
17
17
  }
@@ -115,7 +115,7 @@
115
115
  width: 2.5rem;
116
116
  height: 3px;
117
117
  background-color: var(--border-color);
118
- border-radius: 9999px;
118
+ border-radius: var(--radius-sm);
119
119
  margin: 0.5rem auto 0;
120
120
  flex-shrink: 0;
121
121
  }
@@ -163,7 +163,7 @@
163
163
  width: 1.75rem;
164
164
  height: 1.75rem;
165
165
  padding: 0;
166
- border-radius: 0.4375rem;
166
+ border-radius: var(--radius-md);
167
167
  color: var(--text-secondary);
168
168
  background: none;
169
169
  border: none;