@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.
Files changed (134) hide show
  1. package/README.md +23 -140
  2. package/dist/{ResourcePickerListInternal-c3IT8PIu.js → ResourcePickerListInternal-CFAw4vTZ.js} +26 -19
  3. package/dist/ResourcePickerListInternal-CFAw4vTZ.js.map +1 -0
  4. package/dist/components/FilePicker.vue.d.ts +4 -1
  5. package/dist/components/SettingsModal.schema.d.ts +1 -1
  6. package/dist/components/SettingsModal.vue.d.ts +2 -0
  7. package/dist/components/WellPlate.colors.d.ts +1 -5
  8. package/dist/components/WellPlate.rendering.d.ts +5 -2
  9. package/dist/components/index.d.ts +32 -17
  10. package/dist/components/index.js +3 -3
  11. package/dist/components/internal/FilePickerListInternal.vue.d.ts +2 -0
  12. package/dist/components/internal/ResourcePickerListInternal.vue.d.ts +9 -3
  13. package/dist/{components-CvY105kJ.js → components-GDDvof8D.js} +414 -368
  14. package/dist/components-GDDvof8D.js.map +1 -0
  15. package/dist/composables/createFilePickerAdapter.d.ts +5 -1
  16. package/dist/composables/filePicker/usePickerNavigation.d.ts +3 -2
  17. package/dist/composables/index.d.ts +0 -3
  18. package/dist/composables/index.js +4 -4
  19. package/dist/composables/useAutoGroup.d.ts +1 -1
  20. package/dist/composables/useBioTemplateComponents.d.ts +15 -3
  21. package/dist/composables/useBioTemplateControls.d.ts +5 -1
  22. package/dist/composables/useBioTemplatePackWorkspace.d.ts +2 -0
  23. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +5 -1
  24. package/dist/composables/useBioTemplateWorkspace.d.ts +5 -1
  25. package/dist/composables/useExperimentSave.d.ts +5 -1
  26. package/dist/composables/useFilePicker.d.ts +4 -1
  27. package/dist/composables/useGroupAssignment.d.ts +5 -1
  28. package/dist/composables/usePlatformContext.d.ts +3 -0
  29. package/dist/composables/useTemplateCollection.d.ts +5 -1
  30. package/dist/composables-D6uqp0UF.js +591 -0
  31. package/dist/composables-D6uqp0UF.js.map +1 -0
  32. package/dist/index.js +24 -24
  33. package/dist/index.js.map +1 -1
  34. package/dist/install.js +1 -1
  35. package/dist/lcms.d.ts +11 -11
  36. package/dist/styles.css +170 -200
  37. package/dist/templates/index.js +1 -1
  38. package/dist/{templates-Bj9hZ7iV.js → templates-BU1pet28.js} +31 -44
  39. package/dist/templates-BU1pet28.js.map +1 -0
  40. package/dist/types/auth.d.ts +0 -27
  41. package/dist/types/components.d.ts +8 -0
  42. package/dist/types/fileBrowserTypes.d.ts +13 -0
  43. package/dist/types/filePicker.d.ts +8 -1
  44. package/dist/types/index.d.ts +2 -2
  45. package/dist/types/platform.d.ts +2 -0
  46. package/dist/utils/rack.d.ts +16 -16
  47. package/dist/{validation-B4Y8_eEe.js → validation-Dmp9Q5W0.js} +50 -12
  48. package/dist/validation-Dmp9Q5W0.js.map +1 -0
  49. package/package.json +1 -6
  50. package/src/__tests__/components/ActionMenu.test.ts +10 -0
  51. package/src/__tests__/components/AppTopBar.test.ts +24 -8
  52. package/src/__tests__/components/EmptyState.test.ts +15 -0
  53. package/src/__tests__/components/ExperimentSelectorModal.test.ts +12 -5
  54. package/src/__tests__/components/FilePicker.test.ts +65 -1
  55. package/src/__tests__/components/FileUploader.test.ts +6 -9
  56. package/src/__tests__/components/ResourcePickerListInternal.test.ts +23 -4
  57. package/src/__tests__/components/SettingsModal.test.ts +22 -0
  58. package/src/__tests__/components/WellPlate.decoration.test.ts +4 -28
  59. package/src/__tests__/components/WellPlate.rendering.test.ts +20 -33
  60. package/src/__tests__/components/WellPlate.sampleTypeIndicator.test.ts +7 -7
  61. package/src/__tests__/composables/createFilePickerAdapter.test.ts +92 -1
  62. package/src/__tests__/composables/usePickerNavigation.test.ts +61 -1
  63. package/src/__tests__/composables/usePlatformFilePickerAdapter.test.ts +18 -6
  64. package/src/__tests__/docs/frontendDocsCatalog.test.ts +2 -2
  65. package/src/__tests__/styles/controlRefreshRules.test.ts +21 -8
  66. package/src/__tests__/styles/menusShellRefresh.test.ts +20 -5
  67. package/src/__tests__/templates/templatesDeprecation.test.ts +58 -11
  68. package/src/components/ActionMenu.vue +10 -2
  69. package/src/components/AppTopBar.vue +6 -4
  70. package/src/components/EmptyState.vue +3 -1
  71. package/src/components/ExperimentSelectorModal.vue +4 -1
  72. package/src/components/FilePicker.vue +42 -0
  73. package/src/components/FileUploader.vue +30 -46
  74. package/src/components/SettingsModal.schema.ts +4 -2
  75. package/src/components/SettingsModal.vue +4 -2
  76. package/src/components/WellPlate.colors.ts +6 -10
  77. package/src/components/WellPlate.legend.ts +4 -4
  78. package/src/components/WellPlate.rendering.ts +9 -8
  79. package/src/components/WellPlate.vue +5 -22
  80. package/src/components/index.ts +32 -17
  81. package/src/components/internal/FilePickerListInternal.vue +11 -2
  82. package/src/components/internal/ResourcePickerListInternal.vue +21 -27
  83. package/src/composables/autoGroup/index.ts +1 -1
  84. package/src/composables/createFilePickerAdapter.ts +82 -22
  85. package/src/composables/filePicker/usePickerNavigation.ts +29 -2
  86. package/src/composables/index.ts +0 -7
  87. package/src/composables/useAutoGroup.ts +1 -1
  88. package/src/composables/useBioTemplateComponents.ts +15 -3
  89. package/src/composables/useBioTemplateControls.ts +5 -1
  90. package/src/composables/useBioTemplatePackWorkspace.ts +2 -0
  91. package/src/composables/useBioTemplatePresetWorkspace.ts +5 -1
  92. package/src/composables/useBioTemplateWorkspace.ts +5 -1
  93. package/src/composables/useExperimentSave.ts +5 -1
  94. package/src/composables/useFilePicker.ts +8 -1
  95. package/src/composables/useGroupAssignment.ts +5 -1
  96. package/src/composables/usePlatformFilePickerAdapter.ts +26 -4
  97. package/src/composables/useTemplateCollection.ts +5 -1
  98. package/src/index.ts +1 -1
  99. package/src/lcms.ts +11 -11
  100. package/src/styles/components/action-menu.css +10 -0
  101. package/src/styles/components/app-page-selector.css +3 -3
  102. package/src/styles/components/app-pill-nav.css +1 -1
  103. package/src/styles/components/app-top-bar.css +18 -38
  104. package/src/styles/components/empty-state.css +3 -2
  105. package/src/styles/components/experiment-selector-modal.css +3 -9
  106. package/src/styles/components/file-picker.css +23 -1
  107. package/src/styles/components/file-uploader.css +22 -55
  108. package/src/styles/components/resource-picker-list.css +70 -36
  109. package/src/styles/components/well-plate.css +18 -55
  110. package/src/types/auth.ts +0 -37
  111. package/src/types/components.ts +8 -0
  112. package/src/types/fileBrowserTypes.ts +15 -0
  113. package/src/types/filePicker.ts +8 -1
  114. package/src/types/index.ts +2 -5
  115. package/src/types/platform.ts +2 -0
  116. package/src/utils/rack.ts +16 -16
  117. package/dist/ResourcePickerListInternal-c3IT8PIu.js.map +0 -1
  118. package/dist/__tests__/composables/useAuth.test.d.ts +0 -1
  119. package/dist/__tests__/composables/usePasskey.test.d.ts +0 -1
  120. package/dist/components-CvY105kJ.js.map +0 -1
  121. package/dist/composables/useAuth.d.ts +0 -47
  122. package/dist/composables/usePasskey.d.ts +0 -10
  123. package/dist/composables/useWellPlateEditor.d.ts +0 -33
  124. package/dist/composables-DL4Vca7L.js +0 -1193
  125. package/dist/composables-DL4Vca7L.js.map +0 -1
  126. package/dist/plotly.min-D6Ge6qgX.js +0 -168582
  127. package/dist/plotly.min-D6Ge6qgX.js.map +0 -1
  128. package/dist/templates-Bj9hZ7iV.js.map +0 -1
  129. package/dist/validation-B4Y8_eEe.js.map +0 -1
  130. package/src/__tests__/composables/useAuth.test.ts +0 -290
  131. package/src/__tests__/composables/usePasskey.test.ts +0 -38
  132. package/src/composables/useAuth.ts +0 -470
  133. package/src/composables/usePasskey.ts +0 -216
  134. 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: 1px dashed var(--_control-border-strong);
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
- background: var(--bg-hover);
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: none;
31
- box-shadow: var(--focus-ring-offset);
30
+ outline: 2px solid var(--color-primary);
31
+ outline-offset: 2px;
32
32
  }
