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

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 (257) hide show
  1. package/dist/{ActionMenu-CScINahU.js → AlertBox-B2Bgr3ei.js} +40 -209
  2. package/dist/AlertBox-B2Bgr3ei.js.map +1 -0
  3. package/dist/{AppSidebar-BmiiPfz9.js → AppSidebar-Dq9W1jE2.js} +160 -109
  4. package/dist/AppSidebar-Dq9W1jE2.js.map +1 -0
  5. package/dist/{ConfirmDialog-CJ7hqYUP.js → ConfirmDialog-nbJj51is.js} +2 -2
  6. package/dist/{ConfirmDialog-CJ7hqYUP.js.map → ConfirmDialog-nbJj51is.js.map} +1 -1
  7. package/dist/ExperimentPopover-5T1fAq2L.js +337 -0
  8. package/dist/ExperimentPopover-5T1fAq2L.js.map +1 -0
  9. package/dist/{ExperimentSelectorModal-D-9z7cNx.js → ExperimentSelectorModal-65peG4Up.js} +198 -181
  10. package/dist/ExperimentSelectorModal-65peG4Up.js.map +1 -0
  11. package/dist/{SegmentedControl-DERBN-Xd.js → SegmentedControl-BtnnjWzs.js} +2 -2
  12. package/dist/{SegmentedControl-DERBN-Xd.js.map → SegmentedControl-BtnnjWzs.js.map} +1 -1
  13. package/dist/{SettingsModal-CSLE31yg.js → SettingsModal-483nyI6b.js} +9 -9
  14. package/dist/SettingsModal-483nyI6b.js.map +1 -0
  15. package/dist/components/AppSidebar.vue.d.ts +1 -1
  16. package/dist/components/ArtifactSaveDialog.vue.d.ts +9 -1
  17. package/dist/components/AuditTrail.vue.d.ts +1 -1
  18. package/dist/components/BaseSelect.vue.d.ts +2 -2
  19. package/dist/components/ChartContainer.vue.d.ts +2 -0
  20. package/dist/components/DatePicker.vue.d.ts +1 -1
  21. package/dist/components/ExperimentPopover.vue.d.ts +18 -0
  22. package/dist/components/ExperimentSelectorModal.vue.d.ts +0 -4
  23. package/dist/components/FilePicker.vue.d.ts +1 -1
  24. package/dist/components/FileUploader.vue.d.ts +2 -2
  25. package/dist/components/PluginIcon.vue.d.ts +2 -2
  26. package/dist/components/SampleSelector.vue.d.ts +6 -6
  27. package/dist/components/SequenceProgressBar.vue.d.ts +3 -0
  28. package/dist/components/StepWizard.vue.d.ts +3 -0
  29. package/dist/components/internal/AutoGroupModalInternal.vue.d.ts +1 -1
  30. package/dist/components/internal/DatePickerTimeInternal.vue.d.ts +1 -1
  31. package/dist/components/internal/ResourcePickerListInternal.vue.d.ts +2 -7
  32. package/dist/components/internal/SelectMultipleInternal.vue.d.ts +4 -0
  33. package/dist/composables/createClient.d.ts +2 -0
  34. package/dist/composables/index.d.ts +1 -0
  35. package/dist/composables/pluginIdentity.d.ts +24 -0
  36. package/dist/composables/useAppExperiment.d.ts +8 -0
  37. package/dist/composables/useCalendarGrid.d.ts +1 -1
  38. package/dist/composables/useExperimentSelector.d.ts +6 -2
  39. package/dist/composables/usePlatform.d.ts +1 -0
  40. package/dist/{controlSchemaModel-CP5-_nAj.js → controlSchemaModel-B8CTXagP.js} +2 -2
  41. package/dist/{controlSchemaModel-CP5-_nAj.js.map → controlSchemaModel-B8CTXagP.js.map} +1 -1
  42. package/dist/{data-C2PwI_dn.js → data-CgILxDLW.js} +178 -124
  43. package/dist/data-CgILxDLW.js.map +1 -0
  44. package/dist/data.js +8 -8
  45. package/dist/{experimentStatus-BZmU4czV.js → experimentStatus-Cqp6qNrR.js} +3 -3
  46. package/dist/{experimentStatus-BZmU4czV.js.map → experimentStatus-Cqp6qNrR.js.map} +1 -1
  47. package/dist/index.js +19 -19
  48. package/dist/{install-DAID6c2-.js → install-BtLWTk6H.js} +15 -14
  49. package/dist/{install-DAID6c2-.js.map → install-BtLWTk6H.js.map} +1 -1
  50. package/dist/install.js +1 -1
  51. package/dist/{lab-DLwRl_Ql.js → lab-MHzp-_J8.js} +128 -147
  52. package/dist/lab-MHzp-_J8.js.map +1 -0
  53. package/dist/lab.js +4 -3
  54. package/dist/{records-BzTcxekG.js → records-B6gpM_3e.js} +472 -274
  55. package/dist/records-B6gpM_3e.js.map +1 -0
  56. package/dist/{runtime-D6gVat6r.js → runtime-7vfl_bI3.js} +27 -31
  57. package/dist/runtime-7vfl_bI3.js.map +1 -0
  58. package/dist/runtime.js +6 -6
  59. package/dist/{shell-5ju97nOS.js → shell-Cs9OJMnm.js} +5 -5
  60. package/dist/{shell-5ju97nOS.js.map → shell-Cs9OJMnm.js.map} +1 -1
  61. package/dist/shell.js +5 -5
  62. package/dist/styles.css +1606 -1666
  63. package/dist/types/componentWorkflowTypes.d.ts +2 -0
  64. package/dist/types/generated/platformContext.d.ts +1 -0
  65. package/dist/types/generated-ui.d.ts +4 -0
  66. package/dist/{BaseModal-DfRIuVoj.js → useDropdownState-8yWMu-7_.js} +60 -2
  67. package/dist/useDropdownState-8yWMu-7_.js.map +1 -0
  68. package/dist/{useExperimentSamples-CxcnxZ8h.js → useExperimentSamples-DHnxKFAF.js} +3 -3
  69. package/dist/{useExperimentSamples-CxcnxZ8h.js.map → useExperimentSamples-DHnxKFAF.js.map} +1 -1
  70. package/dist/{useListReorder-CcbEYxX-.js → useListReorder-BitdUhxn.js} +109 -277
  71. package/dist/useListReorder-BitdUhxn.js.map +1 -0
  72. package/dist/{useRackEditor-BD5NIo5s.js → useRackEditor-DiwCt77M.js} +71 -57
  73. package/dist/useRackEditor-DiwCt77M.js.map +1 -0
  74. package/dist/{useRealtime-PalKue84.js → useRealtime-C3iy9QkU.js} +7 -4
  75. package/dist/useRealtime-C3iy9QkU.js.map +1 -0
  76. package/dist/useRequest-D506eHi8.js +244 -0
  77. package/dist/useRequest-D506eHi8.js.map +1 -0
  78. package/dist/utils/time.d.ts +7 -0
  79. package/package.json +1 -1
  80. package/src/__tests__/components/AppTopBar.test.ts +51 -2
  81. package/src/__tests__/components/AppTopBarPillNav.test.ts +35 -0
  82. package/src/__tests__/components/ArtifactSaveDialog.test.ts +78 -0
  83. package/src/__tests__/components/BaseSelect.multiple.test.ts +87 -32
  84. package/src/__tests__/components/BaseSelect.test.ts +2 -1
  85. package/src/__tests__/components/BatchProgressList.test.ts +16 -0
  86. package/src/__tests__/components/CalendarGridPanel.test.ts +2 -2
  87. package/src/__tests__/components/ChartContainer.test.ts +11 -0
  88. package/src/__tests__/components/ChemicalFormula.test.ts +6 -3
  89. package/src/__tests__/components/DatePicker.datetime.test.ts +6 -0
  90. package/src/__tests__/components/DatePicker.test.ts +21 -0
  91. package/src/__tests__/components/DatePicker.time.test.ts +2 -2
  92. package/src/__tests__/components/EmptyState.test.ts +1 -1
  93. package/src/__tests__/components/ExperimentPopover.test.ts +125 -16
  94. package/src/__tests__/components/ExperimentSelectorModal.test.ts +119 -13
  95. package/src/__tests__/components/GeneratedPluginView.test.ts +22 -1
  96. package/src/__tests__/components/InstrumentStateBadge.test.ts +4 -4
  97. package/src/__tests__/components/ResourcePickerListInternal.test.ts +0 -20
  98. package/src/__tests__/components/SampleSelector.test.ts +13 -8
  99. package/src/__tests__/components/SequenceProgressBar.test.ts +12 -0
  100. package/src/__tests__/components/StepWizard.test.ts +11 -0
  101. package/src/__tests__/components/WellPlate.decoration.test.ts +11 -4
  102. package/src/__tests__/components/deprecationTags.test.ts +1 -1
  103. package/src/__tests__/composables/useAppExperiment.test.ts +27 -1
  104. package/src/__tests__/composables/useCalendarGrid.test.ts +4 -2
  105. package/src/__tests__/composables/useExperimentSelector.test.ts +111 -0
  106. package/src/__tests__/styles/baseControlsRules.test.ts +6 -2
  107. package/src/__tests__/styles/controlRefreshRules.test.ts +0 -6
  108. package/src/__tests__/styles/cssTokens.test.ts +2 -2
  109. package/src/__tests__/styles/menusShellRefresh.test.ts +14 -10
  110. package/src/__tests__/utils/plotlyTemplate.test.ts +4 -4
  111. package/src/__tests__/utils/time.test.ts +18 -1
  112. package/src/components/AdductText.story.vue +7 -0
  113. package/src/components/AdductText.vue +1 -1
  114. package/src/components/AlertBox.story.vue +2 -2
  115. package/src/components/AlertBox.vue +18 -16
  116. package/src/components/AppSidebar.story.vue +0 -28
  117. package/src/components/AppTopBar.story.vue +47 -12
  118. package/src/components/AppTopBar.vue +118 -114
  119. package/src/components/ArtifactSaveDialog.story.vue +23 -0
  120. package/src/components/ArtifactSaveDialog.vue +102 -12
  121. package/src/components/AuditTrail.story.vue +2 -1
  122. package/src/components/AuditTrail.vue +2 -21
  123. package/src/components/Avatar.vue +10 -14
  124. package/src/components/BaseSelect.multiple.story.vue +13 -2
  125. package/src/components/BaseSelect.vue +4 -3
  126. package/src/components/BatchProgressList.vue +35 -25
  127. package/src/components/ChartContainer.story.vue +2 -1
  128. package/src/components/ChartContainer.vue +8 -6
  129. package/src/components/ConfirmDialog.story.vue +1 -1
  130. package/src/components/EmptyState.vue +1 -1
  131. package/src/components/ExperimentPopover.story.vue +165 -53
  132. package/src/components/ExperimentPopover.vue +169 -187
  133. package/src/components/ExperimentSelectorModal.story.vue +40 -36
  134. package/src/components/ExperimentSelectorModal.vue +124 -110
  135. package/src/components/FormField.story.vue +8 -48
  136. package/src/components/GeneratedPluginView.vue +7 -1
  137. package/src/components/InstrumentStateBadge.vue +1 -1
  138. package/src/components/JobsStatusTray.vue +1 -1
  139. package/src/components/LoadingSpinner.vue +1 -1
  140. package/src/components/NumberInput.vue +3 -6
  141. package/src/components/PluginIcon.story.vue +2 -10
  142. package/src/components/PluginIcon.vue +2 -2
  143. package/src/components/PluginWorkspaceView.story.vue +1 -1
  144. package/src/components/RuntimeUpdateNotice.vue +1 -1
  145. package/src/components/SampleSelector.story.vue +1 -1
  146. package/src/components/SampleSelector.vue +27 -37
  147. package/src/components/SampleSelectorGroupNode.vue +1 -1
  148. package/src/components/SectionCard.story.vue +2 -2
  149. package/src/components/SequenceProgressBar.story.vue +9 -0
  150. package/src/components/SequenceProgressBar.vue +6 -1
  151. package/src/components/SettingsModal.schema.ts +1 -1
  152. package/src/components/SettingsModal.vue +2 -2
  153. package/src/components/SmartGroupFieldRecipe.story.vue +1 -1
  154. package/src/components/SmartGroupManual.story.vue +1 -1
  155. package/src/components/StepWizard.story.vue +33 -0
  156. package/src/components/StepWizard.vue +8 -1
  157. package/src/components/WellPlate.story.vue +3 -1
  158. package/src/components/WellPlate.vue +7 -0
  159. package/src/components/internal/AppTopBarPillNavInternal.vue +33 -2
  160. package/src/components/internal/DatePickerDateInternal.vue +16 -40
  161. package/src/components/internal/DatePickerDateTimeInternal.vue +3 -13
  162. package/src/components/internal/DatePickerTimeInternal.vue +5 -8
  163. package/src/components/internal/ResourcePickerListInternal.vue +45 -85
  164. package/src/components/internal/SelectMultipleInternal.vue +182 -65
  165. package/src/components/internal/SelectSearchableInternal.vue +2 -3
  166. package/src/composables/createClient.ts +2 -0
  167. package/src/composables/index.ts +1 -0
  168. package/src/composables/pluginIdentity.ts +31 -0
  169. package/src/composables/useAppExperiment.ts +20 -0
  170. package/src/composables/useCalendarGrid.ts +4 -3
  171. package/src/composables/useExperimentSelector.ts +77 -31
  172. package/src/styles/components/adduct-text.css +13 -5
  173. package/src/styles/components/alert-box.css +39 -58
  174. package/src/styles/components/app-layout.css +6 -5
  175. package/src/styles/components/app-page-selector.css +3 -1
  176. package/src/styles/components/app-pill-nav.css +11 -12
  177. package/src/styles/components/app-sidebar.css +9 -18
  178. package/src/styles/components/app-top-bar.css +57 -55
  179. package/src/styles/components/artifact-save-dialog.css +153 -2
  180. package/src/styles/components/audit-trail.css +16 -19
  181. package/src/styles/components/avatar.css +6 -4
  182. package/src/styles/components/batch-progress-list.css +38 -36
  183. package/src/styles/components/button.css +28 -59
  184. package/src/styles/components/calendar.css +12 -12
  185. package/src/styles/components/chart-container.css +34 -23
  186. package/src/styles/components/checkbox.css +2 -12
  187. package/src/styles/components/collapsible-card.css +27 -29
  188. package/src/styles/components/confirm-dialog.css +13 -14
  189. package/src/styles/components/dataframe.css +12 -4
  190. package/src/styles/components/date-picker.css +80 -92
  191. package/src/styles/components/datetime-picker.css +31 -43
  192. package/src/styles/components/divider.css +20 -20
  193. package/src/styles/components/dose-calculator.css +3 -3
  194. package/src/styles/components/empty-state.css +20 -17
  195. package/src/styles/components/experiment-code-badge.css +2 -0
  196. package/src/styles/components/experiment-popover.css +174 -329
  197. package/src/styles/components/experiment-selector-modal.css +75 -56
  198. package/src/styles/components/file-picker.css +3 -3
  199. package/src/styles/components/file-uploader.css +38 -49
  200. package/src/styles/components/form-builder.css +3 -3
  201. package/src/styles/components/formula-input.css +1 -1
  202. package/src/styles/components/icon-button.css +18 -24
  203. package/src/styles/components/input.css +5 -4
  204. package/src/styles/components/instrument-monitor.css +13 -15
  205. package/src/styles/components/jobs-status-tray.css +31 -25
  206. package/src/styles/components/modal.css +2 -4
  207. package/src/styles/components/molecule-input.css +2 -2
  208. package/src/styles/components/multi-select.css +65 -117
  209. package/src/styles/components/number-input.css +26 -19
  210. package/src/styles/components/pill.css +3 -2
  211. package/src/styles/components/plate-editor.css +0 -1
  212. package/src/styles/components/plugin-icon.css +26 -23
  213. package/src/styles/components/popover.css +2 -2
  214. package/src/styles/components/presence-avatars.css +1 -1
  215. package/src/styles/components/protocol-step-editor.css +1 -3
  216. package/src/styles/components/resource-card.css +2 -2
  217. package/src/styles/components/resource-picker-list.css +6 -57
  218. package/src/styles/components/sample-hierarchy-tree.css +4 -4
  219. package/src/styles/components/sample-selector.css +95 -79
  220. package/src/styles/components/schedule-calendar.css +8 -8
  221. package/src/styles/components/searchable-select.css +12 -12
  222. package/src/styles/components/section-card.css +28 -47
  223. package/src/styles/components/segmented-control.css +18 -15
  224. package/src/styles/components/select.css +3 -3
  225. package/src/styles/components/sequence-input.css +2 -2
  226. package/src/styles/components/sequence-progress-bar.css +17 -8
  227. package/src/styles/components/smart-group.css +18 -18
  228. package/src/styles/components/step-wizard.css +52 -16
  229. package/src/styles/components/tabs.css +2 -2
  230. package/src/styles/components/textarea.css +3 -3
  231. package/src/styles/components/time-picker.css +36 -21
  232. package/src/styles/components/toast.css +12 -10
  233. package/src/styles/components/toggle.css +1 -11
  234. package/src/styles/components/tooltip.css +10 -9
  235. package/src/styles/components/unit-input.css +8 -7
  236. package/src/styles/components/well-plate.css +9 -2
  237. package/src/styles/variables.css +106 -75
  238. package/src/types/componentWorkflowTypes.ts +2 -0
  239. package/src/types/generated/platformContext.ts +1 -0
  240. package/src/types/generated-ui.ts +4 -0
  241. package/src/utils/time.ts +21 -0
  242. package/dist/ActionMenu-CScINahU.js.map +0 -1
  243. package/dist/AppSidebar-BmiiPfz9.js.map +0 -1
  244. package/dist/BaseModal-DfRIuVoj.js.map +0 -1
  245. package/dist/ExperimentPopover-C4sGw-is.js +0 -359
  246. package/dist/ExperimentPopover-C4sGw-is.js.map +0 -1
  247. package/dist/ExperimentSelectorModal-D-9z7cNx.js.map +0 -1
  248. package/dist/SettingsModal-CSLE31yg.js.map +0 -1
  249. package/dist/data-C2PwI_dn.js.map +0 -1
  250. package/dist/lab-DLwRl_Ql.js.map +0 -1
  251. package/dist/records-BzTcxekG.js.map +0 -1
  252. package/dist/runtime-D6gVat6r.js.map +0 -1
  253. package/dist/useListReorder-CcbEYxX-.js.map +0 -1
  254. package/dist/useRackEditor-BD5NIo5s.js.map +0 -1
  255. package/dist/useRealtime-PalKue84.js.map +0 -1
  256. package/dist/useRequest-D5JDfsgZ.js +0 -76
  257. package/dist/useRequest-D5JDfsgZ.js.map +0 -1
