@morscherlab/mint-sdk 1.3.0-beta.1 → 1.3.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/README.md +23 -140
- package/dist/{ResourcePickerListInternal-c3IT8PIu.js → ResourcePickerListInternal-CFAw4vTZ.js} +26 -19
- package/dist/ResourcePickerListInternal-CFAw4vTZ.js.map +1 -0
- package/dist/components/FilePicker.vue.d.ts +4 -1
- package/dist/components/SettingsModal.schema.d.ts +1 -1
- package/dist/components/SettingsModal.vue.d.ts +2 -0
- package/dist/components/WellPlate.colors.d.ts +1 -5
- package/dist/components/WellPlate.rendering.d.ts +5 -2
- package/dist/components/index.d.ts +32 -17
- package/dist/components/index.js +3 -3
- package/dist/components/internal/FilePickerListInternal.vue.d.ts +2 -0
- package/dist/components/internal/ResourcePickerListInternal.vue.d.ts +9 -3
- package/dist/{components-CvY105kJ.js → components-GDDvof8D.js} +414 -368
- package/dist/components-GDDvof8D.js.map +1 -0
- package/dist/composables/createFilePickerAdapter.d.ts +5 -1
- package/dist/composables/filePicker/usePickerNavigation.d.ts +3 -2
- package/dist/composables/index.d.ts +0 -3
- package/dist/composables/index.js +4 -4
- package/dist/composables/useAutoGroup.d.ts +1 -1
- package/dist/composables/useBioTemplateComponents.d.ts +15 -3
- package/dist/composables/useBioTemplateControls.d.ts +5 -1
- package/dist/composables/useBioTemplatePackWorkspace.d.ts +2 -0
- package/dist/composables/useBioTemplatePresetWorkspace.d.ts +5 -1
- package/dist/composables/useBioTemplateWorkspace.d.ts +5 -1
- package/dist/composables/useExperimentSave.d.ts +5 -1
- package/dist/composables/useFilePicker.d.ts +4 -1
- package/dist/composables/useGroupAssignment.d.ts +5 -1
- package/dist/composables/usePlatformContext.d.ts +3 -0
- package/dist/composables/useTemplateCollection.d.ts +5 -1
- package/dist/composables-D6uqp0UF.js +591 -0
- package/dist/composables-D6uqp0UF.js.map +1 -0
- package/dist/index.js +24 -24
- package/dist/index.js.map +1 -1
- package/dist/install.js +1 -1
- package/dist/lcms.d.ts +11 -11
- package/dist/styles.css +170 -200
- package/dist/templates/index.js +1 -1
- package/dist/{templates-Bj9hZ7iV.js → templates-BU1pet28.js} +31 -44
- package/dist/templates-BU1pet28.js.map +1 -0
- package/dist/types/auth.d.ts +0 -27
- package/dist/types/components.d.ts +8 -0
- package/dist/types/fileBrowserTypes.d.ts +13 -0
- package/dist/types/filePicker.d.ts +8 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/platform.d.ts +2 -0
- package/dist/utils/rack.d.ts +16 -16
- package/dist/{validation-B4Y8_eEe.js → validation-Dmp9Q5W0.js} +50 -12
- package/dist/validation-Dmp9Q5W0.js.map +1 -0
- package/package.json +1 -6
- package/src/__tests__/components/ActionMenu.test.ts +10 -0
- package/src/__tests__/components/AppTopBar.test.ts +24 -8
- package/src/__tests__/components/EmptyState.test.ts +15 -0
- package/src/__tests__/components/ExperimentSelectorModal.test.ts +12 -5
- package/src/__tests__/components/FilePicker.test.ts +65 -1
- package/src/__tests__/components/FileUploader.test.ts +6 -9
- package/src/__tests__/components/ResourcePickerListInternal.test.ts +23 -4
- package/src/__tests__/components/SettingsModal.test.ts +22 -0
- package/src/__tests__/components/WellPlate.decoration.test.ts +4 -28
- package/src/__tests__/components/WellPlate.rendering.test.ts +20 -33
- package/src/__tests__/components/WellPlate.sampleTypeIndicator.test.ts +7 -7
- package/src/__tests__/composables/createFilePickerAdapter.test.ts +92 -1
- package/src/__tests__/composables/usePickerNavigation.test.ts +61 -1
- package/src/__tests__/composables/usePlatformFilePickerAdapter.test.ts +18 -6
- package/src/__tests__/docs/frontendDocsCatalog.test.ts +2 -2
- package/src/__tests__/styles/controlRefreshRules.test.ts +21 -8
- package/src/__tests__/styles/menusShellRefresh.test.ts +20 -5
- package/src/__tests__/templates/templatesDeprecation.test.ts +58 -11
- package/src/components/ActionMenu.vue +10 -2
- package/src/components/AppTopBar.vue +6 -4
- package/src/components/EmptyState.vue +3 -1
- package/src/components/ExperimentSelectorModal.vue +4 -1
- package/src/components/FilePicker.vue +42 -0
- package/src/components/FileUploader.vue +30 -46
- package/src/components/SettingsModal.schema.ts +4 -2
- package/src/components/SettingsModal.vue +4 -2
- package/src/components/WellPlate.colors.ts +6 -10
- package/src/components/WellPlate.legend.ts +4 -4
- package/src/components/WellPlate.rendering.ts +9 -8
- package/src/components/WellPlate.vue +5 -22
- package/src/components/index.ts +32 -17
- package/src/components/internal/FilePickerListInternal.vue +11 -2
- package/src/components/internal/ResourcePickerListInternal.vue +21 -27
- package/src/composables/autoGroup/index.ts +1 -1
- package/src/composables/createFilePickerAdapter.ts +82 -22
- package/src/composables/filePicker/usePickerNavigation.ts +29 -2
- package/src/composables/index.ts +0 -7
- package/src/composables/useAutoGroup.ts +1 -1
- package/src/composables/useBioTemplateComponents.ts +15 -3
- package/src/composables/useBioTemplateControls.ts +5 -1
- package/src/composables/useBioTemplatePackWorkspace.ts +2 -0
- package/src/composables/useBioTemplatePresetWorkspace.ts +5 -1
- package/src/composables/useBioTemplateWorkspace.ts +5 -1
- package/src/composables/useExperimentSave.ts +5 -1
- package/src/composables/useFilePicker.ts +8 -1
- package/src/composables/useGroupAssignment.ts +5 -1
- package/src/composables/usePlatformFilePickerAdapter.ts +26 -4
- package/src/composables/useTemplateCollection.ts +5 -1
- package/src/index.ts +1 -1
- package/src/lcms.ts +11 -11
- package/src/styles/components/action-menu.css +10 -0
- package/src/styles/components/app-page-selector.css +3 -3
- package/src/styles/components/app-pill-nav.css +1 -1
- package/src/styles/components/app-top-bar.css +18 -38
- package/src/styles/components/empty-state.css +3 -2
- package/src/styles/components/experiment-selector-modal.css +3 -9
- package/src/styles/components/file-picker.css +23 -1
- package/src/styles/components/file-uploader.css +22 -55
- package/src/styles/components/resource-picker-list.css +70 -36
- package/src/styles/components/well-plate.css +18 -55
- package/src/types/auth.ts +0 -37
- package/src/types/components.ts +8 -0
- package/src/types/fileBrowserTypes.ts +15 -0
- package/src/types/filePicker.ts +8 -1
- package/src/types/index.ts +2 -5
- package/src/types/platform.ts +2 -0
- package/src/utils/rack.ts +16 -16
- package/dist/ResourcePickerListInternal-c3IT8PIu.js.map +0 -1
- package/dist/__tests__/composables/useAuth.test.d.ts +0 -1
- package/dist/__tests__/composables/usePasskey.test.d.ts +0 -1
- package/dist/components-CvY105kJ.js.map +0 -1
- package/dist/composables/useAuth.d.ts +0 -47
- package/dist/composables/usePasskey.d.ts +0 -10
- package/dist/composables/useWellPlateEditor.d.ts +0 -33
- package/dist/composables-DL4Vca7L.js +0 -1193
- package/dist/composables-DL4Vca7L.js.map +0 -1
- package/dist/plotly.min-D6Ge6qgX.js +0 -168582
- package/dist/plotly.min-D6Ge6qgX.js.map +0 -1
- package/dist/templates-Bj9hZ7iV.js.map +0 -1
- package/dist/validation-B4Y8_eEe.js.map +0 -1
- package/src/__tests__/composables/useAuth.test.ts +0 -290
- package/src/__tests__/composables/usePasskey.test.ts +0 -38
- package/src/composables/useAuth.ts +0 -470
- package/src/composables/usePasskey.ts +0 -216
- package/src/composables/useWellPlateEditor.ts +0 -415
|
@@ -14,113 +14,80 @@
|
|
|
14
14
|
|
|
15
15
|
.mint-file-uploader__dropzone {
|
|
16
16
|
position: relative;
|
|
17
|
-
border:
|
|
17
|
+
border: 2px dashed var(--border-color);
|
|
18
18
|
border-radius: var(--radius-lg);
|
|
19
19
|
cursor: pointer;
|
|
20
20
|
background: var(--bg-secondary);
|
|
21
21
|
transition: border-color 0.15s ease, background-color 0.15s ease;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
/* 2g: hover only changes the surface; the border change is reserved for dragover. */
|
|
25
24
|
.mint-file-uploader__dropzone:hover {
|
|
26
|
-
|
|
25
|
+
border-color: var(--color-primary);
|
|
26
|
+
background: color-mix(in srgb, var(--color-primary) 3%, var(--bg-secondary));
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
.mint-file-uploader__dropzone:focus-visible {
|
|
30
|
-
outline:
|
|
31
|
-
|
|
30
|
+
outline: 2px solid var(--color-primary);
|
|
31
|
+
outline-offset: 2px;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
.mint-file-uploader__dropzone--dragover
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
background: var(--color-primary-soft);
|
|
34
|
+
.mint-file-uploader__dropzone--dragover {
|
|
35
|
+
border-color: var(--color-primary);
|
|
36
|
+
background: color-mix(in srgb, var(--color-primary) 5%, var(--bg-secondary));
|
|
38
37
|
}
|
|
39
38
|
|
|
40
|
-
.mint-file-uploader__dropzone--disabled
|
|
41
|
-
.mint-file-uploader__dropzone--disabled:hover {
|
|
42
|
-
background: var(--bg-tertiary);
|
|
39
|
+
.mint-file-uploader__dropzone--disabled {
|
|
43
40
|
opacity: var(--mint-disabled-opacity);
|
|
44
41
|
cursor: not-allowed;
|
|
45
42
|
}
|
|
46
43
|
|
|
47
44
|
.mint-file-uploader__dropzone--sm {
|
|
48
|
-
padding:
|
|
45
|
+
padding: 1.25rem;
|
|
49
46
|
}
|
|
50
47
|
|
|
51
48
|
.mint-file-uploader__dropzone--md {
|
|
52
|
-
padding: 1.
|
|
49
|
+
padding: 1.5rem;
|
|
53
50
|
}
|
|
54
51
|
|
|
55
52
|
.mint-file-uploader__dropzone--lg {
|
|
56
|
-
padding:
|
|
53
|
+
padding: 2rem;
|
|
57
54
|
}
|
|
58
55
|
|
|
59
56
|
/* ==========================================================================
|
|
60
|
-
Content area
|
|
57
|
+
Content area
|
|
61
58
|
========================================================================== */
|
|
62
59
|
|
|
63
60
|
.mint-file-uploader__content {
|
|
64
61
|
display: flex;
|
|
62
|
+
flex-direction: column;
|
|
65
63
|
align-items: center;
|
|
66
|
-
|
|
64
|
+
text-align: center;
|
|
67
65
|
}
|
|
68
66
|
|
|
69
67
|
.mint-file-uploader__input {
|
|
70
68
|
display: none;
|
|
71
69
|
}
|
|
72
70
|
|
|
73
|
-
.mint-file-uploader__icon
|
|
74
|
-
display: flex;
|
|
75
|
-
align-items: center;
|
|
76
|
-
justify-content: center;
|
|
77
|
-
flex-shrink: 0;
|
|
71
|
+
.mint-file-uploader__icon {
|
|
78
72
|
width: 2rem;
|
|
79
73
|
height: 2rem;
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
color: var(--text-secondary);
|
|
83
|
-
transition: background-color 0.15s ease, color 0.15s ease;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
.mint-file-uploader__dropzone--dragover .mint-file-uploader__icon-tile {
|
|
87
|
-
background: var(--color-primary);
|
|
88
|
-
color: white;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
.mint-file-uploader__icon {
|
|
92
|
-
width: 1rem;
|
|
93
|
-
height: 1rem;
|
|
94
|
-
stroke-width: 1.8;
|
|
74
|
+
color: var(--text-muted);
|
|
75
|
+
margin-bottom: 0.5rem;
|
|
95
76
|
}
|
|
96
77
|
|
|
97
|
-
.mint-file-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
gap: 0.125rem;
|
|
101
|
-
min-width: 0;
|
|
78
|
+
.mint-file-uploader__dropzone:hover .mint-file-uploader__icon,
|
|
79
|
+
.mint-file-uploader__dropzone--dragover .mint-file-uploader__icon {
|
|
80
|
+
color: var(--color-primary);
|
|
102
81
|
}
|
|
103
82
|
|
|
104
83
|
.mint-file-uploader__text {
|
|
105
|
-
color: var(--text-
|
|
84
|
+
color: var(--text-secondary);
|
|
106
85
|
font-size: 0.8125rem;
|
|
107
86
|
font-weight: 500;
|
|
108
87
|
margin: 0;
|
|
109
88
|
padding: 0;
|
|
110
89
|
}
|
|
111
90
|
|
|
112
|
-
.mint-file-uploader__dropzone--dragover .mint-file-uploader__text {
|
|
113
|
-
color: var(--_ink-primary);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
.mint-file-uploader__formats {
|
|
117
|
-
color: var(--text-secondary);
|
|
118
|
-
font-family: var(--font-mono);
|
|
119
|
-
font-size: 0.6875rem;
|
|
120
|
-
margin: 0;
|
|
121
|
-
padding: 0;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
91
|
/* ==========================================================================
|
|
125
92
|
Actions slot
|
|
126
93
|
========================================================================== */
|
|
@@ -1,4 +1,16 @@
|
|
|
1
|
-
/* ResourcePickerList
|
|
1
|
+
/* ResourcePickerList: shared list for ExperimentSelectorModal and ArtifactSelectorModal.
|
|
2
|
+
No frame of its own (the modal is the card); rows are inset and rounded, groups are
|
|
3
|
+
pinned bars. */
|
|
4
|
+
|
|
5
|
+
/* The modal is the only card: the list runs edge to edge, and the toolbar, group
|
|
6
|
+
bars and row text keep the modal's 1.25rem gutter themselves. */
|
|
7
|
+
.mint-modal__body:has(> .mint-resource-picker) {
|
|
8
|
+
padding: 0;
|
|
9
|
+
}
|
|
10
|
+
.mint-modal__container:has(.mint-resource-picker) .mint-modal__header {
|
|
11
|
+
border-bottom: none;
|
|
12
|
+
padding-bottom: 0.75rem;
|
|
13
|
+
}
|
|
2
14
|
|
|
3
15
|
.mint-resource-picker {
|
|
4
16
|
display: flex;
|
|
@@ -11,6 +23,7 @@
|
|
|
11
23
|
align-items: center;
|
|
12
24
|
flex-wrap: wrap;
|
|
13
25
|
gap: 0.5rem;
|
|
26
|
+
padding: 0 1.25rem;
|
|
14
27
|
}
|
|
15
28
|
.mint-resource-picker__search {
|
|
16
29
|
flex: 1;
|
|
@@ -20,12 +33,10 @@
|
|
|
20
33
|
.mint-resource-picker__frame {
|
|
21
34
|
display: flex;
|
|
22
35
|
flex-direction: column;
|
|
23
|
-
|
|
24
|
-
border: 1px solid var(--border-color);
|
|
25
|
-
border-radius: var(--radius-md);
|
|
26
|
-
background-color: var(--bg-card);
|
|
36
|
+
border-top: 1px solid var(--border-color);
|
|
27
37
|
}
|
|
28
38
|
.mint-resource-picker__list {
|
|
39
|
+
padding-bottom: 0.5rem;
|
|
29
40
|
max-height: min(28rem, calc(100vh - 16rem));
|
|
30
41
|
overflow-y: auto;
|
|
31
42
|
overscroll-behavior: contain;
|
|
@@ -38,14 +49,17 @@
|
|
|
38
49
|
gap: 0.5rem;
|
|
39
50
|
flex-shrink: 0;
|
|
40
51
|
width: 100%;
|
|
52
|
+
position: sticky;
|
|
53
|
+
top: 0;
|
|
54
|
+
z-index: 1;
|
|
41
55
|
height: 30px;
|
|
42
|
-
padding: 0
|
|
56
|
+
padding: 0 1.25rem;
|
|
43
57
|
border: 0;
|
|
44
58
|
border-bottom: 1px solid var(--border-light);
|
|
45
59
|
background-color: var(--bg-primary);
|
|
46
60
|
font-family: inherit;
|
|
47
61
|
font-size: 12px;
|
|
48
|
-
font-weight:
|
|
62
|
+
font-weight: 600;
|
|
49
63
|
color: var(--text-secondary);
|
|
50
64
|
text-align: left;
|
|
51
65
|
cursor: pointer;
|
|
@@ -77,24 +91,25 @@
|
|
|
77
91
|
.mint-resource-picker__group-count {
|
|
78
92
|
font: 11px var(--font-mono);
|
|
79
93
|
font-variant-numeric: tabular-nums;
|
|
94
|
+
color: var(--text-muted);
|
|
80
95
|
}
|
|
81
96
|
|
|
82
97
|
.mint-resource-picker__row {
|
|
83
98
|
display: grid;
|
|
84
|
-
grid-template-columns: minmax(0, 1fr)
|
|
99
|
+
grid-template-columns: minmax(0, 1fr);
|
|
100
|
+
grid-auto-flow: column;
|
|
101
|
+
grid-auto-columns: auto;
|
|
85
102
|
align-items: center;
|
|
86
|
-
gap:
|
|
103
|
+
gap: 12px;
|
|
87
104
|
box-sizing: border-box;
|
|
88
105
|
flex-shrink: 0;
|
|
89
|
-
min-height:
|
|
90
|
-
|
|
91
|
-
|
|
106
|
+
min-height: 56px;
|
|
107
|
+
margin: 2px 0.5rem;
|
|
108
|
+
padding: 10px 12px;
|
|
109
|
+
border-radius: var(--radius-md);
|
|
92
110
|
cursor: pointer;
|
|
93
111
|
transition: background-color 150ms ease;
|
|
94
112
|
}
|
|
95
|
-
.mint-resource-picker__row:last-child {
|
|
96
|
-
border-bottom: 0;
|
|
97
|
-
}
|
|
98
113
|
.mint-resource-picker__row:hover {
|
|
99
114
|
background-color: var(--bg-hover);
|
|
100
115
|
}
|
|
@@ -110,7 +125,7 @@
|
|
|
110
125
|
.mint-resource-picker__text {
|
|
111
126
|
display: flex;
|
|
112
127
|
flex-direction: column;
|
|
113
|
-
gap:
|
|
128
|
+
gap: 4px;
|
|
114
129
|
min-width: 0;
|
|
115
130
|
line-height: 1.25;
|
|
116
131
|
}
|
|
@@ -118,18 +133,49 @@
|
|
|
118
133
|
overflow: hidden;
|
|
119
134
|
text-overflow: ellipsis;
|
|
120
135
|
white-space: nowrap;
|
|
121
|
-
font-size:
|
|
122
|
-
font-weight:
|
|
136
|
+
font-size: 15px;
|
|
137
|
+
font-weight: 600;
|
|
123
138
|
color: var(--text-primary);
|
|
124
139
|
}
|
|
125
140
|
.mint-resource-picker__row--selected .mint-resource-picker__title {
|
|
126
141
|
color: var(--_ink-primary);
|
|
127
142
|
}
|
|
128
|
-
.mint-resource-picker__code
|
|
143
|
+
.mint-resource-picker__code {
|
|
144
|
+
margin-right: 0.5rem;
|
|
145
|
+
}
|
|
146
|
+
.mint-resource-picker__aside {
|
|
147
|
+
display: flex;
|
|
148
|
+
flex-direction: column;
|
|
149
|
+
align-items: flex-end;
|
|
150
|
+
gap: 4px;
|
|
151
|
+
line-height: 1.25;
|
|
152
|
+
white-space: nowrap;
|
|
153
|
+
}
|
|
129
154
|
.mint-resource-picker__date {
|
|
130
|
-
font
|
|
155
|
+
font: 12px var(--font-mono);
|
|
131
156
|
font-variant-numeric: tabular-nums;
|
|
157
|
+
color: var(--text-muted);
|
|
158
|
+
}
|
|
159
|
+
.mint-resource-picker__status {
|
|
160
|
+
display: inline-flex;
|
|
161
|
+
align-items: center;
|
|
162
|
+
gap: 5px;
|
|
163
|
+
font-size: 12px;
|
|
164
|
+
font-weight: 500;
|
|
165
|
+
color: var(--text-secondary);
|
|
132
166
|
}
|
|
167
|
+
.mint-resource-picker__status::before {
|
|
168
|
+
content: '';
|
|
169
|
+
width: 6px;
|
|
170
|
+
height: 6px;
|
|
171
|
+
border-radius: 50%;
|
|
172
|
+
background-color: currentColor;
|
|
173
|
+
}
|
|
174
|
+
.mint-resource-picker__status--primary { color: var(--_ink-primary); }
|
|
175
|
+
.mint-resource-picker__status--success { color: var(--mint-success); }
|
|
176
|
+
.mint-resource-picker__status--warning { color: var(--mint-warning); }
|
|
177
|
+
.mint-resource-picker__status--error { color: var(--mint-error); }
|
|
178
|
+
.mint-resource-picker__status--info { color: var(--mint-info); }
|
|
133
179
|
.mint-resource-picker__meta {
|
|
134
180
|
overflow: hidden;
|
|
135
181
|
text-overflow: ellipsis;
|
|
@@ -142,29 +188,17 @@
|
|
|
142
188
|
align-items: center;
|
|
143
189
|
gap: 4px;
|
|
144
190
|
}
|
|
145
|
-
.mint-resource-picker__check-slot {
|
|
146
|
-
display: flex;
|
|
147
|
-
width: 14px;
|
|
148
|
-
}
|
|
149
|
-
.mint-resource-picker__check {
|
|
150
|
-
width: 14px;
|
|
151
|
-
height: 14px;
|
|
152
|
-
color: var(--color-primary);
|
|
153
|
-
}
|
|
154
191
|
|
|
155
192
|
.mint-resource-picker__skeleton-row {
|
|
156
193
|
display: flex;
|
|
157
194
|
flex-direction: column;
|
|
158
195
|
justify-content: center;
|
|
159
|
-
gap:
|
|
160
|
-
min-height:
|
|
161
|
-
padding:
|
|
162
|
-
border-bottom: 1px solid var(--border-light);
|
|
163
|
-
}
|
|
164
|
-
.mint-resource-picker__skeleton-row:last-child {
|
|
165
|
-
border-bottom: 0;
|
|
196
|
+
gap: 8px;
|
|
197
|
+
min-height: 56px;
|
|
198
|
+
padding: 10px 1.25rem;
|
|
166
199
|
}
|
|
167
200
|
.mint-resource-picker__error {
|
|
201
|
+
margin: 0 1.25rem 1.25rem;
|
|
168
202
|
padding: 0.75rem;
|
|
169
203
|
border: 1px solid var(--mint-error-border);
|
|
170
204
|
border-radius: var(--radius-md);
|
|
@@ -59,10 +59,9 @@
|
|
|
59
59
|
/* Header cells */
|
|
60
60
|
.mint-well-plate__col-header,
|
|
61
61
|
.mint-well-plate__row-header {
|
|
62
|
-
font-
|
|
63
|
-
font-weight: 400;
|
|
62
|
+
font-weight: 500;
|
|
64
63
|
text-align: center;
|
|
65
|
-
color: var(--text-
|
|
64
|
+
color: var(--text-muted);
|
|
66
65
|
}
|
|
67
66
|
|
|
68
67
|
.mint-well-plate__row-header {
|
|
@@ -83,9 +82,8 @@
|
|
|
83
82
|
font-weight: 500;
|
|
84
83
|
cursor: pointer;
|
|
85
84
|
transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease, opacity 0.15s ease;
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
border: 1px solid color-mix(in srgb, var(--text-secondary) 35%, var(--border-color));
|
|
85
|
+
background-color: var(--bg-tertiary);
|
|
86
|
+
border: 1px dashed var(--border-color);
|
|
89
87
|
}
|
|
90
88
|
|
|
91
89
|
.mint-well-plate__well--rounded {
|
|
@@ -97,7 +95,7 @@
|
|
|
97
95
|
}
|
|
98
96
|
|
|
99
97
|
.mint-well-plate__well--filled {
|
|
100
|
-
|
|
98
|
+
border-style: solid;
|
|
101
99
|
}
|
|
102
100
|
|
|
103
101
|
.mint-well-plate__well--disabled {
|
|
@@ -106,29 +104,27 @@
|
|
|
106
104
|
}
|
|
107
105
|
|
|
108
106
|
/* Well states */
|
|
109
|
-
/* Neutral ring + shape only, so a ring never vanishes into a sample color (2b). */
|
|
110
107
|
.mint-well-plate__well--selected {
|
|
111
|
-
box-shadow: 0 0 0 2px var(--
|
|
108
|
+
box-shadow: 0 0 0 2px var(--mint-success), 0 0 0 3px var(--bg-card);
|
|
112
109
|
}
|
|
113
110
|
|
|
114
111
|
.mint-well-plate__well--drag-over {
|
|
115
112
|
box-shadow: 0 0 0 2px var(--color-primary);
|
|
116
|
-
background-color: var(--color-primary
|
|
113
|
+
background-color: color-mix(in srgb, var(--color-primary) 20%, transparent);
|
|
117
114
|
}
|
|
118
115
|
|
|
119
116
|
.mint-well-plate__well--hovered {
|
|
120
|
-
box-shadow: 0 0 0
|
|
117
|
+
box-shadow: 0 0 0 2px color-mix(in srgb, var(--mint-success) 50%, transparent);
|
|
121
118
|
}
|
|
122
119
|
|
|
123
|
-
/* !important: wellStyle() sets an inline solid `border` on every draggable well. */
|
|
124
120
|
.mint-well-plate__well--drag-source {
|
|
125
|
-
|
|
121
|
+
box-shadow: 0 0 0 2px var(--mint-warning);
|
|
126
122
|
opacity: 0.5;
|
|
127
123
|
}
|
|
128
124
|
|
|
129
125
|
.mint-well-plate__well--drag-target {
|
|
130
|
-
box-shadow: 0 0 0 2px var(--
|
|
131
|
-
background-color: var(--
|
|
126
|
+
box-shadow: 0 0 0 2px var(--mint-success), 0 0 0 3px var(--bg-card);
|
|
127
|
+
background-color: color-mix(in srgb, var(--mint-success) 20%, transparent);
|
|
132
128
|
}
|
|
133
129
|
|
|
134
130
|
/* Optional semantic classes for `wellClass` callbacks. */
|
|
@@ -168,18 +164,6 @@
|
|
|
168
164
|
color: var(--text-primary);
|
|
169
165
|
}
|
|
170
166
|
|
|
171
|
-
/* Q / i marker glyph when the centre holds a label or well ID (iQC has no other cue) */
|
|
172
|
-
.mint-well-plate__corner-glyph {
|
|
173
|
-
position: absolute;
|
|
174
|
-
top: 3px;
|
|
175
|
-
left: 6px;
|
|
176
|
-
font-size: 10px;
|
|
177
|
-
font-weight: 700;
|
|
178
|
-
line-height: 1;
|
|
179
|
-
pointer-events: none;
|
|
180
|
-
color: var(--text-primary);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
167
|
/* Well ID text */
|
|
184
168
|
.mint-well-plate__well-id {
|
|
185
169
|
font-weight: 500;
|
|
@@ -268,34 +252,21 @@
|
|
|
268
252
|
/* Badge (injection count / custom method indicator) */
|
|
269
253
|
.mint-well-plate__badge {
|
|
270
254
|
position: absolute;
|
|
271
|
-
top: -
|
|
272
|
-
right: -
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
height: 14px;
|
|
276
|
-
padding: 0 3px;
|
|
255
|
+
top: -4px;
|
|
256
|
+
right: -4px;
|
|
257
|
+
width: 16px;
|
|
258
|
+
height: 16px;
|
|
277
259
|
border-radius: 9999px;
|
|
278
|
-
|
|
279
|
-
font-family: var(--font-mono);
|
|
280
|
-
font-size: 9px;
|
|
260
|
+
font-size: 10px;
|
|
281
261
|
font-weight: 700;
|
|
282
262
|
display: flex;
|
|
283
263
|
align-items: center;
|
|
284
264
|
justify-content: center;
|
|
285
|
-
color:
|
|
265
|
+
color: white;
|
|
286
266
|
pointer-events: none;
|
|
287
267
|
line-height: 1;
|
|
288
268
|
}
|
|
289
269
|
|
|
290
|
-
/* Custom method: a plain dot (7a) */
|
|
291
|
-
.mint-well-plate__badge--dot {
|
|
292
|
-
top: -2px;
|
|
293
|
-
right: -2px;
|
|
294
|
-
min-width: 8px;
|
|
295
|
-
height: 8px;
|
|
296
|
-
padding: 0;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
270
|
/* Sample type legend bar */
|
|
300
271
|
.mint-well-plate__sample-legend {
|
|
301
272
|
margin-top: 0.5rem;
|
|
@@ -312,23 +283,15 @@
|
|
|
312
283
|
}
|
|
313
284
|
|
|
314
285
|
.mint-well-plate__sample-legend-dot {
|
|
315
|
-
display: inline-flex;
|
|
316
|
-
align-items: center;
|
|
317
|
-
justify-content: center;
|
|
318
|
-
box-sizing: border-box;
|
|
319
286
|
width: 0.875rem;
|
|
320
287
|
height: 0.875rem;
|
|
321
288
|
border-radius: var(--radius-sm);
|
|
322
289
|
flex-shrink: 0;
|
|
323
|
-
font-family: var(--font-mono);
|
|
324
|
-
font-size: 0.625rem;
|
|
325
|
-
font-weight: 600;
|
|
326
|
-
line-height: 1;
|
|
327
290
|
}
|
|
328
291
|
|
|
329
292
|
.mint-well-plate__sample-legend-text {
|
|
330
293
|
font-size: 0.75rem;
|
|
331
|
-
color: var(--text-
|
|
294
|
+
color: var(--text-muted);
|
|
332
295
|
}
|
|
333
296
|
|
|
334
297
|
/* Empty / loading / error placeholder host (content comes from EmptyState) */
|
package/src/types/auth.ts
CHANGED
|
@@ -20,40 +20,3 @@ export interface UserInfo {
|
|
|
20
20
|
roleObj?: RoleInfo | null
|
|
21
21
|
isActive: boolean
|
|
22
22
|
}
|
|
23
|
-
|
|
24
|
-
// Login response from API
|
|
25
|
-
export interface LoginResponse {
|
|
26
|
-
access_token: string
|
|
27
|
-
token_type: string
|
|
28
|
-
expires_in: number
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Token verification response
|
|
32
|
-
export interface TokenVerifyResponse {
|
|
33
|
-
valid: boolean
|
|
34
|
-
username: string | null
|
|
35
|
-
expires_at: string | null
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// Registration request
|
|
39
|
-
export interface RegisterRequest {
|
|
40
|
-
username: string
|
|
41
|
-
password: string
|
|
42
|
-
email?: string
|
|
43
|
-
shortname?: string
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// Profile update request
|
|
47
|
-
export interface UpdateProfileRequest {
|
|
48
|
-
email?: string
|
|
49
|
-
shortname?: string
|
|
50
|
-
current_password?: string
|
|
51
|
-
new_password?: string
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Passkey credential info
|
|
55
|
-
export interface CredentialInfo {
|
|
56
|
-
credential_id: string
|
|
57
|
-
device_name: string | null
|
|
58
|
-
created_at: string
|
|
59
|
-
}
|
package/src/types/components.ts
CHANGED
|
@@ -13,6 +13,8 @@ interface ActionMenuItemBase {
|
|
|
13
13
|
label: string
|
|
14
14
|
disabled?: boolean
|
|
15
15
|
danger?: boolean
|
|
16
|
+
/** Set on every item to make the menu a single choice (`menuitemradio`); true marks the current one. */
|
|
17
|
+
checked?: boolean
|
|
16
18
|
}
|
|
17
19
|
|
|
18
20
|
export type ActionMenuItem =
|
|
@@ -23,6 +25,8 @@ export type ActionMenuItem =
|
|
|
23
25
|
| (ActionMenuItemBase & {
|
|
24
26
|
href: string
|
|
25
27
|
target?: '_self' | '_blank' | '_parent' | '_top'
|
|
28
|
+
/** Links navigate; only buttons can be single-choice items. */
|
|
29
|
+
checked?: never
|
|
26
30
|
})
|
|
27
31
|
|
|
28
32
|
// Input types
|
|
@@ -207,6 +211,8 @@ export interface TopBarSettingsConfig {
|
|
|
207
211
|
title?: string
|
|
208
212
|
tabs?: SettingsTabInput[]
|
|
209
213
|
showAppearance?: boolean
|
|
214
|
+
/** List Appearance before the other tabs and open on it. */
|
|
215
|
+
appearanceFirst?: boolean
|
|
210
216
|
size?: 'md' | 'lg' | 'xl'
|
|
211
217
|
layout?: SettingsModalLayout
|
|
212
218
|
/** Schema-driven config — when set, fields auto-render via SDK form components. */
|
|
@@ -496,6 +502,8 @@ export interface SettingsTab extends AccessControlled {
|
|
|
496
502
|
description?: string
|
|
497
503
|
/** Optional monospace meta shown right of the tab label — a count, "2 unsaved", etc. */
|
|
498
504
|
meta?: string
|
|
505
|
+
/** Rail section heading for this tab when Appearance is shown; defaults to "Plugin". */
|
|
506
|
+
section?: string
|
|
499
507
|
}
|
|
500
508
|
|
|
501
509
|
export type SettingsTabInput = SettingsTab | string
|
|
@@ -83,3 +83,18 @@ export interface FileBrowserLocation {
|
|
|
83
83
|
mount_id: string
|
|
84
84
|
path: string
|
|
85
85
|
}
|
|
86
|
+
|
|
87
|
+
/** Several directory levels in one response, parents before children. */
|
|
88
|
+
export interface FileDirectoryTree {
|
|
89
|
+
listings?: FileDirectoryListing[]
|
|
90
|
+
/** True when the server's entry budget stopped before the requested depth. */
|
|
91
|
+
truncated?: boolean
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Entries whose name contains a query, below one directory. */
|
|
95
|
+
export interface FileSearchResult {
|
|
96
|
+
entries?: FileEntry[]
|
|
97
|
+
searched_directories?: number
|
|
98
|
+
/** True when a directory, result or time budget ended the search early. */
|
|
99
|
+
truncated?: boolean
|
|
100
|
+
}
|
package/src/types/filePicker.ts
CHANGED
|
@@ -3,6 +3,8 @@ export type PickerSource = 'server' | 'localFile'
|
|
|
3
3
|
export type PickerSelectionMode = 'single-file' | 'multi-file' | 'folder' | 'folder+files'
|
|
4
4
|
/** `list` shows one folder at a time (the default); `tree` adds disclosure triangles. */
|
|
5
5
|
export type PickerView = 'list' | 'tree'
|
|
6
|
+
/** Row order inside each folder; folders always come before files. */
|
|
7
|
+
export type PickerSort = 'newest' | 'oldest' | 'name' | 'name-desc'
|
|
6
8
|
|
|
7
9
|
interface PickerNodeBase {
|
|
8
10
|
path: string
|
|
@@ -39,6 +41,11 @@ export interface PickerRequest {
|
|
|
39
41
|
*/
|
|
40
42
|
refresh?: true
|
|
41
43
|
}
|
|
44
|
+
/** What a search found before a server or walk limit stopped it. */
|
|
45
|
+
export interface PickerSearchResult {
|
|
46
|
+
nodes: PickerNode[]
|
|
47
|
+
truncated: boolean
|
|
48
|
+
}
|
|
42
49
|
export interface PickerAdapter {
|
|
43
50
|
/**
|
|
44
51
|
* `listRoot()` returns mount points. FilePicker then shows them as header
|
|
@@ -55,7 +62,7 @@ export interface PickerAdapter {
|
|
|
55
62
|
query: string,
|
|
56
63
|
scope: { path: string; recursive: boolean },
|
|
57
64
|
request?: PickerRequest,
|
|
58
|
-
): Promise<PickerNode[]>
|
|
65
|
+
): Promise<PickerNode[] | PickerSearchResult>
|
|
59
66
|
}
|
|
60
67
|
export interface PickerCapability {
|
|
61
68
|
/** Case-insensitive suffixes, including compound extensions such as mzML.gz. */
|
package/src/types/index.ts
CHANGED
|
@@ -218,9 +218,11 @@ export type {
|
|
|
218
218
|
FileBrowserLocation,
|
|
219
219
|
FileBrowserSortKey,
|
|
220
220
|
FileDirectoryListing,
|
|
221
|
+
FileDirectoryTree,
|
|
221
222
|
FileEntry,
|
|
222
223
|
FileEntryKind,
|
|
223
224
|
FilePathCrumb,
|
|
225
|
+
FileSearchResult,
|
|
224
226
|
FileSelection,
|
|
225
227
|
ServerMount,
|
|
226
228
|
} from './fileBrowserTypes'
|
|
@@ -296,11 +298,6 @@ export type {
|
|
|
296
298
|
export type {
|
|
297
299
|
AuthConfig,
|
|
298
300
|
UserInfo,
|
|
299
|
-
LoginResponse,
|
|
300
|
-
TokenVerifyResponse,
|
|
301
|
-
RegisterRequest,
|
|
302
|
-
UpdateProfileRequest,
|
|
303
|
-
CredentialInfo,
|
|
304
301
|
} from './auth'
|
|
305
302
|
|
|
306
303
|
// Platform types
|
package/src/types/platform.ts
CHANGED
|
@@ -4,6 +4,8 @@ import type { RoleInfo } from '../permissions'
|
|
|
4
4
|
export interface PluginInfo {
|
|
5
5
|
id: string
|
|
6
6
|
name: string
|
|
7
|
+
/** Name to show in the UI; the platform falls back to the plugin ID. Absent before MINT 1.3. */
|
|
8
|
+
display_name?: string
|
|
7
9
|
version: string
|
|
8
10
|
plugin_type?: string
|
|
9
11
|
description?: string
|