@morscherlab/mint-sdk 1.3.0-beta.1 → 1.3.0-beta.11

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 (136) 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-vHfxV2PB.js} +425 -392
  14. package/dist/components-vHfxV2PB.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 +228 -214
  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/AppTopBarPageSelector.test.ts +4 -4
  53. package/src/__tests__/components/EmptyState.test.ts +15 -0
  54. package/src/__tests__/components/ExperimentSelectorModal.test.ts +12 -5
  55. package/src/__tests__/components/FilePicker.test.ts +65 -1
  56. package/src/__tests__/components/FileUploader.test.ts +6 -9
  57. package/src/__tests__/components/ResourcePickerListInternal.test.ts +23 -4
  58. package/src/__tests__/components/SettingsModal.test.ts +22 -0
  59. package/src/__tests__/components/WellPlate.decoration.test.ts +4 -28
  60. package/src/__tests__/components/WellPlate.rendering.test.ts +20 -33
  61. package/src/__tests__/components/WellPlate.sampleTypeIndicator.test.ts +7 -7
  62. package/src/__tests__/composables/createFilePickerAdapter.test.ts +92 -1
  63. package/src/__tests__/composables/usePickerNavigation.test.ts +61 -1
  64. package/src/__tests__/composables/usePlatformFilePickerAdapter.test.ts +18 -6
  65. package/src/__tests__/docs/frontendDocsCatalog.test.ts +2 -2
  66. package/src/__tests__/styles/controlRefreshRules.test.ts +21 -8
  67. package/src/__tests__/styles/menusShellRefresh.test.ts +20 -5
  68. package/src/__tests__/templates/templatesDeprecation.test.ts +58 -11
  69. package/src/components/ActionMenu.vue +10 -2
  70. package/src/components/AppTopBar.vue +6 -4
  71. package/src/components/EmptyState.vue +3 -1
  72. package/src/components/ExperimentSelectorModal.vue +4 -1
  73. package/src/components/FilePicker.vue +42 -0
  74. package/src/components/FileUploader.vue +30 -46
  75. package/src/components/SettingsModal.schema.ts +4 -2
  76. package/src/components/SettingsModal.vue +4 -2
  77. package/src/components/WellPlate.colors.ts +6 -10
  78. package/src/components/WellPlate.legend.ts +4 -4
  79. package/src/components/WellPlate.rendering.ts +9 -8
  80. package/src/components/WellPlate.vue +5 -22
  81. package/src/components/index.ts +32 -17
  82. package/src/components/internal/AppTopBarPageSelectorInternal.vue +3 -6
  83. package/src/components/internal/FilePickerListInternal.vue +11 -2
  84. package/src/components/internal/ResourcePickerListInternal.vue +21 -27
  85. package/src/composables/autoGroup/index.ts +1 -1
  86. package/src/composables/createFilePickerAdapter.ts +82 -22
  87. package/src/composables/filePicker/usePickerNavigation.ts +29 -2
  88. package/src/composables/index.ts +0 -7
  89. package/src/composables/useAutoGroup.ts +1 -1
  90. package/src/composables/useBioTemplateComponents.ts +15 -3
  91. package/src/composables/useBioTemplateControls.ts +5 -1
  92. package/src/composables/useBioTemplatePackWorkspace.ts +2 -0
  93. package/src/composables/useBioTemplatePresetWorkspace.ts +5 -1
  94. package/src/composables/useBioTemplateWorkspace.ts +5 -1
  95. package/src/composables/useExperimentSave.ts +5 -1
  96. package/src/composables/useFilePicker.ts +8 -1
  97. package/src/composables/useGroupAssignment.ts +5 -1
  98. package/src/composables/usePlatformFilePickerAdapter.ts +26 -4
  99. package/src/composables/useTemplateCollection.ts +5 -1
  100. package/src/index.ts +1 -1
  101. package/src/lcms.ts +11 -11
  102. package/src/styles/components/action-menu.css +10 -0
  103. package/src/styles/components/app-page-selector.css +61 -17
  104. package/src/styles/components/app-pill-nav.css +1 -1
  105. package/src/styles/components/app-top-bar.css +18 -38
  106. package/src/styles/components/empty-state.css +3 -2
  107. package/src/styles/components/experiment-selector-modal.css +3 -9
  108. package/src/styles/components/file-picker.css +23 -1
  109. package/src/styles/components/file-uploader.css +22 -55
  110. package/src/styles/components/resource-picker-list.css +70 -36
  111. package/src/styles/components/well-plate.css +18 -55
  112. package/src/types/auth.ts +0 -37
  113. package/src/types/components.ts +8 -0
  114. package/src/types/fileBrowserTypes.ts +15 -0
  115. package/src/types/filePicker.ts +8 -1
  116. package/src/types/index.ts +2 -5
  117. package/src/types/platform.ts +2 -0
  118. package/src/utils/rack.ts +16 -16
  119. package/dist/ResourcePickerListInternal-c3IT8PIu.js.map +0 -1
  120. package/dist/__tests__/composables/useAuth.test.d.ts +0 -1
  121. package/dist/__tests__/composables/usePasskey.test.d.ts +0 -1
  122. package/dist/components-CvY105kJ.js.map +0 -1
  123. package/dist/composables/useAuth.d.ts +0 -47
  124. package/dist/composables/usePasskey.d.ts +0 -10
  125. package/dist/composables/useWellPlateEditor.d.ts +0 -33
  126. package/dist/composables-DL4Vca7L.js +0 -1193
  127. package/dist/composables-DL4Vca7L.js.map +0 -1
  128. package/dist/plotly.min-D6Ge6qgX.js +0 -168582
  129. package/dist/plotly.min-D6Ge6qgX.js.map +0 -1
  130. package/dist/templates-Bj9hZ7iV.js.map +0 -1
  131. package/dist/validation-B4Y8_eEe.js.map +0 -1
  132. package/src/__tests__/composables/useAuth.test.ts +0 -290
  133. package/src/__tests__/composables/usePasskey.test.ts +0 -38
  134. package/src/composables/useAuth.ts +0 -470
  135. package/src/composables/usePasskey.ts +0 -216
  136. package/src/composables/useWellPlateEditor.ts +0 -415