@@ -1,95 +1,72 @@
1
- /* ExperimentPopover — aligned with refresh design (AppTopBar page selector) */
1
+ /* ExperimentPopover — top-bar experiment control (design v2).
2
+ With Save shown, trigger and Save join into one bordered group:
3
+ [ code name ▾ | Save ]. Flat: no lift, no glow, no coloured shadow. */
2
4
 
3
5
  /* Container */
4
6
  .mint-experiment-popover {
5
7
  position: relative;
6
- }
7
-
8
- /* Split trigger container */
9
- .mint-experiment-popover__split {
10
8
  display: inline-flex;
11
- align-items: stretch;
9
+ min-width: 0;
12
10
  }
13
11
 
14
- /* When split has save, trigger loses its right border and radii so it meets
15
- the save button flush. */
16
- .mint-experiment-popover__split--with-save .mint-experiment-popover__trigger {
17
- border-right: none;
18
- border-top-right-radius: 0;
19
- border-bottom-right-radius: 0;
12
+ /* Joined group — one border around both halves; the trigger drops its own. */
13
+ .mint-experiment-popover--save {
14
+ border: 1px solid var(--border-color);
15
+ border-radius: var(--radius-md);
16
+ background: var(--bg-card);
20
17
  }
21
18
 
22
- /* ─── Trigger (left / main chip) ───
23
- Shows the experiment name, truncated to preserve topbar density. */
19
+ /* ─── Trigger ───
20
+ Code badge + name, truncated at maxNameWidth (inline style). */
24
21
  .mint-experiment-popover__trigger {
25
22
  display: inline-flex;
26
23
  align-items: center;
27
24
  gap: 0.5rem;
28
- height: var(--form-height-sm);
29
- padding: 0 0.75rem;
30
- border: 1px solid var(--border-color);
31
- background: var(--bg-card);
25
+ min-width: 0;
26
+ height: 30px;
27
+ padding: 0 0.5rem 0 0.375rem;
28
+ border: 1px solid transparent;
32
29
  border-radius: var(--radius-md);
30
+ background: transparent;
33
31
  color: var(--text-primary);
32
+ font: inherit;
34
33
  font-size: 0.8125rem;
35
34
  font-weight: 500;
36
- font-family: inherit;
37
- cursor: pointer;
38
35
  white-space: nowrap;
39
- max-width: 220px;
36
+ cursor: pointer;
40
37
  box-sizing: border-box;
41
- transform: translateY(0);
42
38
  transition:
43
- background-color 0.15s var(--mint-ease-out-quart, cubic-bezier(0.25, 1, 0.5, 1)),
44
- border-color 0.15s var(--mint-ease-out-quart, cubic-bezier(0.25, 1, 0.5, 1)),
45
- box-shadow 0.15s var(--mint-ease-out-quart, cubic-bezier(0.25, 1, 0.5, 1)),
46
- transform 0.15s var(--mint-ease-out-quart, cubic-bezier(0.25, 1, 0.5, 1)),
47
- color 0.15s var(--mint-ease-out-quart, cubic-bezier(0.25, 1, 0.5, 1));
39
+ background-color var(--mint-transition),
40
+ color var(--mint-transition);
48
41
  }
49
42
 
50
- /* Hover (single-trigger mode) — lift + soft shadow. Gated :not(--active) so
51
- the chip doesn't bounce while its panel is open. */
52
- .mint-experiment-popover__split:not(.mint-experiment-popover__split--with-save)
53
- .mint-experiment-popover__trigger:hover:not(.mint-experiment-popover__trigger--active) {
54
- background: var(--bg-hover);
55
- box-shadow: var(--shadow-sm);
56
- transform: translateY(-1px);
43
+ .mint-experiment-popover--save .mint-experiment-popover__trigger {
44
+ border: 0;
45
+ border-radius: calc(var(--radius-md) - 1px) 0 0 calc(var(--radius-md) - 1px);
57
46
  }
58
47
 
59
- .mint-experiment-popover__split:not(.mint-experiment-popover__split--with-save)
60
- .mint-experiment-popover__trigger:active:not(.mint-experiment-popover__trigger--active) {
61
- transform: translateY(0);
62
- box-shadow: none;
63
- transition-duration: 0.05s;
48
+ .mint-experiment-popover__trigger:hover,
49
+ .mint-experiment-popover__trigger--active {
50
+ background: var(--bg-hover);
64
51
  }
65
52
 
66
- /* Active (panel open) — ring treatment, same language as the page selector */
67
- .mint-experiment-popover__trigger--active {
68
- border-color: var(--color-primary);
69
- box-shadow: 0 0 0 3px var(--color-primary-soft);
53
+ .mint-experiment-popover__trigger:focus-visible {
54
+ outline: none;
55
+ box-shadow: var(--focus-ring-offset);
70
56
  }
71
57
 
58
+ /* Empty — dashed "Attach experiment" chip; click selects directly. */
72
59
  .mint-experiment-popover__trigger--empty {
73
- color: var(--text-muted);
60
+ border: 1px dashed var(--border-strong);
61
+ color: var(--text-secondary);
74
62
  }
75
63
 
76
64
  .mint-experiment-popover__trigger-icon {
77
- width: 1rem;
78
- height: 1rem;
79
65
  flex-shrink: 0;
80
- color: var(--color-primary);
81
- }
82
-
83
- .mint-experiment-popover__trigger--empty .mint-experiment-popover__trigger-icon {
84
- color: var(--text-muted);
85
- }
86
-
87
- .mint-experiment-popover__trigger--active .mint-experiment-popover__trigger-icon {
88
- color: var(--color-primary);
89
66
  }
90
67
 
91
68
  .mint-experiment-popover__trigger-text {
92
- flex: 1;
69
+ flex: 0 1 auto;
93
70
  min-width: 0;
94
71
  overflow: hidden;
95
72
  text-overflow: ellipsis;
@@ -97,308 +74,239 @@
97
74
  text-align: left;
98
75
  }
99
76
 
100
- /* Experiment code fallback in the trigger — monospace, tabular */
101
- .mint-experiment-popover__trigger-code {
102
- font-family: var(--font-mono, 'Fira Code', monospace);
103
- font-size: 0.75rem;
104
- font-weight: 600;
105
- letter-spacing: -0.01em;
106
- color: var(--text-primary);
107
- font-variant-numeric: tabular-nums;
108
- }
109
-
110
- .mint-experiment-popover__trigger--empty .mint-experiment-popover__trigger-code {
77
+ .mint-experiment-popover__trigger-chevron {
78
+ flex-shrink: 0;
111
79
  color: var(--text-muted);
80
+ transition: transform var(--mint-transition);
112
81
  }
113
82
 
114
- .mint-experiment-popover__trigger--active .mint-experiment-popover__trigger-code {
115
- color: var(--color-primary);
83
+ .mint-experiment-popover__trigger--active .mint-experiment-popover__trigger-chevron {
84
+ transform: rotate(180deg);
116
85
  }
117
86
 
118
87
  /* ─── Unresolved states ───
119
- An experiment is bound but has no name yet. The chip must not read "No
120
- experiment", and it must never fall back to the numeric id — a name only
121
- ever comes from the platform. */
88
+ An experiment is bound but has no name yet. The chip must not read as empty,
89
+ and it must never fall back to the numeric id — a name only ever comes from
90
+ the platform. */
122
91
  .mint-experiment-popover__trigger--loading {
123
92
  cursor: progress;
124
93
  }
125
94
 
126
- .mint-experiment-popover__trigger--loading .mint-experiment-popover__trigger-icon {
127
- color: var(--text-muted);
128
- }
129
-
130
95
  .mint-experiment-popover__trigger--error {
131
96
  border-color: var(--mint-error-border);
132
97
  background: var(--mint-error-bg);
133
98
  color: var(--mint-error);
134
99
  }
135
100
 
136
- .mint-experiment-popover__trigger--error .mint-experiment-popover__trigger-icon,
137
101
  .mint-experiment-popover__trigger--error .mint-experiment-popover__trigger-chevron {
138
102
  color: var(--mint-error);
139
103
  }
140
104
 
141
105
  /* Placeholder bar standing in for the name while it resolves. */
142
106
  .mint-experiment-popover__trigger-skeleton {
143
- flex: 1;
144
- min-width: 4.5rem;
107
+ width: 7rem;
145
108
  height: 0.625rem;
146
109
  border-radius: var(--radius-sm);
147
110
  background-color: var(--bg-tertiary);
148
111
  animation: mint-skeleton-breathe 1.6s ease-in-out infinite; /* 3e breathe, keyframes in skeleton.css */
149
112
  }
150
113
 
151
- .mint-experiment-popover__trigger-chevron {
152
- width: 0.8125rem;
153
- height: 0.8125rem;
154
- flex-shrink: 0;
155
- color: var(--text-muted);
156
- transition: transform 0.2s var(--mint-ease-out-quart, cubic-bezier(0.25, 1, 0.5, 1)),
157
- color 0.15s var(--mint-ease-out-quart, cubic-bezier(0.25, 1, 0.5, 1));
158
- }
159
-
160
- .mint-experiment-popover__trigger--active .mint-experiment-popover__trigger-chevron {
161
- transform: rotate(180deg);
162
- color: var(--color-primary);
163
- }
164
-
165
- /* ─── Save trigger (right half of split) — filled-button treatment ─── */
166
- .mint-experiment-popover__save-trigger {
167
- display: flex;
114
+ /* ─── Save (right half of the group) — accent fill ─── */
115
+ .mint-experiment-popover__save {
116
+ position: relative;
117
+ display: inline-flex;
168
118
  align-items: center;
169
- justify-content: center;
170
- width: var(--form-height-sm);
171
- height: var(--form-height-sm);
172
- border: 1px solid var(--color-primary);
173
- border-left: 1px solid rgba(255, 255, 255, 0.25);
174
- background-color: var(--color-primary);
175
- border-top-right-radius: var(--radius-md);
176
- border-bottom-right-radius: var(--radius-md);
177
- color: white;
178
- cursor: pointer;
119
+ gap: 6px;
179
120
  flex-shrink: 0;
180
- box-sizing: border-box;
181
- transition:
182
- background-color 0.15s var(--mint-ease-out-quart, cubic-bezier(0.25, 1, 0.5, 1)),
183
- border-color 0.15s var(--mint-ease-out-quart, cubic-bezier(0.25, 1, 0.5, 1)),
184
- opacity 0.15s var(--mint-ease-out-quart, cubic-bezier(0.25, 1, 0.5, 1));
121
+ height: 30px;
122
+ padding: 0 12px 0 10px;
123
+ border: 0;
124
+ border-left: 1px solid var(--border-color);
125
+ border-radius: 0 calc(var(--radius-md) - 1px) calc(var(--radius-md) - 1px) 0;
126
+ background: var(--color-primary);
127
+ color: var(--text-on-accent);
128
+ font: inherit;
129
+ font-size: 0.8125rem;
130
+ font-weight: 600;
131
+ white-space: nowrap;
132
+ cursor: pointer;
133
+ transition: background-color var(--mint-transition), opacity var(--mint-transition);
185
134
  }
186
135
 
187
- .mint-experiment-popover__save-trigger--disabled {
188
- opacity: 0.4;
189
- cursor: not-allowed;
136
+ .mint-experiment-popover__save:hover:not(:disabled) {
137
+ background: var(--color-primary-hover);
190
138
  }
191
139
 
192
- .mint-experiment-popover__save-trigger--loading {
193
- opacity: 0.7;
194
- pointer-events: none;
140
+ .mint-experiment-popover__save:focus-visible {
141
+ outline: none;
142
+ box-shadow: var(--focus-ring-offset);
195
143
  }
196
144
 
197
- /* Success state: green surface */
198
- .mint-experiment-popover__save-trigger--success {
199
- background-color: var(--mint-success);
200
- border-color: var(--mint-success);
201
- border-left-color: rgba(255, 255, 255, 0.3);
145
+ .mint-experiment-popover__save--loading {
146
+ cursor: progress;
147
+ opacity: 0.85;
202
148
  }
203
149
 
204
- .mint-experiment-popover__save-trigger-icon {
205
- width: 0.9375rem;
206
- height: 0.9375rem;
150
+ .mint-experiment-popover__save--disabled {
151
+ cursor: not-allowed;
152
+ opacity: 0.4;
207
153
  }
208
154
 
209
- .mint-experiment-popover__spinner--inline {
210
- width: 0.8125rem;
211
- height: 0.8125rem;
212
- border: 2px solid rgba(255, 255, 255, 0.3);
213
- border-top-color: white;
214
- border-radius: 50%;
215
- animation: mint-experiment-popover-spin 0.6s linear infinite;
155
+ .mint-experiment-popover__save--success,
156
+ .mint-experiment-popover__save--success:hover:not(:disabled) {
157
+ background: var(--mint-success);
216
158
  }
217
159
 
218
- /* ─── Split unit ─── */
219
- /* No lift: the save half is flat like every filled control (3g, per 1d). */
220
-
221
- /* Per-half color-on-hover (only when the SPECIFIC half is being pointed at) */
222
- .mint-experiment-popover__split--with-save
223
- .mint-experiment-popover__trigger:hover:not(.mint-experiment-popover__trigger--active) {
224
- background: var(--bg-hover);
225
- border-color: var(--color-primary);
160
+ .mint-experiment-popover__save svg {
161
+ flex-shrink: 0;
226
162
  }
227
163
 
228
- .mint-experiment-popover__split--with-save
229
- .mint-experiment-popover__save-trigger:hover:not(:disabled):not(.mint-experiment-popover__save-trigger--disabled) {
230
- background-color: var(--color-primary-hover);
231
- border-color: var(--color-primary-hover);
164
+ .mint-experiment-popover__save-spinner {
165
+ animation: mint-experiment-popover-spin 1s linear infinite;
232
166
  }
233
167
 
234
- .mint-experiment-popover__split--with-save
235
- .mint-experiment-popover__save-trigger--success:hover:not(:disabled) {
236
- background-color: var(--mint-success-hover);
237
- border-color: var(--mint-success-hover);
168
+ /* Unsaved-changes dot, top-right, ringed in the accent. */
169
+ .mint-experiment-popover__dirty {
170
+ position: absolute;
171
+ top: 5px;
172
+ right: 5px;
173
+ width: 6px;
174
+ height: 6px;
175
+ border-radius: 50%;
176
+ background: var(--text-on-accent);
177
+ box-shadow: 0 0 0 1.5px var(--color-primary);
238
178
  }
239
179
 
240
- /* ─── Popover panel ─── */
180
+ /* ─── Panel ───
181
+ Left-aligned under the control and at least as wide as it; --end hangs it
182
+ from the right edge when the left-aligned panel would leave the viewport. */
241
183
  .mint-experiment-popover__panel {
242
184
  position: absolute;
243
- top: calc(100% + 0.5rem);
244
- right: 0;
245
- width: 17.5rem;
185
+ top: calc(100% + 4px);
186
+ left: 0;
187
+ z-index: 50;
188
+ width: 300px;
189
+ min-width: 100%;
190
+ padding: 4px;
246
191
  background: var(--bg-card);
247
192
  border: 1px solid var(--border-color);
248
193
  border-radius: var(--radius-lg);
249
- box-shadow: var(--shadow-md);
250
- z-index: 50;
251
- overflow: hidden;
194
+ box-shadow: var(--mint-shadow-pop);
195
+ box-sizing: border-box;
252
196
  }
253
197
 
254
- /* Header */
255
- .mint-experiment-popover__header {
256
- display: flex;
257
- flex-direction: column;
258
- gap: 0.125rem;
259
- padding: 0.75rem 1rem 0.5rem;
260
- border-bottom: 1px solid var(--border-light);
198
+ .mint-experiment-popover--save .mint-experiment-popover__panel {
199
+ top: calc(100% + 6px);
200
+ left: -1px;
261
201
  }
262
202
 
263
- .mint-experiment-popover__title {
264
- font-size: 0.8125rem;
265
- font-weight: 600;
266
- color: var(--text-primary);
203
+ .mint-experiment-popover__panel--end {
204
+ left: auto;
205
+ right: 0;
267
206
  }
268
207
 
269
- .mint-experiment-popover__subtitle {
270
- font-size: 0.6875rem;
271
- font-weight: 400;
272
- color: var(--text-muted);
208
+ .mint-experiment-popover--save .mint-experiment-popover__panel--end {
209
+ left: auto;
210
+ right: -1px;
273
211
  }
274
212
 
275
- .mint-experiment-popover__body {
276
- padding: 0.75rem 1rem;
213
+ .mint-experiment-popover__head {
214
+ display: flex;
215
+ flex-direction: column;
216
+ align-items: flex-start;
217
+ gap: 6px;
218
+ padding: 8px 8px 6px;
277
219
  }
278
220
 
279
- /* Select experiment button (no experiment state) */
280
- .mint-experiment-popover__select-btn {
221
+ .mint-experiment-popover__name {
281
222
  display: inline-flex;
282
223
  align-items: center;
283
- justify-content: center;
284
- gap: 0.375rem;
285
- width: 100%;
286
- height: 2.125rem;
287
- padding: 0 0.75rem;
288
- border: 1px solid var(--color-primary);
289
- background-color: var(--color-primary-soft);
290
- border-radius: var(--radius-md);
291
- color: var(--color-primary);
292
- font-size: 0.8125rem;
293
- font-weight: 500;
294
- font-family: inherit;
295
- cursor: pointer;
296
- transform: translateY(0);
297
- transition:
298
- background-color 0.15s var(--mint-ease-out-quart, cubic-bezier(0.25, 1, 0.5, 1)),
299
- box-shadow 0.15s var(--mint-ease-out-quart, cubic-bezier(0.25, 1, 0.5, 1)),
300
- transform 0.15s var(--mint-ease-out-quart, cubic-bezier(0.25, 1, 0.5, 1));
301
- }
302
-
303
- .mint-experiment-popover__select-btn:hover {
304
- background-color: var(--color-primary);
305
- color: white;
306
- box-shadow: var(--shadow-sm);
307
- transform: translateY(-1px);
224
+ gap: 6px;
225
+ font-size: 0.875rem;
226
+ font-weight: 600;
227
+ line-height: 1.3;
228
+ color: var(--text-primary);
229
+ overflow-wrap: anywhere;
308
230
  }
309
231
 
310
- .mint-experiment-popover__select-btn:active {
311
- transform: translateY(0);
312
- box-shadow: none;
313
- transition-duration: 0.05s;
232
+ .mint-experiment-popover__head--error .mint-experiment-popover__name {
233
+ color: var(--mint-error);
314
234
  }
315
235
 
316
- /* Experiment card (selected state) */
317
- .mint-experiment-popover__card {
318
- display: flex;
319
- align-items: flex-start;
320
- gap: 0.625rem;
321
- padding: 0.625rem;
322
- background: var(--bg-tertiary);
323
- border-radius: var(--radius-md);
236
+ .mint-experiment-popover__message {
237
+ font-size: 0.75rem;
238
+ line-height: 1.4;
239
+ color: var(--text-secondary);
240
+ overflow-wrap: anywhere;
324
241
  }
325
242
 
326
- .mint-experiment-popover__card-icon {
327
- width: 2rem;
328
- height: 2rem;
329
- flex-shrink: 0;
330
- border-radius: var(--radius-sm);
331
- background: var(--color-primary-soft);
243
+ .mint-experiment-popover__meta {
332
244
  display: grid;
333
- place-items: center;
245
+ grid-template-columns: 72px 1fr;
246
+ gap: 4px 8px;
247
+ margin: 0;
248
+ padding: 2px 8px 8px;
249
+ font-size: 0.75rem;
334
250
  }
335
251
 
336
- .mint-experiment-popover__card-icon svg {
337
- width: 1rem;
338
- height: 1rem;
339
- color: var(--color-primary);
252
+ .mint-experiment-popover__meta dt {
253
+ color: var(--text-muted);
340
254
  }
341
255
 
342
- .mint-experiment-popover__card-info {
343
- flex: 1;
256
+ .mint-experiment-popover__meta dd {
257
+ margin: 0;
344
258
  min-width: 0;
345
- display: flex;
346
- flex-direction: column;
347
- gap: 0.125rem;
259
+ color: var(--text-primary);
260
+ overflow-wrap: anywhere;
348
261
  }
349
262
 
350
- /* Experiment code in the card — small mono badge at the top of info */
351
- .mint-experiment-popover__card-code {
352
- align-self: flex-start;
353
- font-family: var(--font-mono, 'Fira Code', monospace);
354
- font-size: 0.6875rem;
355
- font-weight: 600;
356
- letter-spacing: 0.02em;
357
- color: var(--color-primary);
358
- background: var(--color-primary-soft);
359
- padding: 0.0625rem 0.375rem;
360
- border-radius: 9999px;
361
- line-height: 1.3;
362
- font-variant-numeric: tabular-nums;
263
+ .mint-experiment-popover__separator {
264
+ height: 1px;
265
+ margin: 4px -4px;
266
+ background: var(--border-light);
363
267
  }
364
268
 
365
- .mint-experiment-popover__card-name {
366
- font-size: 0.8125rem;
367
- font-weight: 600;
269
+ /* Full-width menu rows (Change / Open / Detach). */
270
+ .mint-experiment-popover__option {
271
+ display: flex;
272
+ align-items: center;
273
+ gap: 8px;
274
+ width: 100%;
275
+ min-height: 30px;
276
+ padding: 0 8px;
277
+ border: 0;
278
+ border-radius: var(--radius);
279
+ background: transparent;
368
280
  color: var(--text-primary);
369
- overflow: hidden;
370
- text-overflow: ellipsis;
371
- white-space: nowrap;
372
- line-height: 1.3;
373
- }
374
-
375
- .mint-experiment-popover__card-status {
376
- font-size: 0.6875rem;
377
- color: var(--text-muted);
378
- line-height: 1.3;
281
+ font: inherit;
282
+ font-size: 0.8125rem;
283
+ text-align: left;
284
+ text-decoration: none;
285
+ cursor: pointer;
286
+ box-sizing: border-box;
379
287
  }
380
288
 
381
- /* ─── Card: unresolved variants ─── */
382
- .mint-experiment-popover__card--error {
383
- background: var(--mint-error-bg);
289
+ .mint-experiment-popover__option:hover,
290
+ .mint-experiment-popover__option:focus-visible {
291
+ outline: none;
292
+ background: var(--bg-hover);
384
293
  }
385
294
 
386
- .mint-experiment-popover__card-icon--error {
387
- background: transparent;
295
+ .mint-experiment-popover__option:focus-visible {
296
+ box-shadow: var(--focus-ring);
388
297
  }
389
298
 
390
- .mint-experiment-popover__card-icon--error svg {
391
- color: var(--mint-error);
299
+ .mint-experiment-popover__option-icon {
300
+ flex-shrink: 0;
301
+ color: var(--text-muted);
392
302
  }
393
303
 
394
- .mint-experiment-popover__card-message {
395
- font-size: 0.6875rem;
396
- color: var(--text-secondary);
397
- line-height: 1.4;
398
- overflow-wrap: anywhere;
304
+ .mint-experiment-popover__option--danger,
305
+ .mint-experiment-popover__option--danger .mint-experiment-popover__option-icon {
306
+ color: var(--_ink-error);
399
307
  }
400
308
 
401
- /* Placeholder lines mirroring the code / name / status stack of a real card. */
309
+ /* Placeholder lines mirroring the code / name stack of a resolved header. */
402
310
  .mint-experiment-popover__skeleton-line {
403
311
  display: block;
404
312
  height: 0.625rem;
@@ -410,60 +318,10 @@
410
318
  .mint-experiment-popover__skeleton-line--code {
411
319
  width: 3.5rem;
412
320
  height: 0.75rem;
413
- border-radius: 9999px;
414
321
  }
415
322
 
416
323
  .mint-experiment-popover__skeleton-line--name {
417
324
  width: 100%;
418
- margin-top: 0.25rem;
419
- }
420
-
421
- .mint-experiment-popover__skeleton-line--status {
422
- width: 45%;
423
- margin-top: 0.25rem;
424
- }
425
-
426
- /* Action row sits BELOW the card (was inside) so the buttons have
427
- room to breathe and don't compete with the info stack. */
428
- .mint-experiment-popover__card-actions {
429
- display: flex;
430
- justify-content: flex-end;
431
- align-items: center;
432
- gap: 0.25rem;
433
- margin-top: 0.5rem;
434
- }
435
-
436
- .mint-experiment-popover__change-btn,
437
- .mint-experiment-popover__detach-btn {
438
- padding: 0.3125rem 0.625rem;
439
- border: none;
440
- background: transparent;
441
- border-radius: var(--radius-sm);
442
- font-size: 0.75rem;
443
- font-weight: 500;
444
- font-family: inherit;
445
- cursor: pointer;
446
- transition:
447
- background-color 0.15s var(--mint-ease-out-quart, cubic-bezier(0.25, 1, 0.5, 1)),
448
- color 0.15s var(--mint-ease-out-quart, cubic-bezier(0.25, 1, 0.5, 1));
449
- }
450
-
451
- .mint-experiment-popover__change-btn {
452
- color: var(--color-primary);
453
- }
454
-
455
- .mint-experiment-popover__change-btn:hover {
456
- background: var(--color-primary-soft);
457
- }
458
-
459
- .mint-experiment-popover__detach-btn {
460
- color: var(--text-muted);
461
- font-weight: 400;
462
- }
463
-
464
- .mint-experiment-popover__detach-btn:hover {
465
- color: var(--mint-error);
466
- background: rgba(239, 68, 68, 0.08);
467
325
  }
468
326
 
469
327
  @keyframes mint-experiment-popover-spin {
@@ -472,19 +330,6 @@
472
330
 
473
331
  /* Respect motion preferences */
474
332
  @media (prefers-reduced-motion: reduce) {
475
- .mint-experiment-popover__trigger,
476
- .mint-experiment-popover__save-trigger,
477
- .mint-experiment-popover__select-btn {
478
- transition-property: background-color, border-color, box-shadow, color, opacity;
479
- transition-duration: 0.15s;
480
- transition-timing-function: ease;
481
- }
482
- .mint-experiment-popover__trigger:hover,
483
- .mint-experiment-popover__trigger:active,
484
- .mint-experiment-popover__select-btn:hover,
485
- .mint-experiment-popover__select-btn:active {
486
- transform: none;
487
- }
488
333
  .mint-experiment-popover__trigger-chevron {
489
334
  transition: none;
490
335
  }