@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.
- package/dist/{AlertBox-CIhqsWbN.js → AlertBox-Cai0w7gF.js} +3 -3
- package/dist/{AlertBox-CIhqsWbN.js.map → AlertBox-Cai0w7gF.js.map} +1 -1
- package/dist/{AppSidebar-BDrd7Kwn.js → AppSidebar-C-Vq5x4I.js} +410 -127
- package/dist/AppSidebar-C-Vq5x4I.js.map +1 -0
- package/dist/{ConfirmDialog-CjWoxAD1.js → ConfirmDialog-BjFsOpBe.js} +3 -3
- package/dist/ConfirmDialog-BjFsOpBe.js.map +1 -0
- package/dist/{ExperimentPopover-BM92LlrQ.js → ExperimentPopover-DYy_s0kI.js} +25 -37
- package/dist/ExperimentPopover-DYy_s0kI.js.map +1 -0
- package/dist/{ExperimentSelectorModal-LsB1ABmh.js → ExperimentSelectorModal-Bfh5bdkv.js} +37 -8
- package/dist/ExperimentSelectorModal-Bfh5bdkv.js.map +1 -0
- package/dist/{SegmentedControl-Dz41vAFM.js → SegmentedControl-B8KgyOjd.js} +2 -2
- package/dist/{SegmentedControl-Dz41vAFM.js.map → SegmentedControl-B8KgyOjd.js.map} +1 -1
- package/dist/{SettingsModal-C-MSR-bk.js → SettingsModal-DwfrD1ER.js} +7 -7
- package/dist/{SettingsModal-C-MSR-bk.js.map → SettingsModal-DwfrD1ER.js.map} +1 -1
- package/dist/__tests__/components/AppTopBarCompact.test.d.ts +1 -0
- package/dist/__tests__/components/AppTopBarCompactReset.test.d.ts +1 -0
- package/dist/__tests__/components/AutoGroupModal.experimentLoad.test.d.ts +1 -0
- package/dist/components/AppTopBar.compact.d.ts +5 -0
- package/dist/components/AppTopBar.vue.d.ts +17 -17
- package/dist/components/FormBuilder.vue.d.ts +1 -1
- package/dist/components/PluginIcon.vue.d.ts +2 -2
- package/dist/components/PluginWorkspaceView.vue.d.ts +4 -0
- package/dist/components/SectionCard.vue.d.ts +13 -1
- package/dist/components/SettingsModal.vue.d.ts +1 -1
- package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +2 -2
- package/dist/components/internal/FormSchemaInternal.vue.d.ts +9 -9
- package/dist/components/internal/FormSectionRenderer.vue.d.ts +4 -4
- package/dist/components/internal/LucideIconInternal.vue.d.ts +17 -0
- package/dist/composables/appLayoutSidebar.d.ts +9 -0
- package/dist/composables/useExperimentSelector.d.ts +2 -0
- package/dist/composables/useOnboarding.d.ts +1 -1
- package/dist/composables/usePluginWorkspace.d.ts +2 -0
- package/dist/composables/useVersionedSave.d.ts +5 -2
- package/dist/{controlSchemaModel-BbXbMgc6.js → controlSchemaModel-BtFNZj8t.js} +2 -2
- package/dist/{controlSchemaModel-BbXbMgc6.js.map → controlSchemaModel-BtFNZj8t.js.map} +1 -1
- package/dist/{data-LzdkEZJ-.js → data-CJztFns8.js} +31 -15
- package/dist/{data-LzdkEZJ-.js.map → data-CJztFns8.js.map} +1 -1
- package/dist/data.js +8 -8
- package/dist/{experimentStatus-DCn2QKG7.js → experimentStatus-Deokk7Br.js} +2 -2
- package/dist/{experimentStatus-DCn2QKG7.js.map → experimentStatus-Deokk7Br.js.map} +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +15 -20
- package/dist/index.js.map +1 -1
- package/dist/{install-UTqrAgHe.js → install-Bk02tJ5M.js} +15 -40
- package/dist/install-Bk02tJ5M.js.map +1 -0
- package/dist/install.js +1 -1
- package/dist/{lab-CbdDLAVr.js → lab-BYhb_cJI.js} +47 -117
- package/dist/lab-BYhb_cJI.js.map +1 -0
- package/dist/lab.js +4 -4
- package/dist/{records-CWRztE5M.js → records-GtiVMlTQ.js} +207 -171
- package/dist/records-GtiVMlTQ.js.map +1 -0
- package/dist/{runtime-DrL6lKAb.js → runtime-aZPUPxoB.js} +112 -54
- package/dist/runtime-aZPUPxoB.js.map +1 -0
- package/dist/runtime.js +6 -6
- package/dist/{shell-Ch7cJnjo.js → shell-Bk9mD4Lc.js} +5 -5
- package/dist/{shell-Ch7cJnjo.js.map → shell-Bk9mD4Lc.js.map} +1 -1
- package/dist/shell.js +5 -5
- package/dist/styles.css +315 -134
- package/dist/styles.d.ts +1 -0
- package/dist/types/components.d.ts +22 -2
- package/dist/types/generated-ui.d.ts +2 -0
- package/dist/types/index.d.ts +2 -2
- package/dist/types/instrument.d.ts +5 -17
- package/dist/{useDropdownState-uFIz6Yv8.js → useDropdownState-CcBzUYZ6.js} +14 -5
- package/dist/useDropdownState-CcBzUYZ6.js.map +1 -0
- package/dist/{useExperimentSamples-Cz2v3V_q.js → useExperimentSamples-CpNXvpUn.js} +3 -3
- package/dist/{useExperimentSamples-Cz2v3V_q.js.map → useExperimentSamples-CpNXvpUn.js.map} +1 -1
- package/dist/{useListReorder-QqJc1dpX.js → useListReorder-Bp4EAI2w.js} +16 -4
- package/dist/useListReorder-Bp4EAI2w.js.map +1 -0
- package/dist/{useRackEditor-BHGM1Ngz.js → useRackEditor-i2bdPUFf.js} +156 -27
- package/dist/useRackEditor-i2bdPUFf.js.map +1 -0
- package/dist/{useRealtime-CNQbrS01.js → useRealtime-BLQEjbuq.js} +3 -3
- package/dist/{useRealtime-CNQbrS01.js.map → useRealtime-BLQEjbuq.js.map} +1 -1
- package/dist/useRequest-CXyPw3eh.js +76 -0
- package/dist/useRequest-CXyPw3eh.js.map +1 -0
- package/dist/utils/deprecation.d.ts +2 -0
- package/dist/utils/lucideIcon.d.ts +4 -0
- package/package.json +7 -4
- package/src/__tests__/components/AppTopBar.test.ts +102 -20
- package/src/__tests__/components/AppTopBarCompact.test.ts +65 -0
- package/src/__tests__/components/AppTopBarCompactReset.test.ts +24 -0
- package/src/__tests__/components/AppTopBarOnboarding.test.ts +10 -0
- package/src/__tests__/components/AutoGroupModal.experimentLoad.test.ts +58 -0
- package/src/__tests__/components/BaseModal.test.ts +33 -2
- package/src/__tests__/components/ConfirmDialog.test.ts +2 -2
- package/src/__tests__/components/ExperimentPopover.test.ts +32 -0
- package/src/__tests__/components/ExperimentSelectorModal.test.ts +16 -0
- package/src/__tests__/components/PluginWorkspaceView.test.ts +20 -1
- package/src/__tests__/components/SectionCard.test.ts +33 -0
- package/src/__tests__/components/deprecationTags.test.ts +4 -18
- package/src/__tests__/composables/useJobCenter.test.ts +35 -0
- package/src/__tests__/composables/useJobsEndpoint.test.ts +50 -0
- package/src/__tests__/composables/useOnboarding.test.ts +2 -2
- package/src/__tests__/composables/useVersionedSave.test.ts +71 -6
- package/src/__tests__/docs/frontendDocsCatalog.test.ts +3 -3
- package/src/__tests__/styles/menusShellRefresh.test.ts +10 -0
- package/src/components/AppLayout.story.vue +5 -5
- package/src/components/AppLayout.vue +13 -1
- package/src/components/AppSidebar.vue +2 -2
- package/src/components/AppTopBar.compact.ts +60 -0
- package/src/components/AppTopBar.story.vue +39 -14
- package/src/components/AppTopBar.vue +222 -89
- package/src/components/BaseModal.vue +16 -5
- package/src/components/CollapsibleCard.vue +1 -1
- package/src/components/ConfirmDialog.vue +1 -1
- package/src/components/ExperimentPopover.story.vue +2 -2
- package/src/components/ExperimentPopover.vue +6 -22
- package/src/components/ExperimentSelectorModal.vue +35 -0
- package/src/components/FileUploader.vue +3 -35
- package/src/components/GeneratedPluginView.vue +34 -81
- package/src/components/GeneratedResultRenderer.vue +2 -1
- package/src/components/InstrumentStatusPanels.vue +3 -3
- package/src/components/PlotlyChart.vue +1 -1
- package/src/components/PluginIcon.story.vue +2 -2
- package/src/components/PluginIcon.vue +2 -2
- package/src/components/PluginWorkspaceView.vue +10 -1
- package/src/components/SectionCard.vue +42 -6
- package/src/components/internal/AppTopBarOnboardingInternal.vue +30 -14
- package/src/components/internal/AppTopBarPageSelectorInternal.vue +12 -0
- package/src/components/internal/AutoGroupModalInternal.vue +14 -3
- package/src/components/internal/LucideIconInternal.vue +23 -0
- package/src/composables/appLayoutSidebar.ts +11 -0
- package/src/composables/index.ts +1 -2
- package/src/composables/useExperimentSelector.ts +4 -0
- package/src/composables/useJobCenter.ts +21 -1
- package/src/composables/useJobsEndpoint.ts +15 -4
- package/src/composables/useOnboarding.ts +3 -3
- package/src/composables/usePluginWorkspace.ts +15 -4
- package/src/composables/useVersionedSave.ts +32 -7
- package/src/generated-ui/main.ts +3 -1
- package/src/index.ts +0 -3
- package/src/styles/components/alert-box.css +1 -1
- package/src/styles/components/app-layout.css +5 -0
- package/src/styles/components/app-sidebar.css +5 -5
- package/src/styles/components/app-top-bar.css +130 -9
- package/src/styles/components/button.css +3 -3
- package/src/styles/components/checkbox.css +1 -1
- package/src/styles/components/collapsible-card.css +1 -1
- package/src/styles/components/confirm-dialog.css +2 -2
- package/src/styles/components/file-uploader.css +3 -3
- package/src/styles/components/icon-button.css +3 -3
- package/src/styles/components/loading-spinner.css +1 -1
- package/src/styles/components/onboarding.css +39 -0
- package/src/styles/components/pill.css +1 -1
- package/src/styles/components/plugin-icon.css +2 -2
- package/src/styles/components/presence-avatars.css +4 -4
- package/src/styles/components/progress-bar.css +1 -1
- package/src/styles/components/section-card.css +65 -6
- package/src/styles/components/sequence-input.css +1 -1
- package/src/styles/components/slider.css +1 -1
- package/src/styles/components/toggle.css +1 -1
- package/src/styles/variables.css +10 -4
- package/src/types/components.ts +23 -2
- package/src/types/generated-ui.ts +2 -0
- package/src/types/index.ts +1 -1
- package/src/types/instrument.ts +5 -18
- package/src/utils/deprecation.ts +8 -0
- package/src/utils/lucideIcon.ts +25 -0
- package/src/utils/lucideIconIndex.d.ts +2 -0
- package/dist/AppSidebar-BDrd7Kwn.js.map +0 -1
- package/dist/ConfirmDialog-CjWoxAD1.js.map +0 -1
- package/dist/ExperimentPopover-BM92LlrQ.js.map +0 -1
- package/dist/ExperimentSelectorModal-LsB1ABmh.js.map +0 -1
- package/dist/deprecatedRootExports.d.ts +0 -191
- package/dist/install-UTqrAgHe.js.map +0 -1
- package/dist/lab-CbdDLAVr.js.map +0 -1
- package/dist/records-CWRztE5M.js.map +0 -1
- package/dist/runtime-DrL6lKAb.js.map +0 -1
- package/dist/useDropdownState-uFIz6Yv8.js.map +0 -1
- package/dist/useListReorder-QqJc1dpX.js.map +0 -1
- package/dist/useRackEditor-BHGM1Ngz.js.map +0 -1
- package/dist/useRequest-Bfsh7gIm.js +0 -215
- package/dist/useRequest-Bfsh7gIm.js.map +0 -1
- 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-
|
|
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
|
|
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-
|
|
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-
|
|
4
|
-
* mode --color-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
-
|
|
163
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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;
|
package/src/styles/variables.css
CHANGED
|
@@ -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
|
-
/*
|
|
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
|
|
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;
|
package/src/types/components.ts
CHANGED
|
@@ -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
|
-
/**
|
|
243
|
+
/** @deprecated Ignored: the theme toggle always shows. Removed in 2.0. */
|
|
243
244
|
themeToggle?: boolean
|
|
244
|
-
/**
|
|
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. */
|
package/src/types/index.ts
CHANGED
|
@@ -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,
|
package/src/types/instrument.ts
CHANGED
|
@@ -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
|
+
}
|