@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,51 +1,76 @@
1
- /* AppTopBar page selector — left-side route/page dropdown.
2
- Trigger speaks the field language (5a): 36px (the identity tile height), hover changes the background
3
- only, open = field focus, inline 12px chevron. The menu keeps the 1.2 panel
4
- (own card, tinted active row) rather than .mint-popover + .mint-menu-item. */
1
+ /* AppTopBar page selector — design v2 option C: "<plugin> / <page>" as one switcher.
2
+ The crumb holds the plugin name, a slash and the tinted 32px trigger. The menu keeps its own
3
+ card (not .mint-popover): a "<plugin> pages" title, then one row per page with its hint and number key. */
5
4
 
6
- /* Shrinks down to its inline min-width (11.25rem) so a crowded bar truncates the label instead of overlapping the nav. */
5
+ /* Shrinks with the bar: the plugin name and the page label truncate instead of overlapping the nav. */
6
+ .mint-page-selector__crumb {
7
+ display: inline-flex;
8
+ align-items: center;
9
+ gap: 0.375rem;
10
+ min-width: 0;
11
+ flex-shrink: 1;
12
+ }
13
+
14
+ .mint-page-selector__plugin {
15
+ min-width: 0;
16
+ font-size: 0.875rem;
17
+ font-weight: 600;
18
+ color: var(--text-primary);
19
+ white-space: nowrap;
20
+ overflow: hidden;
21
+ text-overflow: ellipsis;
22
+ }
23
+
24
+ .mint-page-selector__slash {
25
+ flex-shrink: 0;
26
+ font-size: 1.125rem;
27
+ font-weight: 300;
28
+ line-height: 1;
29
+ color: var(--text-muted);
30
+ }
31
+
32
+ /* Anchors the menu under the trigger, not under the plugin name. */
7
33
  .mint-page-selector {
8
34
  position: relative;
9
- flex-shrink: 1;
35
+ display: flex;
36
+ min-width: 0;
10
37
  }
11
38
 
12
39
  .mint-page-selector__trigger {
13
40
  display: inline-flex;
14
41
  align-items: center;
15
- gap: 0.5rem;
16
- width: 100%;
17
- height: 2.25rem;
18
- padding: 0 0.5rem 0 0.4375rem;
19
- border: 1px solid var(--border-color);
20
- background: var(--bg-card);
42
+ gap: 0.375rem;
43
+ min-width: 0;
44
+ max-width: 100%;
45
+ height: 2rem;
46
+ padding: 0 0.5rem 0 0.375rem;
47
+ border: 0;
48
+ background: var(--color-primary-soft);
21
49
  color: var(--text-primary);
22
50
  border-radius: var(--radius-md);
23
51
  font-size: 0.8125rem;
24
- font-weight: 500;
52
+ font-weight: 600;
25
53
  font-family: inherit;
26
54
  cursor: pointer;
27
55
  transition:
28
56
  background-color var(--mint-transition),
29
- border-color var(--mint-transition),
30
57
  box-shadow var(--mint-transition);
31
58
  }
32
59
 