33
33
 
34
- .mint-file-uploader__dropzone--dragover,
35
- .mint-file-uploader__dropzone--dragover:hover {
36
- border: 1.5px solid var(--color-primary);
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: 0.75rem;
45
+ padding: 1.25rem;
49
46
  }
50
47
 
51
48
  .mint-file-uploader__dropzone--md {
52
- padding: 1.125rem;
49
+ padding: 1.5rem;
53
50
  }
54
51
 
55
52
  .mint-file-uploader__dropzone--lg {
56
- padding: 1.5rem;
53
+ padding: 2rem;
57
54
  }
58
55
 
59
56
  /* ==========================================================================
60
- Content area — compact row: icon tile + prompt + accepted formats
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
- gap: 0.75rem;
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-tile {
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
- border-radius: var(--radius-md);
81
- background: var(--bg-tertiary);
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-uploader__copy {
98
- display: flex;
99
- flex-direction: column;
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-primary);
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 (8b): shared list for ExperimentSelectorModal and ArtifactSelectorModal. */
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
- overflow: hidden;
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 12px;
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: 500;
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) auto 14px;
99
+ grid-template-columns: minmax(0, 1fr);
100
+ grid-auto-flow: column;
101
+ grid-auto-columns: auto;
85
102
  align-items: center;
