@morscherlab/mint-sdk 1.5.0-beta.1 → 1.5.0-beta.10

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 (174) hide show
  1. package/dist/{AlertBox-CIhqsWbN.js → AlertBox-Cai0w7gF.js} +3 -3
  2. package/dist/{AlertBox-CIhqsWbN.js.map → AlertBox-Cai0w7gF.js.map} +1 -1
  3. package/dist/{AppSidebar-BDrd7Kwn.js → AppSidebar-C-Vq5x4I.js} +410 -127
  4. package/dist/AppSidebar-C-Vq5x4I.js.map +1 -0
  5. package/dist/{ConfirmDialog-CjWoxAD1.js → ConfirmDialog-BjFsOpBe.js} +3 -3
  6. package/dist/ConfirmDialog-BjFsOpBe.js.map +1 -0
  7. package/dist/{ExperimentPopover-BM92LlrQ.js → ExperimentPopover-DYy_s0kI.js} +25 -37
  8. package/dist/ExperimentPopover-DYy_s0kI.js.map +1 -0
  9. package/dist/{ExperimentSelectorModal-LsB1ABmh.js → ExperimentSelectorModal-Bfh5bdkv.js} +37 -8
  10. package/dist/ExperimentSelectorModal-Bfh5bdkv.js.map +1 -0
  11. package/dist/{SegmentedControl-Dz41vAFM.js → SegmentedControl-B8KgyOjd.js} +2 -2
  12. package/dist/{SegmentedControl-Dz41vAFM.js.map → SegmentedControl-B8KgyOjd.js.map} +1 -1
  13. package/dist/{SettingsModal-C-MSR-bk.js → SettingsModal-DwfrD1ER.js} +7 -7
  14. package/dist/{SettingsModal-C-MSR-bk.js.map → SettingsModal-DwfrD1ER.js.map} +1 -1
  15. package/dist/__tests__/components/AppTopBarCompact.test.d.ts +1 -0
  16. package/dist/__tests__/components/AppTopBarCompactReset.test.d.ts +1 -0
  17. package/dist/__tests__/components/AutoGroupModal.experimentLoad.test.d.ts +1 -0
  18. package/dist/components/AppTopBar.compact.d.ts +5 -0
  19. package/dist/components/AppTopBar.vue.d.ts +17 -17
  20. package/dist/components/FormBuilder.vue.d.ts +1 -1
  21. package/dist/components/PluginIcon.vue.d.ts +2 -2
  22. package/dist/components/PluginWorkspaceView.vue.d.ts +4 -0
  23. package/dist/components/SectionCard.vue.d.ts +13 -1
  24. package/dist/components/SettingsModal.vue.d.ts +1 -1
  25. package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +2 -2
  26. package/dist/components/internal/FormSchemaInternal.vue.d.ts +9 -9
  27. package/dist/components/internal/FormSectionRenderer.vue.d.ts +4 -4
  28. package/dist/components/internal/LucideIconInternal.vue.d.ts +17 -0
  29. package/dist/composables/appLayoutSidebar.d.ts +9 -0
  30. package/dist/composables/useExperimentSelector.d.ts +2 -0
  31. package/dist/composables/useOnboarding.d.ts +1 -1
  32. package/dist/composables/usePluginWorkspace.d.ts +2 -0
  33. package/dist/composables/useVersionedSave.d.ts +5 -2
  34. package/dist/{controlSchemaModel-BbXbMgc6.js → controlSchemaModel-BtFNZj8t.js} +2 -2
  35. package/dist/{controlSchemaModel-BbXbMgc6.js.map → controlSchemaModel-BtFNZj8t.js.map} +1 -1
  36. package/dist/{data-LzdkEZJ-.js → data-CJztFns8.js} +31 -15
  37. package/dist/{data-LzdkEZJ-.js.map → data-CJztFns8.js.map} +1 -1
  38. package/dist/data.js +8 -8
  39. package/dist/{experimentStatus-DCn2QKG7.js → experimentStatus-Deokk7Br.js} +2 -2
  40. package/dist/{experimentStatus-DCn2QKG7.js.map → experimentStatus-Deokk7Br.js.map} +1 -1
  41. package/dist/index.d.ts +0 -1
  42. package/dist/index.js +15 -20
  43. package/dist/index.js.map +1 -1
  44. package/dist/{install-UTqrAgHe.js → install-Bk02tJ5M.js} +15 -40
  45. package/dist/install-Bk02tJ5M.js.map +1 -0
  46. package/dist/install.js +1 -1
  47. package/dist/{lab-CbdDLAVr.js → lab-BYhb_cJI.js} +47 -117
  48. package/dist/lab-BYhb_cJI.js.map +1 -0
  49. package/dist/lab.js +4 -4
  50. package/dist/{records-CWRztE5M.js → records-GtiVMlTQ.js} +207 -171
  51. package/dist/records-GtiVMlTQ.js.map +1 -0
  52. package/dist/{runtime-DrL6lKAb.js → runtime-aZPUPxoB.js} +112 -54
  53. package/dist/runtime-aZPUPxoB.js.map +1 -0
  54. package/dist/runtime.js +6 -6
  55. package/dist/{shell-Ch7cJnjo.js → shell-Bk9mD4Lc.js} +5 -5
  56. package/dist/{shell-Ch7cJnjo.js.map → shell-Bk9mD4Lc.js.map} +1 -1
  57. package/dist/shell.js +5 -5
  58. package/dist/styles.css +315 -134
  59. package/dist/styles.d.ts +1 -0
  60. package/dist/types/components.d.ts +22 -2
  61. package/dist/types/generated-ui.d.ts +2 -0
  62. package/dist/types/index.d.ts +2 -2
  63. package/dist/types/instrument.d.ts +5 -17
  64. package/dist/{useDropdownState-uFIz6Yv8.js → useDropdownState-CcBzUYZ6.js} +14 -5
  65. package/dist/useDropdownState-CcBzUYZ6.js.map +1 -0
  66. package/dist/{useExperimentSamples-Cz2v3V_q.js → useExperimentSamples-CpNXvpUn.js} +3 -3
  67. package/dist/{useExperimentSamples-Cz2v3V_q.js.map → useExperimentSamples-CpNXvpUn.js.map} +1 -1
  68. package/dist/{useListReorder-QqJc1dpX.js → useListReorder-Bp4EAI2w.js} +16 -4
  69. package/dist/useListReorder-Bp4EAI2w.js.map +1 -0
  70. package/dist/{useRackEditor-BHGM1Ngz.js → useRackEditor-i2bdPUFf.js} +156 -27
  71. package/dist/useRackEditor-i2bdPUFf.js.map +1 -0
  72. package/dist/{useRealtime-CNQbrS01.js → useRealtime-BLQEjbuq.js} +3 -3
  73. package/dist/{useRealtime-CNQbrS01.js.map → useRealtime-BLQEjbuq.js.map} +1 -1
  74. package/dist/useRequest-CXyPw3eh.js +76 -0
  75. package/dist/useRequest-CXyPw3eh.js.map +1 -0
  76. package/dist/utils/deprecation.d.ts +2 -0
  77. package/dist/utils/lucideIcon.d.ts +4 -0
  78. package/package.json +7 -4
  79. package/src/__tests__/components/AppTopBar.test.ts +102 -20
  80. package/src/__tests__/components/AppTopBarCompact.test.ts +65 -0
  81. package/src/__tests__/components/AppTopBarCompactReset.test.ts +24 -0
  82. package/src/__tests__/components/AppTopBarOnboarding.test.ts +10 -0
  83. package/src/__tests__/components/AutoGroupModal.experimentLoad.test.ts +58 -0
  84. package/src/__tests__/components/BaseModal.test.ts +33 -2
  85. package/src/__tests__/components/ConfirmDialog.test.ts +2 -2
  86. package/src/__tests__/components/ExperimentPopover.test.ts +32 -0
  87. package/src/__tests__/components/ExperimentSelectorModal.test.ts +16 -0
  88. package/src/__tests__/components/PluginWorkspaceView.test.ts +20 -1
  89. package/src/__tests__/components/SectionCard.test.ts +33 -0
  90. package/src/__tests__/components/deprecationTags.test.ts +4 -18
  91. package/src/__tests__/composables/useJobCenter.test.ts +35 -0
  92. package/src/__tests__/composables/useJobsEndpoint.test.ts +50 -0
  93. package/src/__tests__/composables/useOnboarding.test.ts +2 -2
  94. package/src/__tests__/composables/useVersionedSave.test.ts +71 -6
  95. package/src/__tests__/docs/frontendDocsCatalog.test.ts +3 -3
  96. package/src/__tests__/styles/menusShellRefresh.test.ts +10 -0
  97. package/src/components/AppLayout.story.vue +5 -5
  98. package/src/components/AppLayout.vue +13 -1
  99. package/src/components/AppSidebar.vue +2 -2
  100. package/src/components/AppTopBar.compact.ts +60 -0
  101. package/src/components/AppTopBar.story.vue +39 -14
  102. package/src/components/AppTopBar.vue +222 -89
  103. package/src/components/BaseModal.vue +16 -5
  104. package/src/components/CollapsibleCard.vue +1 -1
  105. package/src/components/ConfirmDialog.vue +1 -1
  106. package/src/components/ExperimentPopover.story.vue +2 -2
  107. package/src/components/ExperimentPopover.vue +6 -22
  108. package/src/components/ExperimentSelectorModal.vue +35 -0
  109. package/src/components/FileUploader.vue +3 -35
  110. package/src/components/GeneratedPluginView.vue +34 -81
  111. package/src/components/GeneratedResultRenderer.vue +2 -1
  112. package/src/components/InstrumentStatusPanels.vue +3 -3
  113. package/src/components/PlotlyChart.vue +1 -1
  114. package/src/components/PluginIcon.story.vue +2 -2
  115. package/src/components/PluginIcon.vue +2 -2
  116. package/src/components/PluginWorkspaceView.vue +10 -1
  117. package/src/components/SectionCard.vue +42 -6
  118. package/src/components/internal/AppTopBarOnboardingInternal.vue +30 -14
  119. package/src/components/internal/AppTopBarPageSelectorInternal.vue +12 -0
  120. package/src/components/internal/AutoGroupModalInternal.vue +14 -3
  121. package/src/components/internal/LucideIconInternal.vue +23 -0
  122. package/src/composables/appLayoutSidebar.ts +11 -0
  123. package/src/composables/index.ts +1 -2
  124. package/src/composables/useExperimentSelector.ts +4 -0
  125. package/src/composables/useJobCenter.ts +21 -1
  126. package/src/composables/useJobsEndpoint.ts +15 -4
  127. package/src/composables/useOnboarding.ts +3 -3
  128. package/src/composables/usePluginWorkspace.ts +15 -4
  129. package/src/composables/useVersionedSave.ts +32 -7
  130. package/src/generated-ui/main.ts +3 -1
  131. package/src/index.ts +0 -3
  132. package/src/styles/components/alert-box.css +1 -1
  133. package/src/styles/components/app-layout.css +5 -0
  134. package/src/styles/components/app-sidebar.css +5 -5
  135. package/src/styles/components/app-top-bar.css +130 -9
  136. package/src/styles/components/button.css +3 -3
  137. package/src/styles/components/checkbox.css +1 -1
  138. package/src/styles/components/collapsible-card.css +1 -1
  139. package/src/styles/components/confirm-dialog.css +2 -2
  140. package/src/styles/components/file-uploader.css +3 -3
  141. package/src/styles/components/icon-button.css +3 -3
  142. package/src/styles/components/loading-spinner.css +1 -1
  143. package/src/styles/components/onboarding.css +39 -0
  144. package/src/styles/components/pill.css +1 -1
  145. package/src/styles/components/plugin-icon.css +2 -2
  146. package/src/styles/components/presence-avatars.css +4 -4
  147. package/src/styles/components/progress-bar.css +1 -1
  148. package/src/styles/components/section-card.css +65 -6
  149. package/src/styles/components/sequence-input.css +1 -1
  150. package/src/styles/components/slider.css +1 -1
  151. package/src/styles/components/toggle.css +1 -1
  152. package/src/styles/variables.css +10 -4
  153. package/src/types/components.ts +23 -2
  154. package/src/types/generated-ui.ts +2 -0
  155. package/src/types/index.ts +1 -1
  156. package/src/types/instrument.ts +5 -18
  157. package/src/utils/deprecation.ts +8 -0
  158. package/src/utils/lucideIcon.ts +25 -0
  159. package/src/utils/lucideIconIndex.d.ts +2 -0
  160. package/dist/AppSidebar-BDrd7Kwn.js.map +0 -1
  161. package/dist/ConfirmDialog-CjWoxAD1.js.map +0 -1
  162. package/dist/ExperimentPopover-BM92LlrQ.js.map +0 -1
  163. package/dist/ExperimentSelectorModal-LsB1ABmh.js.map +0 -1
  164. package/dist/deprecatedRootExports.d.ts +0 -191
  165. package/dist/install-UTqrAgHe.js.map +0 -1
  166. package/dist/lab-CbdDLAVr.js.map +0 -1
  167. package/dist/records-CWRztE5M.js.map +0 -1
  168. package/dist/runtime-DrL6lKAb.js.map +0 -1
  169. package/dist/useDropdownState-uFIz6Yv8.js.map +0 -1
  170. package/dist/useListReorder-QqJc1dpX.js.map +0 -1
  171. package/dist/useRackEditor-BHGM1Ngz.js.map +0 -1
  172. package/dist/useRequest-Bfsh7gIm.js +0 -215
  173. package/dist/useRequest-Bfsh7gIm.js.map +0 -1
  174. package/src/deprecatedRootExports.ts +0 -226