33
- .mint-page-selector__trigger:hover:not(.mint-page-selector__trigger--open) {
34
- background: var(--bg-hover);
60
+ .mint-page-selector__trigger:hover {
61
+ background: color-mix(in srgb, var(--color-primary) 16%, transparent);
35
62
  }
36
63
 
37
- .mint-page-selector__trigger:focus-visible,
38
- .mint-page-selector__trigger--open {
64
+ .mint-page-selector__trigger:focus-visible {
39
65
  outline: none;
40
- border-color: var(--color-primary);
41
- box-shadow: var(--focus-ring-soft);
66
+ box-shadow: var(--focus-ring-offset);
42
67
  }
43
68
 
44
69
  /* Page icon tile is neutral; the plugin carries the color. */
45
70
  .mint-page-selector__icon {
46
71
  width: 1.25rem;
47
72
  height: 1.25rem;
48
- border-radius: var(--radius-sm);
73
+ border-radius: var(--radius);
49
74
  background: var(--bg-tertiary);
50
75
  color: var(--text-secondary-strong);
51
76
  display: grid;
@@ -66,7 +91,7 @@
66
91
  .mint-page-selector__trigger-metadata-icon.mint-plugin-icon--sm {
67
92
  width: 1.25rem;
68
93
  height: 1.25rem;
69
- border-radius: var(--radius-sm);
94
+ border-radius: var(--radius);
70
95
  }
71
96
 
72
97
  .mint-page-selector__icon-fallback {
@@ -76,7 +101,6 @@
76
101
  }
77
102
 
78
103
  .mint-page-selector__label {
79
- flex: 1;
80
104
  min-width: 0;
81
105
  text-align: left;
82
106
  white-space: nowrap;
@@ -84,7 +108,6 @@
84
108
  text-overflow: ellipsis;
85
109
  }
86
110
 
87
- /* The chevron sits inline; the wrap no longer draws a tile. */
88
111
  .mint-page-selector__chevron-wrap {
89
112
  display: inline-flex;
90
113
  color: var(--text-secondary);
@@ -101,38 +124,46 @@
101
124
  transform: rotate(180deg);
102
125
  }
103
126
 
127
+ /* max-height: 8 two-line hint rows (8 x 68px) + title (~25px) + padding (8px) = ~577px; a 9th row scrolls. A short window caps it. */
104
128
  .mint-page-selector__menu {
105
129
  position: absolute;
130
+ box-sizing: border-box;
106
131
  top: calc(100% + 0.375rem);
107
132
  left: 0;
108
- width: 16.25rem;
133
+ width: 18.75rem;
134
+ max-height: min(36.25rem, calc(100vh - 6rem));
135
+ overflow-y: auto;
109
136
  background: var(--bg-card);
110
137
  border: 1px solid var(--border-color);
111
138
  border-radius: var(--radius-lg);
112
139
  box-shadow: var(--shadow-md);
113
- padding: 0.375rem;
140
+ padding: 0.25rem;
114
141
  z-index: 50;
115
142
  }
116
143
 
144
+ /* The mockup's 10px uppercase eyebrow breaks rules 2a (no uppercase) and 8d (UI text >= 11px): 11px, sentence case. */
117
145
  .mint-page-selector__menu-title {
118
- padding: 0.375rem 0.625rem 0.5rem;
119
- font-size: 0.75rem;
146
+ padding: 0.375rem 0.5rem 0.25rem;
147
+ font-family: var(--font-mono);
148
+ font-size: 0.6875rem;
120
149
  font-weight: 500;
121
- color: var(--text-secondary);
150
+ letter-spacing: 0.06em;
151
+ color: var(--text-muted);
122
152
  }
123
153
 
124
154
  .mint-page-selector__item {
125
155
  display: flex;
126
- align-items: center;
156
+ box-sizing: border-box;
157
+ align-items: flex-start;
127
158
  gap: 0.625rem;
128
159
  width: 100%;
129
- padding: 0.5rem 0.625rem;
160
+ padding: 0.5rem;
130
161
  border: 0;
131
162
  background: transparent;
132
- border-radius: 0.4375rem;
163
+ border-radius: var(--radius);
133
164
  color: var(--text-primary);
134
165
  font-size: 0.8125rem;
135
- font-weight: 500;
166
+ line-height: 1.4;
136
167
  font-family: inherit;
137
168
  text-align: left;
138
169
  text-decoration: none;
@@ -140,13 +171,22 @@
140
171
  transition: background-color var(--mint-transition);
141
172
  }
142
173
 
143
- .mint-page-selector__item:hover:not(.mint-page-selector__item--disabled) {
174
+ /* A row without a hint has one line: centre it on the icon tile. */
175
+ .mint-page-selector__item:not(:has(.mint-page-selector__item-hint)) {
176
+ align-items: center;
177
+ }
178
+
179
+ .mint-page-selector__item:hover:not(.mint-page-selector__item--disabled):not(.mint-page-selector__item--active) {
144
180
  background: var(--bg-hover);
145
181
  }
146
182
 
183
+ .mint-page-selector__item:focus-visible {
184
+ outline: 2px solid var(--color-primary);
185
+ outline-offset: -2px;
186
+ }
187
+
147
188
  .mint-page-selector__item--active {
148
- background: var(--bg-tertiary);
149
- font-weight: 600;
189
+ background: var(--color-primary-soft);
150
190
  }
151
191
 
152
192
  .mint-page-selector__item--disabled {
@@ -155,9 +195,9 @@
155
195
  }
156
196
 
157
197
  .mint-page-selector__item-icon {
158
- width: 1.375rem;
159
- height: 1.375rem;
160
- border-radius: 0.3125rem;
198
+ width: 1.75rem;
199
+ height: 1.75rem;
200
+ border-radius: var(--radius-md);
161
201
  background: var(--bg-tertiary);
162
202
  color: var(--text-secondary);
163
203
  display: grid;
@@ -165,6 +205,10 @@
165
205
  flex-shrink: 0;
166
206
  }
167
207
 
208
+ .mint-page-selector__item-icon .mint-page-selector__icon-fallback {
209
+ font-size: 0.8125rem;
210
+ }
211
+
168
212
  .mint-page-selector__item--active .mint-page-selector__item-icon {
169
213
  background: var(--color-primary-soft);
170
214
  color: var(--color-primary);
@@ -177,24 +221,55 @@
177
221
  }
178
222
 
179
223
  .mint-page-selector__item-icon svg {
180
- width: 0.8125rem;
181
- height: 0.8125rem;
224
+ width: 0.9375rem;
225
+ height: 0.9375rem;
182
226
  }
183
227
 
184
228
  .mint-page-selector__metadata-icon.mint-plugin-icon--sm {
185
- width: 1.375rem;
186
- height: 1.375rem;
187
- border-radius: 0.3125rem;
229
+ width: 1.75rem;
230
+ height: 1.75rem;
231
+ border-radius: var(--radius-md);
188
232
  }
189
233
 
190
- .mint-page-selector__item-label {
234
+ .mint-page-selector__item-text {
191
235
  flex: 1;
192
236
  min-width: 0;
237
+ display: grid;
238
+ gap: 1px;
239
+ }
240
+
241
+ .mint-page-selector__item-label {
242
+ font-weight: 600;
193
243
  overflow: hidden;
194
244
  text-overflow: ellipsis;
195
245
  white-space: nowrap;
196
246
  }
197
247
 
248
+ /* --_ink-primary is --color-primary-hover in light mode and stays legible in dark mode. */
249
+ .mint-page-selector__item--active .mint-page-selector__item-label {
250
+ color: var(--_ink-primary);
251
+ }
252
+
253
+ .mint-page-selector__item-hint {
254
+ font-size: 0.75rem;
255
+ line-height: 1.35;
256
+ color: var(--text-secondary);
257
+ }
258
+
259
+ /* 11px, the rule 8d floor (the mockup has 10.5px). */
260
+ .mint-page-selector__item-key {
261
+ flex-shrink: 0;
262
+ margin-top: 0.125rem;
263
+ padding: 0 0.25rem;
264
+ border: 1px solid var(--border-color);
265
+ border-radius: var(--radius);
266
+ font-family: var(--font-mono);
267
+ font-size: 0.6875rem;
268
+ font-weight: 500;
269
+ line-height: 1rem;
270
+ color: var(--text-muted);
271
+ }
272
+
198
273
  @media (prefers-reduced-motion: reduce) {
199
274
  .mint-page-selector__trigger,
200
275
  .mint-page-selector__chevron {
@@ -110,10 +110,10 @@
110
110
  padding: 0 0.375rem 0 0;
111
111
  }
112
112
 
113
- /* Variant: card - flat floating card, inset by the layout gutter */
113
+ /* Variant: card - flat floating card, inset 16px from the window edge */
114
114
  .mint-topbar--card {
115
- width: calc(100% - 2 * var(--mint-gutter));
116
- margin: var(--mint-gutter) var(--mint-gutter) 0;
115
+ width: calc(100% - 2 * var(--mint-page-inset));
116
+ margin: var(--mint-page-inset) var(--mint-page-inset) 0;
117
117
  padding: 0.375rem 0.5rem 0.375rem 0.625rem;
118
118
  border-radius: var(--radius-lg);
119
119
  border: 1px solid var(--border-color);
@@ -231,3 +231,165 @@
231
231
  white-space: nowrap;
232
232
  user-select: none;
233
233
  }
234
+
235
+ /* ─── Run slot: [ experiment | job ] ───
236
+ While a job shows, one border wraps the experiment chip and the job
237
+ segment, as the experiment popover does for Save. The wrapper does not
238
+ clip: the popover panel and the focus rings reach outside it, so each
239
+ segment rounds its own outer corners. The idle Jobs button stands apart
240
+ with its own border. */
241
+ .mint-topbar__run-slot {
242
+ display: inline-flex;
243
+ align-items: center;
244
+ gap: 0.5rem;
245
+ min-width: 0;
246
+ }
247
+
248
+ .mint-topbar__run-slot--joined {
249
+ gap: 0;
250
+ border: 1px solid var(--border-color);
251
+ border-radius: var(--radius-md);
252
+ background: var(--bg-card);
253
+ }
254
+
255
+ .mint-topbar__run-slot--joined .mint-experiment-popover,
256
+ .mint-topbar__run-slot--joined .mint-experiment-popover__trigger {
257
+ border: 0;
258
+ border-radius: calc(var(--radius-md) - 1px) 0 0 calc(var(--radius-md) - 1px);
259
+ }
260
+
261
+ /* The job takes the name's place: the name folds away while the job grows in,
262
+ and the code badge stays. The name stays in the accessible name. A trigger
263
+ with no code, the empty placeholder and the error text keep their text. */
264
+ .mint-topbar__run-slot .mint-experiment-popover__trigger-text {
265
+ transition:
266
+ max-width 200ms ease,
267
+ opacity 150ms ease,
268
+ margin 200ms ease;
269
+ }
270
+
271
+ .mint-topbar__run-slot--joined
272
+ .mint-experiment-popover__trigger:has(.mint-exp-code)
273
+ .mint-experiment-popover__trigger-text {
274
+ max-width: 0 !important; /* beats the inline maxNameWidth */
275
+ margin-inline-start: -0.5rem; /* takes back the trigger gap */
276
+ opacity: 0;
277
+ }
278
+
279
+ .mint-topbar__job {
280
+ display: inline-flex;
281
+ max-width: 6rem; /* close to the content (icon + bar, or "Jobs"), so the fold is even */
282
+ overflow: hidden;
283
+ align-items: center;
284
+ gap: 0.375rem;
285
+ flex-shrink: 0;
286
+ height: 30px;
287
+ padding: 0 0.625rem;
288
+ border: 0;
289
+ background: transparent;
290
+ color: var(--text-secondary);
291
+ font: inherit;
292
+ font-size: 0.75rem;
293
+ font-weight: 500;
294
+ white-space: nowrap;
295
+ cursor: pointer;
296
+ transition: background-color var(--mint-transition);
297
+ }
298
+
299
+ .mint-topbar__run-slot--joined .mint-topbar__job {
300
+ border-radius: calc(var(--radius-md) - 1px);
301
+ }
302
+
303
+ .mint-topbar__run-slot--joined .mint-experiment-popover + .mint-topbar__job {
304
+ border-left: 1px solid var(--border-color);
305
+ border-radius: 0 calc(var(--radius-md) - 1px) calc(var(--radius-md) - 1px) 0;
306
+ }
307
+
308
+ .mint-topbar__job--idle {
309
+ height: 32px;
310
+ border: 1px solid var(--border-color);
311
+ border-radius: var(--radius-md);
312
+ background: var(--bg-card);
313
+ }
314
+
315
+ .mint-topbar__job--idle:hover,
316
+ .mint-topbar__job--neutral:hover {
317
+ background: var(--bg-hover);
318
+ }
319
+
320
+ .mint-topbar__job:focus-visible {
321
+ outline: none;
322
+ box-shadow: inset var(--focus-ring);
323
+ }
324
+
325
+ .mint-topbar__job--primary { background: var(--color-primary-soft); color: var(--_ink-primary); }
326
+ .mint-topbar__job--warning { background: var(--mint-warning-bg); color: var(--mint-warning-text); }
327
+ .mint-topbar__job--success { background: var(--mint-success-bg); color: color-mix(in srgb, var(--mint-success) 50%, var(--text-primary)); }
328
+ .mint-topbar__job--error { background: var(--mint-error-bg); color: var(--_ink-error); }
329
+
330
+ .mint-topbar__job--primary:hover,
331
+ .mint-topbar__job--warning:hover,
332
+ .mint-topbar__job--success:hover,
333
+ .mint-topbar__job--error:hover {
334
+ filter: brightness(0.97);
335
+ }
336
+
337
+ .mint-topbar__job-icon {
338
+ flex-shrink: 0;
339
+ }
340
+
341
+ .mint-topbar__job-count {
342
+ color: var(--text-muted);
343
+ font-family: var(--font-mono);
344
+ font-size: 0.6875rem;
345
+ font-variant-numeric: tabular-nums;
346
+ }
347
+
348
+ .mint-topbar__job-icon--spin {
349
+ animation: mint-topbar-job-spin 1s linear infinite;
350
+ }
351
+
352
+ @keyframes mint-topbar-job-spin {
353
+ to { transform: rotate(360deg); }
354
+ }
355
+
356
+ .mint-topbar__job-bar {
357
+ width: 2rem;
358
+ height: 4px;
359
+ border-radius: 2px;
360
+ background: var(--border-color);
361
+ overflow: hidden;
362
+ }
363
+
364
+ .mint-topbar__job-bar > span {
365
+ display: block;
366
+ height: 100%;
367
+ background: var(--color-primary);
368
+ transition: width var(--mint-transition);
369
+ }
370
+
371
+ /* Enter and leave: the job grows in from zero width and folds back out. */
372
+ .mint-topbar-job-enter-active,
373
+ .mint-topbar-job-leave-active {
374
+ transition:
375
+ max-width 200ms ease,
376
+ padding 200ms ease,
377
+ opacity 150ms ease;
378
+ }
379
+
380
+ .mint-topbar-job-enter-from,
381
+ .mint-topbar-job-leave-to {
382
+ max-width: 0;
383
+ padding-inline: 0;
384
+ opacity: 0;
385
+ }
386
+
387
+ /* Screen-reader only: announces status changes of the shown job. */
388
+ .mint-topbar__job-status {
389
+ position: absolute;
390
+ width: 1px;
391
+ height: 1px;
392
+ overflow: hidden;
393
+ clip-path: inset(50%);
394
+ white-space: nowrap;
395
+ }
@@ -150,6 +150,14 @@
150
150
  height: 1.25rem;
151
151
  }
152
152
 
153
+ /* Flex centring centres the line box, and Geist's ascender puts the caps
154
+ about 1.6px above the middle. Trim the text box to cap height and baseline
155
+ so the caps sit on the centre line. Browsers without text-box keep the
156
+ untrimmed box. */
157
+ .mint-button__label {
158
+ text-box: trim-both cap alphabetic;
159
+ }
160
+
153
161
  /* Spinner */
154
162
  .mint-button__spinner {
155
163
  animation: mint-button-spin 1s linear infinite;
@@ -357,7 +357,7 @@
357
357
  }
358
358
 
359
359
  .mint-dataframe__row:last-child .mint-dataframe__td {
360
- border-bottom: none;
360
+ border-bottom: none !important;
361
361
  }
362
362
 
363
363
  /* Empty / error placeholder host (content comes from EmptyState) */
@@ -130,11 +130,13 @@
130
130
  height: 0.875rem;
131
131
  }
132
132
 
133
- /* Calendar dropdown (teleported to body, positioned via JS). */
133
+ /* Calendar dropdown (teleported to body, positioned by useFloatingPanel). */
134
134
  .mint-date-picker__dropdown {
135
135
  position: fixed;
136
- z-index: 9999;
136
+ z-index: var(--mint-z-popover);
137
137
  width: 252px;
138
+ max-height: var(--mint-floating-available-height, none);
139
+ overflow-y: auto;
138
140
  padding: 0.5rem;
139
141
  }
140
142
 
@@ -97,12 +97,12 @@
97
97
  color: var(--text-muted);
98
98
  }
99
99
 
100
- /* Dropdown — placement only; the look is .mint-popover. */
100
+ /* Dropdown — the look is .mint-popover; useFloatingPanel sets the fixed position. */
101
101
  .mint-datetime-picker__dropdown {
102
- position: absolute;
103
- z-index: 50;
104
- margin-top: 0.25rem;
102
+ z-index: var(--mint-z-popover);
105
103
  width: 18rem;
104
+ max-height: var(--mint-floating-available-height, none);
105
+ overflow-y: auto;
106
106
  padding: 0.625rem;
107
107
  }
108
108
 
@@ -112,13 +112,26 @@
112
112
  }
113
113
 
114
114
  /* Footer with clear selection */
115
+ .mint-experiment-selector__description {
116
+ padding: 0 1.25rem 0.75rem;
117
+ font-size: 0.8125rem;
118
+ color: var(--text-secondary);
119
+ }
120
+
115
121
  .mint-experiment-selector__footer {
116
122
  display: flex;
123
+ align-items: center;
124
+ gap: 0.75rem;
117
125
  justify-content: flex-start;
118
126
  padding: 0.5rem 1.25rem 0.75rem;
119
127
  border-top: 1px solid var(--border-light);
120
128
  }
121
129
 
130
+ .mint-experiment-selector__footer-slot {
131
+ flex: 1;
132
+ min-width: 0;
133
+ }
134
+
122
135
  .mint-experiment-selector__clear-btn {
123
136
  padding: 0.25rem 0;
124
137
  border: none;