86
- gap: 10px;
103
+ gap: 12px;
87
104
  box-sizing: border-box;
88
105
  flex-shrink: 0;
89
- min-height: 44px;
90
- padding: 5px 12px;
91
- border-bottom: 1px solid var(--border-light);
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: 1px;
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: 13px;
122
- font-weight: 500;
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-family: var(--font-mono);
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: 6px;
160
- min-height: 44px;
161
- padding: 5px 12px;
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-family: var(--font-mono);
63
- font-weight: 400;
62
+ font-weight: 500;
64
63
  text-align: center;
65
- color: var(--text-secondary);
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
- /* Empty well: solid hairline, no dash — dozens of dashed rings read as noise (2b). */
87
- background-color: var(--bg-card);
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
- background-color: var(--bg-tertiary);
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(--bg-card), 0 0 0 3.5px var(--text-primary);
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-soft);
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 1px var(--text-secondary);
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
- border-style: dashed !important;
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(--bg-card), 0 0 0 3.5px var(--color-primary);
131
- background-color: var(--color-primary-soft);
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: -5px;
272
- right: -5px;
273
- box-sizing: border-box;
274
- min-width: 14px;
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
- box-shadow: 0 0 0 2px var(--bg-card);
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: var(--bg-card);
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-secondary);
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
- }
@@ -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
+ }
@@ -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. */
@@ -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
@@ -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