@@ -1,7 +1,7 @@
1
1
  /* AppTopBar page selector — left-side route/page dropdown.
2
- Trigger speaks the field language (5a): 32px, hover changes the background
3
- only, open = field focus, inline 12px chevron. Menu = .mint-popover +
4
- .mint-menu-item (2d); __menu / __item stay as aliases. */
2
+ Trigger speaks the field language (5a): 36px (the identity tile height), hover changes the background
3
+ only, open = field focus, inline 12px chevron. The menu keeps the 1.2 panel
4
+ (own card, tinted active row) rather than .mint-popover + .mint-menu-item. */
5
5
 
6
6
  .mint-page-selector {
7
7
  position: relative;
@@ -13,8 +13,8 @@
13
13
  align-items: center;
14
14
  gap: 0.5rem;
15
15
  width: 100%;
16
- height: 2rem;
17
- padding: 0 0.5rem 0 0.3125rem;
16
+ height: 2.25rem;
17
+ padding: 0 0.5rem 0 0.4375rem;
18
18
  border: 1px solid var(--border-color);
19
19
  background: var(--bg-card);
20
20
  color: var(--text-primary);
@@ -101,44 +101,88 @@
101
101
 
102
102
  .mint-page-selector__menu {
103
103
  position: absolute;
104
- top: calc(100% + 0.25rem);
104
+ top: calc(100% + 0.375rem);
105
105
  left: 0;
106
106
  width: 16.25rem;
107
+ background: var(--bg-card);
108
+ border: 1px solid var(--border-color);
109
+ border-radius: var(--radius-lg);
110
+ box-shadow: var(--shadow-md);
111
+ padding: 0.375rem;
107
112
  z-index: 50;
108
113
  }
109
114
 
110
115
  .mint-page-selector__menu-title {
111
- padding: 0.25rem 0.5rem 0.375rem;
116
+ padding: 0.375rem 0.625rem 0.5rem;
112
117
  font-size: 0.75rem;
113
118
  font-weight: 500;
114
119
  color: var(--text-secondary);
115
120
  }
116
121
 
122
+ .mint-page-selector__item {
123
+ display: flex;
124
+ align-items: center;
125
+ gap: 0.625rem;
126
+ width: 100%;
127
+ padding: 0.5rem 0.625rem;
128
+ border: 0;
129
+ background: transparent;
130
+ border-radius: 0.4375rem;
131
+ color: var(--text-primary);
132
+ font-size: 0.8125rem;
133
+ font-weight: 500;
134
+ font-family: inherit;
135
+ text-align: left;
136
+ text-decoration: none;
137
+ cursor: pointer;
138
+ transition: background-color var(--mint-transition);
139
+ }
140
+
141
+ .mint-page-selector__item:hover:not(.mint-page-selector__item--disabled) {
142
+ background: var(--bg-hover);
143
+ }
144
+
145
+ .mint-page-selector__item--active {
146
+ background: var(--bg-tertiary);
147
+ font-weight: 600;
148
+ }
149
+
150
+ .mint-page-selector__item--disabled {
151
+ opacity: var(--mint-disabled-opacity);
152
+ cursor: not-allowed;
153
+ }
154
+
117
155
  .mint-page-selector__item-icon {
118
- width: 1.25rem;
119
- height: 1.25rem;
120
- border-radius: var(--radius-sm);
156
+ width: 1.375rem;
157
+ height: 1.375rem;
158
+ border-radius: 0.3125rem;
121
159
  background: var(--bg-tertiary);
122
- color: var(--text-secondary-strong);
160
+ color: var(--text-secondary);
123
161
  display: grid;
124
162
  place-items: center;
125
163
  flex-shrink: 0;
126
164
  }
127
165
 
128
- .mint-page-selector__item-icon--metadata {
166
+ .mint-page-selector__item--active .mint-page-selector__item-icon {
167
+ background: var(--color-primary-soft);
168
+ color: var(--color-primary);
169
+ }
170
+
171
+ .mint-page-selector__item-icon--metadata,
172
+ .mint-page-selector__item--active .mint-page-selector__item-icon--metadata {
129
173
  background: transparent;
130
174
  color: inherit;
131
175
  }
132
176
 
133
177
  .mint-page-selector__item-icon svg {
134
- width: 0.75rem;
135
- height: 0.75rem;
178
+ width: 0.8125rem;
179
+ height: 0.8125rem;
136
180
  }
137
181
 
138
182
  .mint-page-selector__metadata-icon.mint-plugin-icon--sm {
139
- width: 1.25rem;
140
- height: 1.25rem;
141
- border-radius: var(--radius-sm);
183
+ width: 1.375rem;
184
+ height: 1.375rem;
185
+ border-radius: 0.3125rem;
142
186
  }
143
187
 
144
188
  .mint-page-selector__item-label {
@@ -21,7 +21,7 @@
21
21
  display: inline-flex;
22
22
  align-items: center;
23
23
  gap: 0.375rem;
24
- height: 1.625rem;
24
+ height: 1.75rem;
25
25
  border: 0;
26
26
  padding: 0 0.875rem;
27
27
  border-radius: 9999px;
@@ -9,7 +9,7 @@
9
9
  .mint-topbar {
10
10
  display: block;
11
11
  width: 100%;
12
- padding: 0.625rem 0.75rem;
12
+ padding: 0.75rem 1rem;
13
13
  background-color: var(--bg-secondary);
14
14
  box-sizing: border-box;
15
15
  }
@@ -19,7 +19,7 @@
19
19
  display: flex;
20
20
  align-items: center;
21
21
  gap: 0.5rem;
22
- min-height: 2rem;
22
+ min-height: 2.375rem;
23
23
  position: relative;
24
24
  }
25
25
 
@@ -31,35 +31,28 @@
31
31
  }
32
32
 
33
33
  .mint-topbar__identity {
34
- width: 2rem;
35
- height: 2rem;
34
+ width: 2.25rem;
35
+ height: 2.25rem;
36
36
  display: inline-flex;
37
37
  align-items: center;
38
38
  justify-content: center;
39
39
  flex-shrink: 0;
40
40
  }
41
41
 
42
- /* The 36px plugin tile would push the bar past 52px; the bar uses the 32px control height. */
43
- .mint-topbar__identity .mint-plugin-icon--topbar {
44
- width: 2rem;
45
- height: 2rem;
42
+ /* Slotted logos sized above 36px shrink to fit instead of stretching the tile. */
43
+ .mint-topbar__identity > * {
44
+ max-width: 100%;
45
+ max-height: 100%;
46
46
  }
47
47
 
48
- /* Integrated: the tile joins the static identity as a 20px mark (icon + name + version). */
49
- .mint-topbar__brand:has(+ .mint-topbar__plugin-identity) .mint-topbar__identity {
50
- width: auto;
51
- padding-left: 0.125rem;
48
+ /* Left and right fields share the 36px identity tile height. */
49
+ .mint-topbar .mint-experiment-popover__trigger,
50
+ .mint-topbar .mint-experiment-popover__save-trigger {
51
+ height: 2.25rem;
52
52
  }
53
53
 
54
- .mint-topbar__brand:has(+ .mint-topbar__plugin-identity) .mint-plugin-icon--topbar {
55
- width: 1.25rem;
56
- height: 1.25rem;
57
- border-radius: var(--radius-sm);
58
- }
59
-
60
- .mint-topbar__brand:has(+ .mint-topbar__plugin-identity) .mint-plugin-icon--topbar :is(.mint-plugin-icon__svg, .mint-plugin-icon__img) {
61
- width: 0.75rem;
62
- height: 0.75rem;
54
+ .mint-topbar .mint-experiment-popover__save-trigger {
55
+ width: 2.25rem;
63
56
  }
64
57
 
65
58
  /* Centered section — absolute so asymmetric left/right weight never shifts the
@@ -98,8 +91,8 @@
98
91
  }
99
92
 
100
93
  .mint-topbar__logo-icon {
101
- width: 2rem;
102
- height: 2rem;
94
+ width: 2.25rem;
95
+ height: 2.25rem;
103
96
  background-color: var(--color-primary);
104
97
  border-radius: var(--radius-md);
105
98
  display: flex;
@@ -118,7 +111,7 @@
118
111
  color: var(--text-primary);
119
112
  }
120
113
 
121
- /* Static plugin identity: name + mono version, not a control (5a) */
114
+ /* Static plugin identity: name only, not a control (5a) */
122
115
  .mint-topbar__plugin-identity {
123
116
  display: inline-flex;
124
117
  align-items: baseline;
@@ -136,19 +129,6 @@
136
129
  text-overflow: ellipsis;
137
130
  }
138
131
 
139
- .mint-topbar__plugin-version {
140
- font-family: var(--font-mono);
141
- font-size: 0.6875rem;
142
- color: var(--text-secondary);
143
- }
144
-
145
- .mint-topbar__divider {
146
- width: 1px;
147
- height: 1.25rem;
148
- flex-shrink: 0;
149
- background-color: var(--border-color);
150
- }
151
-
152
132
  /* Variant: card - inline card with margins and rounded corners */
153
133
  .mint-topbar--card {
154
134
  width: calc(100% - 2rem);
@@ -175,7 +155,7 @@
175
155
  opacity: 0.8;
176
156
  }
177
157
 
178
- /* Title + subtitle stay inside the 32px control row (5a: 52px bar). */
158
+ /* Title + subtitle stay inside the 36px control row. */
179
159
  .mint-topbar-title-group {
180
160
  display: flex;
181
161
  flex-direction: column;
@@ -115,8 +115,9 @@
115
115
  color: var(--text-muted);
116
116
  }
117
117
 
118
- /* Action */
119
- .mint-empty-state--illustrated .mint-empty-state__action {
118
+ /* Action — slotted content sits in a block so a child's own larger top margin collapses into this one. */
119
+ .mint-empty-state--illustrated .mint-empty-state__action,
120
+ .mint-empty-state--illustrated .mint-empty-state__content {
120
121
  margin-top: 0.625rem;
121
122
  }
122
123
 
@@ -5,6 +5,7 @@
5
5
  align-items: center;
6
6
  gap: 0.5rem;
7
7
  flex-wrap: wrap;
8
+ padding: 0 1.25rem;
8
9
  }
9
10
 
10
11
  .mint-experiment-selector__filter-select {
@@ -65,14 +66,6 @@ html.dark .mint-experiment-selector__filters-toggle--active {
65
66
  flex-shrink: 0;
66
67
  }
67
68
 
68
- /* Advanced filters row */
69
- .mint-experiment-selector__filters-advanced {
70
- padding: 0.625rem;
71
- border: 1px solid var(--border-light);
72
- border-radius: var(--radius-md);
73
- background-color: color-mix(in srgb, var(--bg-secondary) 72%, transparent);
74
- }
75
-
76
69
  /* Group toggle checkbox label */
77
70
  .mint-experiment-selector__group-toggle {
78
71
  display: inline-flex;
@@ -103,7 +96,8 @@ html.dark .mint-experiment-selector__filters-toggle--active {
103
96
  .mint-experiment-selector__footer {
104
97
  display: flex;
105
98
  justify-content: flex-start;
106
- padding-top: 0.25rem;
99
+ padding: 0.5rem 1.25rem 0.75rem;
100
+ border-top: 1px solid var(--border-light);
107
101
  }
108
102
 
109
103
  .mint-experiment-selector__clear-btn {
@@ -106,6 +106,7 @@
106
106
  white-space: nowrap;
107
107
  }
108
108
  .mint-picker__scope,
109
+ .mint-picker__sort,
109
110
  .mint-picker__link {
110
111
  padding: 2px 6px;
111
112
  border: 0;
@@ -116,10 +117,20 @@
116
117
  cursor: pointer;
117
118
  transition: background-color 150ms ease;
118
119
  }
119
- .mint-picker__scope {
120
+ .mint-picker__scope,
121
+ .mint-picker__sort {
120
122
  flex-shrink: 0;
121
123
  color: var(--text-secondary-strong);
122
124
  }
125
+ .mint-picker__sort {
126
+ display: inline-flex;
127
+ align-items: center;
128
+ gap: 2px;
129
+ }
130
+ .mint-picker__sort svg {
131
+ width: 12px;
132
+ height: 12px;
133
+ }
123
134
  .mint-picker__link {
124
135
  color: var(--_ink-primary);
125
136
  }
@@ -138,10 +149,13 @@
138
149
  cursor: not-allowed;
139
150
  }
140
151
  .mint-picker__scope:hover,
152
+ .mint-picker__sort:hover,
153
+ .mint-picker__sort[aria-expanded='true'],
141
154
  .mint-picker__link:hover {
142
155
  background: var(--bg-hover);
143
156
  }
144
157
  .mint-picker__scope:focus-visible,
158
+ .mint-picker__sort:focus-visible,
145
159
  .mint-picker__link:focus-visible {
146
160
  outline: none;
147
161
  box-shadow: var(--focus-ring-offset);
@@ -185,6 +199,14 @@
185
199
  .mint-picker__list-head > span:nth-child(n + 3) {
186
200
  text-align: right;
187
201
  }
202
+ .mint-picker__truncated {
203
+ margin: 0;
204
+ padding: 6px 12px;
205
+ border-bottom: 1px solid var(--border-light);
206
+ background: var(--bg-secondary);
207
+ font-size: 12px;
208
+ color: var(--text-secondary);
209
+ }
188
210
  .mint-picker__row {
189
211
  box-sizing: border-box;
190
212
  height: 34px;
@@ -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);