@@ -39,6 +39,44 @@ html.dark {
39
39
  transition: background-color var(--mint-transition), border-color var(--mint-transition);
40
40
  }
41
41
 
42
+ /* The close button sits inside the chip border, so the chip keeps room for it. */
43
+ .mint-onboarding-help__chip-group {
44
+ position: relative;
45
+ display: inline-flex;
46
+ }
47
+
48
+ .mint-onboarding-help__chip-group .mint-onboarding-help__chip {
49
+ padding-right: 2rem;
50
+ }
51
+
52
+ .mint-onboarding-help__chip-close {
53
+ position: absolute;
54
+ top: 50%;
55
+ right: 0.25rem;
56
+ display: grid;
57
+ place-items: center;
58
+ width: 1.5rem;
59
+ height: 1.5rem;
60
+ padding: 0;
61
+ border: 0;
62
+ border-radius: var(--radius-sm);
63
+ background: transparent;
64
+ color: var(--text-muted);
65
+ cursor: pointer;
66
+ transform: translateY(-50%);
67
+ transition: background-color var(--mint-transition), color var(--mint-transition);
68
+ }
69
+
70
+ .mint-onboarding-help__chip-close:hover {
71
+ background: var(--bg-tertiary);
72
+ color: var(--text-primary);
73
+ }
74
+
75
+ .mint-onboarding-help__chip-close:focus-visible {
76
+ outline: none;
77
+ box-shadow: var(--focus-ring-offset);
78
+ }
79
+
42
80
  .mint-onboarding-help__chip:hover {
43
81
  background: var(--bg-hover);
44
82
  }
@@ -360,6 +398,7 @@ html.dark {
360
398
 
361
399
  @media (prefers-reduced-motion: reduce) {
362
400
  .mint-onboarding-help__chip,
401
+ .mint-onboarding-help__chip-close,
363
402
  .mint-onboarding-help__bar > span,
364
403
  .mint-onboarding-help__progress > span,
365
404
  .mint-onboarding__hole {
@@ -33,7 +33,7 @@
33
33
  (soft-tint background, dot, outline border); `--mint-pill-ink` the text. A
34
34
  `color` prop sets `--mint-pill-tone` inline. */
35
35
  .mint-pill--primary { --mint-pill-tone: var(--color-primary); --mint-pill-ink: var(--color-primary-hover); }
36
- .mint-pill--cta { --mint-pill-tone: var(--color-cta); --mint-pill-ink: var(--color-cta-hover); }
36
+ .mint-pill--cta { --mint-pill-tone: var(--color-primary); --mint-pill-ink: var(--color-primary-hover); }
37
37
  .mint-pill--success { --mint-pill-tone: var(--mint-success); --mint-pill-ink: var(--mint-success-hover); }
38
38
  .mint-pill--warning { --mint-pill-tone: var(--mint-warning); --mint-pill-ink: var(--mint-warning-text); }
39
39
  .mint-pill--error { --mint-pill-tone: var(--mint-error); --mint-pill-ink: var(--mint-error-hover); }
@@ -16,10 +16,10 @@
16
16
  .mint-plugin-icon--topbar { width: 2.25rem; height: 2.25rem; }
17
17
  .mint-plugin-icon--lg { width: 3rem; height: 3rem; }
18
18
 
19
- /* Tones (deprecated with the tone/color props, removed in 1.5): the v2 tile no longer reads the variable. */
19
+ /* Tones (deprecated with the tone/color props, removed in 2.0): the v2 tile no longer reads the variable. */
20
20
  .mint-plugin-icon--neutral { --mint-plugin-icon-tone: var(--text-secondary); }
21
21
  .mint-plugin-icon--primary { --mint-plugin-icon-tone: var(--color-primary); }
22
- .mint-plugin-icon--cta { --mint-plugin-icon-tone: var(--color-cta); }
22
+ .mint-plugin-icon--cta { --mint-plugin-icon-tone: var(--color-primary); }
23
23
  .mint-plugin-icon--success { --mint-plugin-icon-tone: var(--mint-success); }
24
24
  .mint-plugin-icon--warning { --mint-plugin-icon-tone: var(--mint-warning); }
25
25
  .mint-plugin-icon--error { --mint-plugin-icon-tone: var(--mint-error); }
@@ -1,18 +1,18 @@
1
1
  /* PresenceAvatars: an avatar stack that opens a list of who is here.
2
2
  * The editing cue is a ring plus a pencil badge, so it does not depend on
3
- * colour only. Light mode uses --color-cta-hover (3:1 on the card), dark
4
- * mode --color-cta. --mint-presence-surface is the colour the avatars are
3
+ * colour only. Light mode uses --color-primary-hover (3:1 on the card), dark
4
+ * mode --color-primary. --mint-presence-surface is the colour the avatars are
5
5
  * cut out of; set it when the stack sits on another surface. */
6
6
 
7
7
  .mint-presence {
8
- --mint-presence-editing: var(--color-cta-hover);
8
+ --mint-presence-editing: var(--color-primary-hover);
9
9
  --mint-presence-surface: var(--bg-secondary);
10
10
  position: relative;
11
11
  display: inline-flex;
12
12
  }
13
13
 
14
14
  :where(html.dark) .mint-presence {
15
- --mint-presence-editing: var(--color-cta);
15
+ --mint-presence-editing: var(--color-primary);
16
16
  }
17
17
 
18
18
  .mint-presence__trigger {
@@ -46,7 +46,7 @@
46
46
  .mint-progress__bar--success { background-color: var(--mint-success); }
47
47
  .mint-progress__bar--warning { background-color: var(--mint-warning); }
48
48
  .mint-progress__bar--error { background-color: var(--mint-error); }
49
- .mint-progress__bar--cta { background-color: var(--color-cta); }
49
+ .mint-progress__bar--cta { background-color: var(--color-primary); }
50
50
  .mint-progress__bar--neutral { background-color: var(--text-muted); }
51
51
  .mint-progress__bar--info { background-color: var(--color-primary); } /* 6b: progress fill is always primary; --mint-info is for the running dot */
52
52
 
@@ -27,6 +27,11 @@
27
27
  min-height: 0;
28
28
  }
29
29
 
30
+ /* A collapsed fill card gives its track back to its siblings. */
31
+ .mint-section-card--fill.mint-section-card--collapsed {
32
+ flex: none;
33
+ }
34
+
30
35
  .mint-section-card--fill .mint-section-card__body {
31
36
  flex: 1;
32
37
  min-height: 0;
@@ -41,7 +46,7 @@
41
46
  min-height: 2.5rem;
42
47
  /* 4px block padding: a 28px header control plus padding plus the 1px rule
43
48
  stays inside the 40px strip (6px made it 41px). */
44
- padding: 0.25rem 0.625rem 0.25rem 0.75rem;
49
+ padding: 0.25rem 0.625rem 0.25rem var(--mint-section-card-inset);
45
50
  border-bottom: 1px solid var(--border-color);
46
51
  flex-shrink: 0;
47
52
  }
@@ -50,6 +55,45 @@
50
55
  border-bottom-color: var(--border-light);
51
56
  }
52
57
 
58
+ /* A collapsed card is its header alone: no rule under it. */
59
+ .mint-section-card__header--collapsed {
60
+ border-bottom-color: transparent;
61
+ }
62
+
63
+ .mint-section-card__toggle {
64
+ display: inline-flex;
65
+ align-items: center;
66
+ gap: var(--mint-section-card-gap);
67
+ margin: 0;
68
+ padding: 0;
69
+ border: 0;
70
+ background: none;
71
+ color: inherit;
72
+ font: inherit;
73
+ cursor: pointer;
74
+ }
75
+
76
+ .mint-section-card__toggle:focus-visible {
77
+ outline: none;
78
+ box-shadow: var(--focus-ring-offset);
79
+ border-radius: var(--radius-sm);
80
+ }
81
+
82
+ .mint-section-card__chevron {
83
+ width: 0.875rem;
84
+ height: 0.875rem;
85
+ color: var(--text-muted);
86
+ transition: transform var(--mint-transition);
87
+ }
88
+
89
+ .mint-section-card__toggle[aria-expanded="false"] .mint-section-card__chevron {
90
+ transform: rotate(-90deg);
91
+ }
92
+
93
+ .mint-section-card__toggle:hover .mint-section-card__chevron {
94
+ color: var(--text-secondary);
95
+ }
96
+
53
97
  /* Muted icon, no tinted chip: every accent renders the same. */
54
98
  .mint-section-card__icon-chip {
55
99
  display: inline-flex;
@@ -97,7 +141,8 @@
97
141
  display: flex;
98
142
  align-items: center;
99
143
  justify-content: space-between;
100
- padding: 0.5rem 1rem;
144
+ /* Text starts on the card inset; controls end where the header's do. */
145
+ padding: 0.5rem 0.625rem 0.5rem var(--mint-section-card-inset);
101
146
  border-top: 1px solid var(--border-color);
102
147
  background: var(--bg-primary);
103
148
  font-size: 0.75rem;
@@ -118,7 +163,7 @@
118
163
  display: flex;
119
164
  align-items: center;
120
165
  gap: var(--mint-section-card-gap);
121
- padding: 0.375rem 0.75rem;
166
+ padding: 0.375rem var(--mint-section-card-inset);
122
167
  background: var(--bg-secondary);
123
168
  transition: background-color var(--mint-transition);
124
169
  }
@@ -153,12 +198,26 @@ button.mint-section-card__row:hover {
153
198
  /* Comfortable density gives the header and rows back their height. */
154
199
  [data-density="comfortable"] .mint-section-card__header {
155
200
  min-height: 2.75rem;
156
- padding: 0.25rem 0.75rem 0.25rem 0.875rem;
201
+ padding-right: 0.75rem;
202
+ }
203
+
204
+ [data-density="comfortable"] .mint-section-card__footer {
205
+ padding-right: 0.75rem;
157
206
  }
158
207
 
159
208
  [data-density="comfortable"] .mint-section-card__row {
160
209
  padding-top: 0.5rem;
161
210
  padding-bottom: 0.5rem;
162
- /* Same left inset as the header, so row content lines up under the header. */
163
- padding-left: 0.875rem;
211
+ }
212
+
213
+ /* A table that is the card body's own child starts and ends on the card's text
214
+ inset, so its first column lines up under the header title. A table inside a
215
+ padded wrapper keeps its padding, and the checkbox and actions columns stay
216
+ centred controls. The table's size padding uses !important, so this must too. */
217
+ .mint-section-card__body > .mint-dataframe :is(.mint-dataframe__th, .mint-dataframe__td):first-child:not(.mint-dataframe__th--checkbox, .mint-dataframe__td--checkbox) {
218
+ padding-left: var(--mint-section-card-inset) !important;
219
+ }
220
+
221
+ .mint-section-card__body > .mint-dataframe :is(.mint-dataframe__th, .mint-dataframe__td):last-child:not(.mint-dataframe__th--actions, .mint-dataframe__td--actions) {
222
+ padding-right: var(--mint-section-card-inset) !important;
164
223
  }
@@ -226,7 +226,7 @@
226
226
  .mint-sequence-input__problem--error .mint-sequence-input__problem-shape { fill: var(--mint-error); }
227
227
 
228
228
  .mint-sequence-input__problem-mark {
229
- stroke: white;
229
+ stroke: var(--text-on-danger);
230
230
  stroke-width: 1.6;
231
231
  stroke-linecap: round;
232
232
  }
@@ -56,7 +56,7 @@
56
56
  box-sizing: border-box;
57
57
  transform: translateX(-50%) translateY(-50%);
58
58
  border-radius: 9999px;
59
- background-color: #FFFFFF;
59
+ background-color: var(--control-knob);
60
60
  border: 1px solid color-mix(in srgb, var(--text-secondary) 40%, transparent);
61
61
  box-shadow: var(--shadow-sm);
62
62
  pointer-events: none;
@@ -151,7 +151,7 @@
151
151
  top: 50%;
152
152
  left: 2px;
153
153
  border-radius: 9999px;
154
- background-color: #FFFFFF;
154
+ background-color: var(--control-knob);
155
155
  box-shadow: var(--shadow-sm);
156
156
  transition: transform 180ms cubic-bezier(0.25, 1, 0.5, 1);
157
157
  pointer-events: none;
@@ -3,8 +3,6 @@
3
3
  * @import '@morscherlab/mint-sdk/styles';
4
4
  */
5
5
 
6
- @import url('https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600;700&family=Geist+Mono:wght@400;500;600&display=swap');
7
-
8
6
  /* Tailwind v4's layer order, declared first so the SDK's base and utilities
9
7
  layers sort the same way with or without Tailwind in the host. */
10
8
  @layer theme, base, components, utilities;
@@ -61,12 +59,16 @@
61
59
  --mint-primary: var(--color-primary);
62
60
  /* Text and icons on an accent fill (filled buttons, Save). */
63
61
  --text-on-accent: #FFFFFF;
64
- /* Retired hues, aliased to the accent until 1.5 (mint doctor warns on use). */
62
+ /* Text on a --mint-error fill (danger buttons); white in both themes, 3.76:1 on #EF4444. */
63
+ --text-on-danger: #FFFFFF;
64
+ /* Knob of a toggle or slider, and the mark of a disabled checkbox; white in both themes. */
65
+ --control-knob: #FFFFFF;
66
+ /* Retired hues, aliased to the accent until 2.0 (mint doctor warns on use). */
65
67
  --color-cta: var(--color-primary);
66
68
  --color-cta-hover: var(--color-primary-hover);
67
69
  --color-purple: var(--color-primary);
68
70
 
69
- /* Entity colors — retired hues, aliased to slate until 1.5. Entities are told
71
+ /* Entity colors — retired hues, aliased to slate until 2.0. Entities are told
70
72
  apart by icon and label, not by hue. Only -hover has no neutral token. */
71
73
  --color-experiment: var(--text-secondary-strong);
72
74
  --color-experiment-hover: #334155;
@@ -136,6 +138,9 @@
136
138
  --mint-gutter: 0.5rem;
137
139
  /* Distance from the outermost cards to the window edge, in every density. */
138
140
  --mint-page-inset: 1rem;
141
+ /* Text inset of a SectionCard: its title, row text and table edge columns
142
+ start here, and page chrome over a card (breadcrumbs) can line up with it. */
143
+ --mint-section-card-inset: 0.75rem;
139
144
 
140
145
  /* Semantic colors */
141
146
  --mint-success: #10B981;
@@ -379,6 +384,7 @@ html.dark [data-palette="forest"] {
379
384
  /* Comfortable density (html[data-density], written by the settings store):
380
385
  the pre-v2 control heights and a wider gutter. */
381
386
  [data-density="comfortable"] {
387
+ --mint-section-card-inset: 0.875rem;
382
388
  --form-height-sm: 2rem;
383
389
  --form-height-md: 2.25rem;
384
390
  --form-height-lg: 3rem;
@@ -220,6 +220,7 @@ export type PillNavItemInput = (Omit<PillNavItem, 'children'> & {
220
220
  export interface PageSelectorItem {
221
221
  id: string
222
222
  label: string
223
+ /** A Lucide icon name (`'activity'`, `'flask-conical'`) or a plugin icon (path, data URL, `mint-icon` JSON). Without one the page shows its first letter. */
223
224
  icon?: string
224
225
  hint?: string
225
226
  to?: string
@@ -239,12 +240,32 @@ export interface PluginWorkspaceTopBarSpec {
239
240
  logo?: boolean
240
241
  /** Centered pill navigation for the local modes of the current route (bind `v-model:pill`). */
241
242
  pills?: PillNavItemInput[]
242
- /** Show the theme toggle. */
243
+ /** @deprecated Ignored: the theme toggle always shows. Removed in 2.0. */
243
244
  themeToggle?: boolean
244
- /** Settings button and modal; `false` hides the button. A getter can switch it per user. */
245
+ /**
246
+ * Settings modal of the always-present settings button. `false` (or a getter that returns it)
247
+ * gives the modal only its Appearance tab; it no longer hides the button.
248
+ */
245
249
  settings?: import('vue').MaybeRefOrGetter<false | TopBarSettingsConfig>
246
250
  /** Standalone badge text when the plugin runs outside the platform; `false` hides it. */
247
251
  standaloneLabel?: false | string
252
+ /** Plugin buttons, before the theme and settings buttons. The first two show; the rest go into a More menu. */
253
+ actions?: TopBarAction[]
254
+ }
255
+
256
+ /** One plugin button of the top bar. With `icon` it is an icon button and `label` is its accessible name and tooltip. */
257
+ export interface TopBarAction {
258
+ id: string
259
+ label: string
260
+ /** A Lucide icon name, such as `'database'`. */
261
+ icon?: string
262
+ /** A small status dot on the button. */
263
+ dot?: Tone
264
+ /** Tooltip; defaults to `label`. */
265
+ title?: string
266
+ loading?: boolean
267
+ disabled?: boolean
268
+ onSelect: () => void
248
269
  }
249
270
 
250
271
  /** Sidebar part of a PluginWorkspaceView spec; also the `:spec` of AppSidebar. */
@@ -132,6 +132,8 @@ export interface GeneratedJobDefinition {
132
132
  cpu: number
133
133
  /** Who may submit the job when integrated: `use`, `configure` (`plugins.configure`) or `admin`. */
134
134
  access?: 'use' | 'configure' | 'admin'
135
+ /** The plugins that may start the job through the platform: `'readers'` or plugin names. Absent before SDK 1.5. */
136
+ callers?: 'readers' | string[]
135
137
  /** Defaults to process for manifests generated before lifecycle profiles. */
136
138
  lifecycle?: GeneratedJobLifecycle
137
139
  /** Defaults to `{ kind: 'process' }` for older manifests. */
@@ -31,6 +31,7 @@ export type {
31
31
  PageSelectorItem,
32
32
  PageSelectorItemInput,
33
33
  PluginWorkspaceTopBarSpec,
34
+ TopBarAction,
34
35
  PluginWorkspaceSidebarSpec,
35
36
  PluginWorkspaceViewSpec,
36
37
  // Well Plate types
@@ -219,7 +220,6 @@ export type {
219
220
  InstrumentLiveProgress,
220
221
  InstrumentLiveStatus,
221
222
  InstrumentState,
222
- InstrumentStatus,
223
223
  InstrumentStatusReporter,
224
224
  SampleInfo,
225
225
  SampleInfo as InstrumentSampleInfo,
@@ -24,24 +24,6 @@ export interface SequenceProgress {
24
24
  sample_durations?: readonly number[]
25
25
  }
26
26
 
27
- /** @deprecated Scheduled for removal in MINT 1.4; instrument monitor types move to the mld-ms plugins. */
28
- export interface InstrumentStatus {
29
- instrument_id: string
30
- instrument_name?: string | null
31
- monitor_id?: string | null
32
- state: InstrumentState
33
- active_method?: string | null
34
- current_sample?: SampleInfo | null
35
- sequence_progress?: SequenceProgress | null
36
- timestamp?: string | Date
37
- last_seen?: string | Date | null
38
- connected?: boolean
39
- sequence_file?: string | null
40
- sequence_row_index?: number | null
41
- current_raw_file?: string | null
42
- method_elapsed_pct?: number | null
43
- }
44
-
45
27
  /** A state the platform derives for an instrument: its reported state, `never` (no report yet) or `inactive`. */
46
28
  export type InstrumentBadgeState = InstrumentState | 'never' | 'inactive'
47
29
 
@@ -91,7 +73,12 @@ export interface InstrumentLiveStatus {
91
73
  current_sample?: SampleInfo | null
92
74
  sequence_progress?: InstrumentLiveProgress | null
93
75
  has_unacknowledged_alerts: boolean
76
+ /** False when `latest_critical_at` is before `alerts_since`. */
94
77
  has_unacknowledged_critical: boolean
78
+ /** Time of the newest unacknowledged critical alert, as the plugin reported it (ISO 8601). */
79
+ latest_critical_at?: string | null
80
+ /** Start of the platform alert window (ISO 8601); null when the window is off. */
81
+ alerts_since?: string | null
95
82
  /** Server receive time of the latest report (ISO 8601). */
96
83
  last_seen: string
97
84
  /** When the state last changed (ISO 8601). */
@@ -0,0 +1,8 @@
1
+ const warned = new Set<string>()
2
+
3
+ /** Warn once per page load that a deprecated SDK option or slot is in use. */
4
+ export function warnDeprecatedOnce(key: string, message: string): void {
5
+ if (warned.has(key)) return
6
+ warned.add(key)
7
+ console.warn(`[mint-sdk] ${message}`)
8
+ }
@@ -0,0 +1,25 @@
1
+ /// <reference path="./lucideIconIndex.d.ts" />
2
+ import type { Component } from 'vue'
3
+
4
+ /** A Lucide icon name in kebab case, such as `activity` or `flask-conical`. */
5
+ const LUCIDE_NAME = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/
6
+
7
+ export function isLucideIconName(value?: string): value is string {
8
+ return !!value && LUCIDE_NAME.test(value)
9
+ }
10
+
11
+ function pascalCase(name: string): string {
12
+ return name.replace(/(^|-)([a-z0-9])/g, (_, __, char: string) => char.toUpperCase())
13
+ }
14
+
15
+ // ponytail: loads the whole Lucide set (~150 KB gzip) as one lazy chunk on first use;
16
+ // switch to a per-icon import map if page icons become common on first paint.
17
+ // The icon index, not the package root: the root is statically imported elsewhere,
18
+ // so a dynamic import of it would put the whole set in the startup bundle.
19
+ let iconSet: Promise<Record<string, Component>> | undefined
20
+
21
+ /** The Lucide component for `name`, or undefined when Lucide has no such icon. */
22
+ export async function loadLucideIcon(name: string): Promise<Component | undefined> {
23
+ iconSet ??= import('lucide-vue-next/dist/esm/icons/index.js') as Promise<Record<string, Component>>
24
+ return (await iconSet)[pascalCase(name)]
25
+ }
@@ -0,0 +1,2 @@
1
+ // The Lucide icon index ships without types; utils/lucideIcon.ts loads it on first use.
2
+ declare module 'lucide-vue-next/dist/esm/icons/index.js'