@morscherlab/mint-sdk 1.0.39 → 1.0.42

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 (78) hide show
  1. package/dist/{ExperimentPopover-DEzCbTqo.js → ExperimentPopover-8A4Rhffp.js} +1 -1
  2. package/dist/{ExperimentPopover-mzmSfAUp.js → ExperimentPopover-BbPkIFsI.js} +8 -2
  3. package/dist/ExperimentPopover-BbPkIFsI.js.map +1 -0
  4. package/dist/{ExperimentSelectorModal-Bn0Hmg07.js → ExperimentSelectorModal-B2qek_YG.js} +91 -46
  5. package/dist/ExperimentSelectorModal-B2qek_YG.js.map +1 -0
  6. package/dist/{ExperimentSelectorModal-BAIlIybO.js → ExperimentSelectorModal-BwPbQN1g.js} +1 -1
  7. package/dist/__tests__/components/AutoGroupModal.preview.test.d.ts +1 -0
  8. package/dist/__tests__/composables/autoGroup/classKey.test.d.ts +1 -0
  9. package/dist/__tests__/composables/autoGroup/groupTree.test.d.ts +1 -0
  10. package/dist/__tests__/composables/autoGroup/tokenLength.test.d.ts +1 -0
  11. package/dist/components/AppTopBar.navigation.d.ts +0 -1
  12. package/dist/components/index.js +3 -3
  13. package/dist/{components-Cyi0IfRl.js → components-BGVwavdd.js} +5632 -5629
  14. package/dist/components-BGVwavdd.js.map +1 -0
  15. package/dist/composables/autoGroup/classKey.d.ts +1 -0
  16. package/dist/composables/autoGroup/index.d.ts +2 -1
  17. package/dist/composables/autoGroup/replicatePreGroup.d.ts +10 -12
  18. package/dist/composables/autoGroup/tokenLength.d.ts +17 -0
  19. package/dist/composables/index.d.ts +1 -1
  20. package/dist/composables/index.js +3 -3
  21. package/dist/composables/useAutoGroup.d.ts +2 -0
  22. package/dist/composables/usePluginClient.d.ts +82 -5
  23. package/dist/{composables-CFSn4NN3.js → composables-C_hPF0Gn.js} +256 -9
  24. package/dist/{composables-CFSn4NN3.js.map → composables-C_hPF0Gn.js.map} +1 -1
  25. package/dist/index.js +6 -6
  26. package/dist/install.js +3 -3
  27. package/dist/styles.css +602 -555
  28. package/dist/types/auto-group.d.ts +19 -0
  29. package/dist/{useProtocolTemplates-CXP2ZosM.js → useProtocolTemplates-BbvlHoPD.js} +218 -90
  30. package/dist/useProtocolTemplates-BbvlHoPD.js.map +1 -0
  31. package/package.json +1 -1
  32. package/src/__tests__/components/AppTopBar.navigation.test.ts +3 -5
  33. package/src/__tests__/components/AppTopBar.test.ts +2 -5
  34. package/src/__tests__/components/AppTopBarPageSelector.test.ts +22 -0
  35. package/src/__tests__/components/AutoGroupModal.preview.test.ts +46 -0
  36. package/src/__tests__/components/PluginWorkspaceView.test.ts +18 -0
  37. package/src/__tests__/composables/autoGroup/classKey.test.ts +25 -0
  38. package/src/__tests__/composables/autoGroup/fingerprint.test.ts +72 -0
  39. package/src/__tests__/composables/autoGroup/groupTree.test.ts +99 -0
  40. package/src/__tests__/composables/autoGroup/tokenLength.test.ts +85 -0
  41. package/src/__tests__/composables/useAutoGroup.test.ts +111 -19
  42. package/src/__tests__/composables/usePluginClient.test.ts +129 -3
  43. package/src/components/AppTopBar.navigation.ts +0 -2
  44. package/src/components/AppTopBar.story.vue +5 -5
  45. package/src/components/AppTopBar.vue +0 -1
  46. package/src/components/AutoGroupModal.vue +23 -19
  47. package/src/components/BaseModal.story.vue +7 -15
  48. package/src/components/ExperimentDataViewer.vue +1 -0
  49. package/src/components/ExperimentPopover.vue +6 -4
  50. package/src/components/ExperimentSelectorModal.vue +30 -3
  51. package/src/components/IconButton.story.vue +5 -0
  52. package/src/components/PluginWorkspaceView.vue +5 -1
  53. package/src/components/SampleSelector.vue +3 -2
  54. package/src/components/SampleSelectorSampleRow.vue +4 -2
  55. package/src/components/internal/AppTopBarPageSelectorInternal.vue +0 -1
  56. package/src/composables/autoGroup/classKey.ts +5 -2
  57. package/src/composables/autoGroup/columns.ts +2 -2
  58. package/src/composables/autoGroup/compose.ts +56 -0
  59. package/src/composables/autoGroup/fingerprint.ts +15 -1
  60. package/src/composables/autoGroup/index.ts +2 -0
  61. package/src/composables/autoGroup/replicatePreGroup.ts +34 -0
  62. package/src/composables/autoGroup/template.ts +2 -2
  63. package/src/composables/autoGroup/tokenLength.ts +53 -0
  64. package/src/composables/autoGroup/vocab.json +1 -2
  65. package/src/composables/index.ts +6 -0
  66. package/src/composables/useAutoGroup.ts +34 -13
  67. package/src/composables/usePluginClient.ts +453 -8
  68. package/src/styles/components/app-page-selector.css +3 -5
  69. package/src/styles/components/auto-group-modal.css +7 -11
  70. package/src/styles/components/button.css +14 -4
  71. package/src/styles/components/modal.css +3 -0
  72. package/src/styles/components/sample-selector.css +17 -0
  73. package/src/styles/variables.css +8 -0
  74. package/src/types/auto-group.ts +19 -0
  75. package/dist/ExperimentPopover-mzmSfAUp.js.map +0 -1
  76. package/dist/ExperimentSelectorModal-Bn0Hmg07.js.map +0 -1
  77. package/dist/components-Cyi0IfRl.js.map +0 -1
  78. package/dist/useProtocolTemplates-CXP2ZosM.js.map +0 -1
package/dist/styles.css CHANGED
@@ -2855,10 +2855,11 @@
2855
2855
  }
2856
2856
  .mint-button--secondary {
2857
2857
  background-color: var(--bg-secondary);
2858
- color: var(--text-primary);
2858
+ color: var(--text-secondary-strong);
2859
2859
  border: 1px solid var(--border-color);
2860
- /* Intentionally tighter + fainter than the colored variants
2861
- secondary shouldn't "float" the way filled buttons do. */
2860
+ /* Secondary is lower-emphasis through surface, border, and shadow, but keeps
2861
+ medium label weight so it still reads as an actionable button. */
2862
+ font-weight: 500;
2862
2863
  box-shadow: 0 1px 1px rgba(15, 23, 42, 0.03);
2863
2864
  }
2864
2865
  .mint-button--secondary:hover:not(.mint-button--disabled) {
@@ -2894,7 +2895,9 @@
2894
2895
  }
2895
2896
  .mint-button--ghost {
2896
2897
  background-color: transparent;
2897
- color: var(--text-primary);
2898
+ color: var(--text-secondary-strong);
2899
+ /* Lowest-emphasis variant: regular (400) weight, below secondary. */
2900
+ font-weight: 400;
2898
2901
  }
2899
2902
  .mint-button--ghost:hover:not(.mint-button--disabled) {
2900
2903
  background-color: var(--bg-tertiary);
@@ -2904,8 +2907,14 @@
2904
2907
  .mint-button--sm {
2905
2908
  padding: 0.375rem 0.75rem;
2906
2909
  font-size: 0.875rem;
2910
+ /* Small buttons live in dense/secondary contexts — regular (400) weight
2911
+ keeps the compact label from reading too heavy. Applies to all variants. */
2912
+ font-weight: 400;
2907
2913
  min-height: var(--form-height-sm);
2908
2914
  }
2915
+ .mint-button--secondary.mint-button--sm {
2916
+ font-weight: 500;
2917
+ }
2909
2918
  .mint-button--md {
2910
2919
  padding: 0.5rem 1rem;
2911
2920
  font-size: 0.875rem;
@@ -3113,6 +3122,9 @@ to {
3113
3122
  }
3114
3123
  .mint-modal__close {
3115
3124
  flex-shrink: 0;
3125
+ /* Always pin the close affordance to the right edge of the header, even when
3126
+ there is no title/subtitle (no flex-1 header-text to push it over). */
3127
+ margin-left: auto;
3116
3128
  width: 1.75rem;
3117
3129
  height: 1.75rem;
3118
3130
  padding: 0;
@@ -7096,10 +7108,9 @@ to {
7096
7108
  }
7097
7109
  .mint-page-selector__item-label {
7098
7110
  flex: 1;
7099
- }
7100
- .mint-page-selector__item-hint {
7101
- font-size: 0.65625rem;
7102
- color: var(--text-muted);
7111
+ min-width: 0;
7112
+ overflow: hidden;
7113
+ text-overflow: ellipsis;
7103
7114
  white-space: nowrap;
7104
7115
  }
7105
7116
  /* AppTopBar pillNav — centered top-level navigation pills */
@@ -10971,143 +10982,414 @@ to {
10971
10982
  transform: rotate(360deg);
10972
10983
  }
10973
10984
  }
10974
- /* AutoGroupModal - Smart grouping wizard */
10975
- .mint-auto-group {
10976
- flex: 1;
10977
- display: flex;
10978
- flex-direction: column;
10979
- gap: 0.625rem;
10980
- min-height: 0;
10981
- min-width: 0;
10985
+ /* SampleHierarchyTree Component Styles */
10986
+ .mint-sample-tree {
10987
+ font-size: 0.875rem;
10982
10988
  }
10983
- .mint-modal__body:has(> .mint-auto-group .mint-auto-group__manual-mode) {
10984
- overflow: hidden;
10989
+ .mint-sample-tree--sm {
10990
+ font-size: 0.75rem;
10985
10991
  }
10986
- .mint-auto-group:has(.mint-auto-group__manual-mode) {
10987
- height: min(34rem, calc(100vh - 12rem));
10988
- min-height: min(26rem, calc(100vh - 12rem));
10989
- overflow: hidden;
10992
+ .mint-sample-tree--lg {
10993
+ font-size: 1rem;
10990
10994
  }
10991
10995
 
10992
- /* --- Workflow tabs --- */
10993
- .mint-auto-group__workflow-bar {
10996
+ /* Node */
10997
+ .mint-sample-tree__node {
10998
+ user-select: none;
10999
+ }
11000
+
11001
+ /* Node header (clickable row) */
11002
+ .mint-sample-tree__node-header {
10994
11003
  display: flex;
10995
- align-items: flex-end;
10996
- justify-content: space-between;
10997
- gap: 0.25rem;
10998
- min-width: 0;
10999
- padding-bottom: 0;
11000
- border-bottom: 1px solid var(--border-color);
11004
+ align-items: center;
11005
+ gap: 0.375rem;
11006
+ padding: 0.375rem 0.5rem;
11007
+ border-radius: var(--radius-sm);
11008
+ cursor: pointer;
11009
+ transition: background-color 0.15s ease;
11001
11010
  }
11002
- .mint-auto-group__workflow-bar--manual {
11003
- gap: 0.75rem;
11011
+ .mint-sample-tree__node-header:hover {
11012
+ background-color: var(--bg-hover);
11004
11013
  }
11005
- .mint-auto-group__workflow-tabs {
11006
- display: flex;
11007
- flex-shrink: 0;
11014
+ .mint-sample-tree__node--selected > .mint-sample-tree__node-header {
11015
+ background-color: rgba(59, 130, 246, 0.1);
11016
+ }
11017
+ .mint-sample-tree--sm .mint-sample-tree__node-header {
11018
+ padding: 0.25rem 0.375rem;
11008
11019
  gap: 0.25rem;
11009
11020
  }
11010
- .mint-auto-group__workflow-tab {
11011
- min-height: 1.75rem;
11012
- margin-bottom: -1px;
11013
- padding: 0.25rem 0.625rem;
11014
- border: 0;
11015
- border-bottom: 2px solid transparent;
11016
- border-radius: 0;
11021
+ .mint-sample-tree--lg .mint-sample-tree__node-header {
11022
+ padding: 0.5rem 0.625rem;
11023
+ gap: 0.5rem;
11024
+ }
11025
+
11026
+ /* Toggle button */
11027
+ .mint-sample-tree__toggle {
11028
+ display: flex;
11029
+ align-items: center;
11030
+ justify-content: center;
11031
+ width: 1.25rem;
11032
+ height: 1.25rem;
11033
+ padding: 0;
11017
11034
  background: transparent;
11035
+ border: none;
11036
+ border-radius: var(--radius-sm);
11018
11037
  color: var(--text-muted);
11019
- font-size: 0.75rem;
11020
- font-weight: 600;
11021
11038
  cursor: pointer;
11022
- line-height: 1.25;
11023
- transition: border-color 0.15s ease, color 0.15s ease;
11039
+ transition: color 0.15s ease, transform 0.15s ease;
11040
+ flex-shrink: 0;
11024
11041
  }
11025
- .mint-auto-group__workflow-tab:hover {
11042
+ .mint-sample-tree__toggle:hover {
11026
11043
  color: var(--text-primary);
11044
+ background-color: var(--bg-tertiary);
11027
11045
  }
11028
- .mint-auto-group__workflow-tab:focus-visible {
11029
- outline: none;
11030
- box-shadow: 0 0 0 2px var(--color-primary-soft);
11046
+ .mint-sample-tree__toggle svg {
11047
+ width: 0.875rem;
11048
+ height: 0.875rem;
11049
+ transition: transform 0.15s ease;
11031
11050
  }
11032
- .mint-auto-group__workflow-tab--active {
11033
- border-bottom-color: var(--color-primary);
11034
- color: var(--color-primary);
11051
+ .mint-sample-tree__node--expanded > .mint-sample-tree__node-header .mint-sample-tree__toggle svg {
11052
+ transform: rotate(90deg);
11035
11053
  }
11036
- .mint-auto-group__manual-mode {
11037
- flex: 1;
11038
- display: flex;
11039
- flex-direction: column;
11040
- gap: 0.625rem;
11041
- min-height: 0;
11042
- min-width: 0;
11043
- overflow: hidden;
11054
+ .mint-sample-tree--sm .mint-sample-tree__toggle {
11055
+ width: 1rem;
11056
+ height: 1rem;
11044
11057
  }
11045
- .mint-auto-group__manual-summary {
11058
+ .mint-sample-tree--sm .mint-sample-tree__toggle svg {
11059
+ width: 0.75rem;
11060
+ height: 0.75rem;
11061
+ }
11062
+ .mint-sample-tree--lg .mint-sample-tree__toggle {
11063
+ width: 1.5rem;
11064
+ height: 1.5rem;
11065
+ }
11066
+ .mint-sample-tree--lg .mint-sample-tree__toggle svg {
11067
+ width: 1rem;
11068
+ height: 1rem;
11069
+ }
11070
+
11071
+ /* Placeholder for leaf nodes (no toggle) */
11072
+ .mint-sample-tree__toggle-placeholder {
11073
+ width: 1.25rem;
11074
+ flex-shrink: 0;
11075
+ }
11076
+ .mint-sample-tree--sm .mint-sample-tree__toggle-placeholder {
11077
+ width: 1rem;
11078
+ }
11079
+ .mint-sample-tree--lg .mint-sample-tree__toggle-placeholder {
11080
+ width: 1.5rem;
11081
+ }
11082
+
11083
+ /* Icon */
11084
+ .mint-sample-tree__icon {
11046
11085
  display: flex;
11047
11086
  align-items: center;
11048
- justify-content: space-between;
11049
- flex: 1;
11050
- gap: 0.75rem;
11051
- min-width: 0;
11052
- padding-bottom: 0.25rem;
11087
+ justify-content: center;
11088
+ width: 1.25rem;
11089
+ height: 1.25rem;
11090
+ flex-shrink: 0;
11053
11091
  }
11054
- .mint-auto-group__manual-summary-text {
11055
- display: flex;
11056
- flex-direction: column;
11057
- gap: 0.125rem;
11058
- min-width: 0;
11092
+ .mint-sample-tree__icon svg {
11093
+ width: 1rem;
11094
+ height: 1rem;
11059
11095
  }
11060
- .mint-auto-group__manual-summary-text strong {
11061
- color: var(--text-primary);
11062
- font-size: 0.8125rem;
11063
- font-weight: 600;
11064
- line-height: 1.25;
11096
+ .mint-sample-tree--sm .mint-sample-tree__icon {
11097
+ width: 1rem;
11098
+ height: 1rem;
11065
11099
  }
11066
- .mint-auto-group__manual-eyebrow {
11100
+ .mint-sample-tree--sm .mint-sample-tree__icon svg {
11101
+ width: 0.75rem;
11102
+ height: 0.75rem;
11103
+ }
11104
+ .mint-sample-tree--lg .mint-sample-tree__icon {
11105
+ width: 1.5rem;
11106
+ height: 1.5rem;
11107
+ }
11108
+ .mint-sample-tree--lg .mint-sample-tree__icon svg {
11109
+ width: 1.25rem;
11110
+ height: 1.25rem;
11111
+ }
11112
+
11113
+ /* Icon colors by type */
11114
+ .mint-sample-tree__icon--study {
11067
11115
  color: var(--text-muted);
11068
- font-size: 0.625rem;
11069
- font-weight: 700;
11070
- letter-spacing: 0.05em;
11071
- line-height: 1.2;
11072
- text-transform: uppercase;
11073
11116
  }
11074
- .mint-auto-group__manual-stats {
11075
- display: flex;
11076
- align-items: center;
11077
- gap: 0.375rem;
11078
- flex-wrap: wrap;
11079
- justify-content: flex-end;
11117
+ .mint-sample-tree__icon--experiment {
11118
+ color: var(--color-primary);
11119
+ }
11120
+ .mint-sample-tree__icon--plate {
11121
+ color: var(--mint-info);
11122
+ }
11123
+ .mint-sample-tree__icon--sample {
11124
+ color: var(--mint-success);
11125
+ }
11126
+ .mint-sample-tree__icon--cell_line {
11127
+ color: var(--color-purple);
11128
+ }
11129
+ .mint-sample-tree__icon--passage {
11080
11130
  color: var(--text-secondary);
11081
- font-size: 0.6875rem;
11082
11131
  }
11083
- .mint-auto-group__manual-stats span {
11084
- display: inline-flex;
11085
- align-items: center;
11086
- gap: 0.25rem;
11087
- min-height: 1.375rem;
11088
- padding: 0.0625rem 0.4375rem;
11089
- border: 1px solid var(--border-light);
11090
- border-radius: 9999px;
11091
- background: var(--bg-secondary);
11092
- font-variant-numeric: tabular-nums;
11093
- white-space: nowrap;
11132
+ .mint-sample-tree__icon--clone {
11133
+ color: var(--mint-warning);
11094
11134
  }
11095
- .mint-auto-group__manual-stats strong {
11096
- color: var(--text-primary);
11097
- font-family: 'Fira Code', monospace;
11098
- font-size: 0.6875rem;
11135
+ .mint-sample-tree__icon--treatment {
11136
+ color: var(--color-cta);
11099
11137
  }
11100
- .mint-auto-group__manual-grid {
11101
- display: grid;
11102
- grid-template-columns: minmax(0, 1.15fr) minmax(20rem, 0.85fr);
11103
- gap: 0.625rem;
11138
+ .mint-sample-tree__icon--folder {
11139
+ color: var(--text-muted);
11140
+ }
11141
+ .mint-sample-tree__icon--custom {
11142
+ color: var(--text-secondary);
11143
+ }
11144
+
11145
+ /* Label */
11146
+ .mint-sample-tree__label {
11104
11147
  flex: 1;
11105
- min-height: 0;
11106
11148
  min-width: 0;
11149
+ color: var(--text-primary);
11107
11150
  overflow: hidden;
11151
+ text-overflow: ellipsis;
11152
+ white-space: nowrap;
11108
11153
  }
11109
- .mint-auto-group__manual-panel {
11110
- min-width: 0;
11154
+
11155
+ /* Badge */
11156
+ .mint-sample-tree__badge {
11157
+ display: inline-flex;
11158
+ align-items: center;
11159
+ justify-content: center;
11160
+ min-width: 1.25rem;
11161
+ padding: 0.125rem 0.375rem;
11162
+ font-size: 0.625rem;
11163
+ font-weight: 600;
11164
+ border-radius: 9999px;
11165
+ flex-shrink: 0;
11166
+ }
11167
+ .mint-sample-tree--sm .mint-sample-tree__badge {
11168
+ min-width: 1rem;
11169
+ padding: 0.0625rem 0.25rem;
11170
+ font-size: 0.5rem;
11171
+ }
11172
+ .mint-sample-tree--lg .mint-sample-tree__badge {
11173
+ min-width: 1.5rem;
11174
+ padding: 0.125rem 0.5rem;
11175
+ font-size: 0.75rem;
11176
+ }
11177
+ .mint-sample-tree__badge--default {
11178
+ background-color: var(--bg-tertiary);
11179
+ color: var(--text-secondary);
11180
+ }
11181
+ .mint-sample-tree__badge--success {
11182
+ background-color: var(--mint-success-bg);
11183
+ color: var(--mint-success);
11184
+ }
11185
+ .mint-sample-tree__badge--warning {
11186
+ background-color: var(--mint-warning-bg);
11187
+ color: var(--mint-warning);
11188
+ }
11189
+ .mint-sample-tree__badge--error {
11190
+ background-color: var(--mint-error-bg);
11191
+ color: var(--mint-error);
11192
+ }
11193
+
11194
+ /* Children container */
11195
+ .mint-sample-tree__children {
11196
+ margin-left: 1.25rem;
11197
+ padding-left: 0.75rem;
11198
+ border-left: 1px solid var(--border-color);
11199
+ overflow: hidden;
11200
+ }
11201
+ .mint-sample-tree--sm .mint-sample-tree__children {
11202
+ margin-left: 1rem;
11203
+ padding-left: 0.5rem;
11204
+ }
11205
+ .mint-sample-tree--lg .mint-sample-tree__children {
11206
+ margin-left: 1.5rem;
11207
+ padding-left: 1rem;
11208
+ }
11209
+
11210
+ /* Animation */
11211
+ .mint-sample-tree__children--entering {
11212
+ animation: mint-tree-expand 0.15s ease-out;
11213
+ }
11214
+ .mint-sample-tree__children--leaving {
11215
+ animation: mint-tree-collapse 0.15s ease-out forwards;
11216
+ }
11217
+ @keyframes mint-tree-expand {
11218
+ from {
11219
+ opacity: 0;
11220
+ max-height: 0;
11221
+ }
11222
+ to {
11223
+ opacity: 1;
11224
+ max-height: 1000px;
11225
+ }
11226
+ }
11227
+ @keyframes mint-tree-collapse {
11228
+ from {
11229
+ opacity: 1;
11230
+ max-height: 1000px;
11231
+ }
11232
+ to {
11233
+ opacity: 0;
11234
+ max-height: 0;
11235
+ }
11236
+ }
11237
+
11238
+ /* Empty state */
11239
+ .mint-sample-tree__empty {
11240
+ padding: 1rem;
11241
+ text-align: center;
11242
+ color: var(--text-muted);
11243
+ }
11244
+ .mint-sample-tree__empty-icon {
11245
+ width: 2rem;
11246
+ height: 2rem;
11247
+ margin: 0 auto 0.5rem;
11248
+ opacity: 0.5;
11249
+ }
11250
+ .mint-sample-tree__empty-text {
11251
+ font-size: 0.875rem;
11252
+ margin-top: 0 !important;
11253
+ margin-bottom: 0 !important;
11254
+ padding: 0 !important;
11255
+ }
11256
+ /* AutoGroupModal - Smart grouping wizard */
11257
+ .mint-auto-group {
11258
+ flex: 1;
11259
+ display: flex;
11260
+ flex-direction: column;
11261
+ gap: 0.625rem;
11262
+ min-height: 0;
11263
+ min-width: 0;
11264
+ }
11265
+ .mint-modal__body:has(> .mint-auto-group .mint-auto-group__manual-mode) {
11266
+ overflow: hidden;
11267
+ }
11268
+ .mint-auto-group:has(.mint-auto-group__manual-mode) {
11269
+ height: min(34rem, calc(100vh - 12rem));
11270
+ min-height: min(26rem, calc(100vh - 12rem));
11271
+ overflow: hidden;
11272
+ }
11273
+
11274
+ /* --- Workflow tabs --- */
11275
+ .mint-auto-group__workflow-bar {
11276
+ display: flex;
11277
+ align-items: flex-end;
11278
+ justify-content: space-between;
11279
+ gap: 0.25rem;
11280
+ min-width: 0;
11281
+ padding-bottom: 0;
11282
+ border-bottom: 1px solid var(--border-color);
11283
+ }
11284
+ .mint-auto-group__workflow-bar--manual {
11285
+ gap: 0.75rem;
11286
+ }
11287
+ .mint-auto-group__workflow-tabs {
11288
+ display: flex;
11289
+ flex-shrink: 0;
11290
+ gap: 0.25rem;
11291
+ }
11292
+ .mint-auto-group__workflow-tab {
11293
+ min-height: 1.75rem;
11294
+ margin-bottom: -1px;
11295
+ padding: 0.25rem 0.625rem;
11296
+ border: 0;
11297
+ border-bottom: 2px solid transparent;
11298
+ border-radius: 0;
11299
+ background: transparent;
11300
+ color: var(--text-muted);
11301
+ font-size: 0.75rem;
11302
+ font-weight: 600;
11303
+ cursor: pointer;
11304
+ line-height: 1.25;
11305
+ transition: border-color 0.15s ease, color 0.15s ease;
11306
+ }
11307
+ .mint-auto-group__workflow-tab:hover {
11308
+ color: var(--text-primary);
11309
+ }
11310
+ .mint-auto-group__workflow-tab:focus-visible {
11311
+ outline: none;
11312
+ box-shadow: 0 0 0 2px var(--color-primary-soft);
11313
+ }
11314
+ .mint-auto-group__workflow-tab--active {
11315
+ border-bottom-color: var(--color-primary);
11316
+ color: var(--color-primary);
11317
+ }
11318
+ .mint-auto-group__manual-mode {
11319
+ flex: 1;
11320
+ display: flex;
11321
+ flex-direction: column;
11322
+ gap: 0.625rem;
11323
+ min-height: 0;
11324
+ min-width: 0;
11325
+ overflow: hidden;
11326
+ }
11327
+ .mint-auto-group__manual-summary {
11328
+ display: flex;
11329
+ align-items: center;
11330
+ justify-content: space-between;
11331
+ flex: 1;
11332
+ gap: 0.75rem;
11333
+ min-width: 0;
11334
+ padding-bottom: 0.25rem;
11335
+ }
11336
+ .mint-auto-group__manual-summary-text {
11337
+ display: flex;
11338
+ flex-direction: column;
11339
+ gap: 0.125rem;
11340
+ min-width: 0;
11341
+ }
11342
+ .mint-auto-group__manual-summary-text strong {
11343
+ color: var(--text-primary);
11344
+ font-size: 0.8125rem;
11345
+ font-weight: 600;
11346
+ line-height: 1.25;
11347
+ }
11348
+ .mint-auto-group__manual-eyebrow {
11349
+ color: var(--text-muted);
11350
+ font-size: 0.625rem;
11351
+ font-weight: 700;
11352
+ letter-spacing: 0.05em;
11353
+ line-height: 1.2;
11354
+ text-transform: uppercase;
11355
+ }
11356
+ .mint-auto-group__manual-stats {
11357
+ display: flex;
11358
+ align-items: center;
11359
+ gap: 0.375rem;
11360
+ flex-wrap: wrap;
11361
+ justify-content: flex-end;
11362
+ color: var(--text-secondary);
11363
+ font-size: 0.6875rem;
11364
+ }
11365
+ .mint-auto-group__manual-stats span {
11366
+ display: inline-flex;
11367
+ align-items: center;
11368
+ gap: 0.25rem;
11369
+ min-height: 1.375rem;
11370
+ padding: 0.0625rem 0.4375rem;
11371
+ border: 1px solid var(--border-light);
11372
+ border-radius: 9999px;
11373
+ background: var(--bg-secondary);
11374
+ font-variant-numeric: tabular-nums;
11375
+ white-space: nowrap;
11376
+ }
11377
+ .mint-auto-group__manual-stats strong {
11378
+ color: var(--text-primary);
11379
+ font-family: 'Fira Code', monospace;
11380
+ font-size: 0.6875rem;
11381
+ }
11382
+ .mint-auto-group__manual-grid {
11383
+ display: grid;
11384
+ grid-template-columns: minmax(0, 1.15fr) minmax(20rem, 0.85fr);
11385
+ gap: 0.625rem;
11386
+ flex: 1;
11387
+ min-height: 0;
11388
+ min-width: 0;
11389
+ overflow: hidden;
11390
+ }
11391
+ .mint-auto-group__manual-panel {
11392
+ min-width: 0;
11111
11393
  min-height: 0;
11112
11394
  overflow: hidden;
11113
11395
  display: flex;
@@ -11738,7 +12020,7 @@ to {
11738
12020
  font-size: 0.8125rem;
11739
12021
  color: var(--mint-error);
11740
12022
  background: var(--mint-error-bg);
11741
- border: 1px solid rgba(239, 68, 68, 0.3);
12023
+ border: 1px solid var(--mint-error-border);
11742
12024
  border-radius: var(--radius);
11743
12025
  }
11744
12026
 
@@ -11759,7 +12041,7 @@ to {
11759
12041
  }
11760
12042
  .mint-auto-group__experiment-error {
11761
12043
  padding: 1.5rem;
11762
- border: 1px solid rgba(239, 68, 68, 0.3);
12044
+ border: 1px solid var(--mint-error-border);
11763
12045
  border-radius: var(--radius-md);
11764
12046
  background: var(--mint-error-bg);
11765
12047
  font-size: 0.8125rem;
@@ -11790,7 +12072,7 @@ to {
11790
12072
  .mint-auto-group__link-btn:focus-visible {
11791
12073
  outline: 2px solid var(--color-primary);
11792
12074
  outline-offset: 1px;
11793
- border-radius: 2px;
12075
+ border-radius: var(--radius-sm);
11794
12076
  }
11795
12077
  .mint-auto-group__experiment-loaded {
11796
12078
  padding: 1.5rem;
@@ -12167,21 +12449,12 @@ to {
12167
12449
  }
12168
12450
  .mint-auto-group__preview-panel h4 { margin: 0 0 10px; font-size: 12px; color: var(--text-muted); text-transform: uppercase; letter-spacing: .06em;
12169
12451
  }
12170
- .mint-auto-group__preview-group { border: 1px solid var(--border-color); border-radius: var(--radius); overflow: hidden;
12171
- }
12172
- .mint-auto-group__preview-group[open] { background: var(--bg-secondary);
12173
- }
12174
- .mint-auto-group__preview-group summary { display: flex; align-items: center; gap: 10px; cursor: pointer; font-size: 13px; padding: 0.5rem 0.875rem;
12175
- }
12176
- .mint-auto-group__preview-group[open] summary { border-bottom: 1px solid var(--border);
12177
- }
12178
- .mint-auto-group__preview-dot { width: 10px; height: 10px; border-radius: 9999px; flex-shrink: 0;
12179
- }
12180
- .mint-auto-group__preview-count { margin-left: auto; font-family: 'Fira Code', monospace; font-size: 12px; color: var(--text-secondary); background: var(--bg-primary); border: 1px solid var(--border); padding: 2px 8px; border-radius: 9999px;
12181
- }
12182
- .mint-auto-group__preview-samples { display: flex; flex-wrap: wrap; gap: 6px; padding: 0.5rem 0.875rem 0.625rem;
12452
+
12453
+ /* Nested experimental groups render as a collapsible SampleHierarchyTree; cap
12454
+ its height so a large batch scrolls inside the panel instead of the modal. */
12455
+ .mint-auto-group__preview-tree { max-height: 320px; overflow-y: auto;
12183
12456
  }
12184
- .mint-auto-group__preview-sample { font-family: 'Fira Code', monospace; font-size: 11.5px; color: var(--text-primary); background: var(--bg-primary); border: 1px solid var(--border); padding: 3px 8px; border-radius: 9999px;
12457
+ .mint-auto-group__preview-empty { margin: 0; font-size: 13px; color: var(--text-muted);
12185
12458
  }
12186
12459
  .mint-auto-group__qc-chips { display: flex; flex-wrap: wrap; gap: 6px;
12187
12460
  }
@@ -12462,6 +12735,10 @@ to {
12462
12735
  .mint-sample-selector__expand-btn:hover {
12463
12736
  background-color: var(--bg-hover);
12464
12737
  }
12738
+ .mint-sample-selector__expand-btn:focus-visible {
12739
+ outline: none;
12740
+ box-shadow: var(--focus-ring);
12741
+ }
12465
12742
  .mint-sample-selector__expand-icon {
12466
12743
  width: 0.875rem;
12467
12744
  height: 0.875rem;
@@ -12571,6 +12848,10 @@ to {
12571
12848
  transform: scale(1.25);
12572
12849
  box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08), 0 0 0 3px rgba(0, 0, 0, 0.06);
12573
12850
  }
12851
+ .mint-sample-selector__color-dot--clickable:focus-visible {
12852
+ outline: none;
12853
+ box-shadow: var(--focus-ring);
12854
+ }
12574
12855
 
12575
12856
  /* Count Badge */
12576
12857
  .mint-sample-selector__count-badge {
@@ -12602,8 +12883,15 @@ to {
12602
12883
  background-color: var(--mint-error-bg);
12603
12884
  color: var(--mint-error);
12604
12885
  }
12605
- .mint-sample-selector__delete-btn--hidden {
12606
- opacity: 0;
12886
+
12887
+ /* Reveal the hover-hidden delete button when reached by keyboard, and ring it. */
12888
+ .mint-sample-selector__delete-btn:focus-visible {
12889
+ outline: none;
12890
+ opacity: 1;
12891
+ box-shadow: var(--focus-ring);
12892
+ }
12893
+ .mint-sample-selector__delete-btn--hidden {
12894
+ opacity: 0;
12607
12895
  }
12608
12896
  .mint-sample-selector__delete-btn svg {
12609
12897
  width: 0.875rem;
@@ -14730,448 +15018,177 @@ to {
14730
15018
  .mint-reagent-editor__add-btn:hover:not(:disabled) {
14731
15019
  filter: brightness(0.88);
14732
15020
  }
14733
- .mint-reagent-editor__add-btn:active:not(:disabled) {
14734
- transform: scale(0.92);
14735
- }
14736
- .mint-reagent-editor__add-btn:disabled {
14737
- opacity: var(--mint-disabled-opacity);
14738
- cursor: not-allowed;
14739
- }
14740
-
14741
- /* Level table */
14742
- .mint-reagent-editor__table {
14743
- border: 1px solid var(--border-color);
14744
- border-radius: var(--radius);
14745
- overflow: hidden;
14746
- max-height: 14rem;
14747
- display: flex;
14748
- flex-direction: column;
14749
- }
14750
- .mint-reagent-editor__table-body {
14751
- flex: 1;
14752
- overflow-y: auto;
14753
- scrollbar-width: thin;
14754
- scrollbar-color: var(--scrollbar-thumb) transparent;
14755
- }
14756
- .mint-reagent-editor__table-header {
14757
- display: flex;
14758
- align-items: center;
14759
- padding: 0.375rem 0.5rem;
14760
- background-color: var(--bg-tertiary);
14761
- border-bottom: 1px solid var(--border-color);
14762
- }
14763
- .mint-reagent-editor__table-header .mint-reagent-editor__table-col {
14764
- font-size: 0.6875rem;
14765
- font-weight: 600;
14766
- text-transform: uppercase;
14767
- letter-spacing: 0.03em;
14768
- color: var(--text-muted);
14769
- }
14770
- .mint-reagent-editor__table-row {
14771
- display: flex;
14772
- align-items: center;
14773
- padding: 0.25rem 0.5rem;
14774
- border-bottom: 1px solid var(--border-color);
14775
- border-left: 2px solid transparent;
14776
- transition: background-color 0.1s ease, border-left-color 0.1s ease;
14777
- }
14778
- .mint-reagent-editor__table-row:last-child {
14779
- border-bottom: none;
14780
- }
14781
- .mint-reagent-editor__table-row:hover {
14782
- background-color: color-mix(in srgb, var(--reagent-color, var(--color-primary)) 5%, var(--bg-secondary));
14783
- border-left-color: var(--reagent-color, var(--color-primary));
14784
- }
14785
- .mint-reagent-editor__table-col--level {
14786
- flex: 1;
14787
- min-width: 0;
14788
- display: flex;
14789
- align-items: baseline;
14790
- gap: 0.25rem;
14791
- }
14792
- .mint-reagent-editor__table-col--reps {
14793
- width: 5.5rem;
14794
- flex-shrink: 0;
14795
- }
14796
- .mint-reagent-editor__table-col--action {
14797
- width: 1.75rem;
14798
- flex-shrink: 0;
14799
- display: flex;
14800
- justify-content: center;
14801
- }
14802
- .mint-reagent-editor__level-value {
14803
- font-family: 'Fira Code', monospace;
14804
- font-size: 0.8125rem;
14805
- font-weight: 500;
14806
- color: var(--text-primary);
14807
- overflow: hidden;
14808
- text-overflow: ellipsis;
14809
- white-space: nowrap;
14810
- }
14811
- .mint-reagent-editor__level-unit {
14812
- font-family: 'Fira Code', monospace;
14813
- font-size: 0.6875rem;
14814
- color: var(--text-muted);
14815
- }
14816
- .mint-reagent-editor__remove-level-btn {
14817
- display: flex;
14818
- align-items: center;
14819
- justify-content: center;
14820
- width: 1.375rem;
14821
- height: 1.375rem;
14822
- border-radius: var(--radius-sm);
14823
- background: transparent;
14824
- color: var(--text-muted);
14825
- border: none;
14826
- cursor: pointer;
14827
- opacity: 0;
14828
- transition: opacity 0.1s ease, color 0.1s ease, background-color 0.1s ease;
14829
- }
14830
- .mint-reagent-editor__table-row:hover .mint-reagent-editor__remove-level-btn {
14831
- opacity: 1;
14832
- }
14833
- .mint-reagent-editor__remove-level-btn:hover {
14834
- color: var(--mint-error);
14835
- background-color: var(--mint-error-bg);
14836
- }
14837
-
14838
- /* Empty state */
14839
- .mint-reagent-editor__empty {
14840
- text-align: center;
14841
- padding: 1.25rem 0.75rem;
14842
- font-size: 0.8125rem;
14843
- color: var(--text-muted);
14844
- font-style: italic;
14845
- }
14846
-
14847
- /* Position summary — reagent-tinted background */
14848
- .mint-reagent-editor__summary {
14849
- display: flex;
14850
- align-items: center;
14851
- justify-content: center;
14852
- gap: 0.625rem;
14853
- padding: 0.625rem 1rem;
14854
- background-color: color-mix(in srgb, var(--reagent-color, var(--color-primary)) 6%, var(--bg-tertiary));
14855
- border-bottom: 1px solid var(--border-color);
14856
- }
14857
- .mint-reagent-editor__summary-item {
14858
- display: flex;
14859
- align-items: baseline;
14860
- gap: 0.25rem;
14861
- }
14862
- .mint-reagent-editor__summary-value {
14863
- font-family: 'Fira Code', monospace;
14864
- font-size: 0.8125rem;
14865
- font-weight: 600;
14866
- color: var(--reagent-color, var(--text-primary));
14867
- }
14868
- .mint-reagent-editor__summary-label {
14869
- font-size: 0.6875rem;
14870
- color: var(--text-muted);
14871
- }
14872
- .mint-reagent-editor__summary-dot {
14873
- width: 3px;
14874
- height: 3px;
14875
- border-radius: 50%;
14876
- background-color: var(--reagent-color, var(--text-muted));
14877
- opacity: 0.5;
14878
- flex-shrink: 0;
14879
- }
14880
-
14881
- /* Overflow warning */
14882
- .mint-reagent-editor__summary--overflow {
14883
- background-color: var(--mint-warning-bg);
14884
- }
14885
- .mint-reagent-editor__summary--overflow .mint-reagent-editor__summary-value {
14886
- color: var(--mint-warning-hover);
14887
- }
14888
- .mint-reagent-editor__summary--overflow .mint-reagent-editor__summary-dot {
14889
- background-color: var(--mint-warning);
14890
- }
14891
- .mint-reagent-editor__summary-warning {
14892
- font-size: 0.6875rem;
14893
- font-weight: 600;
14894
- color: var(--mint-warning-hover);
14895
- margin-left: 0.25rem;
14896
- }
14897
-
14898
- /* Footer */
14899
- .mint-reagent-editor__footer {
14900
- padding: 0.75rem 1rem;
14901
- }
14902
- .mint-reagent-editor__footer .mint-button {
14903
- width: 100%;
14904
- }
14905
- /* SampleHierarchyTree Component Styles */
14906
- .mint-sample-tree {
14907
- font-size: 0.875rem;
14908
- }
14909
- .mint-sample-tree--sm {
14910
- font-size: 0.75rem;
14911
- }
14912
- .mint-sample-tree--lg {
14913
- font-size: 1rem;
14914
- }
14915
-
14916
- /* Node */
14917
- .mint-sample-tree__node {
14918
- user-select: none;
14919
- }
14920
-
14921
- /* Node header (clickable row) */
14922
- .mint-sample-tree__node-header {
14923
- display: flex;
14924
- align-items: center;
14925
- gap: 0.375rem;
14926
- padding: 0.375rem 0.5rem;
14927
- border-radius: var(--radius-sm);
14928
- cursor: pointer;
14929
- transition: background-color 0.15s ease;
14930
- }
14931
- .mint-sample-tree__node-header:hover {
14932
- background-color: var(--bg-hover);
14933
- }
14934
- .mint-sample-tree__node--selected > .mint-sample-tree__node-header {
14935
- background-color: rgba(59, 130, 246, 0.1);
14936
- }
14937
- .mint-sample-tree--sm .mint-sample-tree__node-header {
14938
- padding: 0.25rem 0.375rem;
14939
- gap: 0.25rem;
14940
- }
14941
- .mint-sample-tree--lg .mint-sample-tree__node-header {
14942
- padding: 0.5rem 0.625rem;
14943
- gap: 0.5rem;
14944
- }
14945
-
14946
- /* Toggle button */
14947
- .mint-sample-tree__toggle {
14948
- display: flex;
14949
- align-items: center;
14950
- justify-content: center;
14951
- width: 1.25rem;
14952
- height: 1.25rem;
14953
- padding: 0;
14954
- background: transparent;
14955
- border: none;
14956
- border-radius: var(--radius-sm);
14957
- color: var(--text-muted);
14958
- cursor: pointer;
14959
- transition: color 0.15s ease, transform 0.15s ease;
14960
- flex-shrink: 0;
14961
- }
14962
- .mint-sample-tree__toggle:hover {
14963
- color: var(--text-primary);
14964
- background-color: var(--bg-tertiary);
14965
- }
14966
- .mint-sample-tree__toggle svg {
14967
- width: 0.875rem;
14968
- height: 0.875rem;
14969
- transition: transform 0.15s ease;
14970
- }
14971
- .mint-sample-tree__node--expanded > .mint-sample-tree__node-header .mint-sample-tree__toggle svg {
14972
- transform: rotate(90deg);
14973
- }
14974
- .mint-sample-tree--sm .mint-sample-tree__toggle {
14975
- width: 1rem;
14976
- height: 1rem;
14977
- }
14978
- .mint-sample-tree--sm .mint-sample-tree__toggle svg {
14979
- width: 0.75rem;
14980
- height: 0.75rem;
14981
- }
14982
- .mint-sample-tree--lg .mint-sample-tree__toggle {
14983
- width: 1.5rem;
14984
- height: 1.5rem;
14985
- }
14986
- .mint-sample-tree--lg .mint-sample-tree__toggle svg {
14987
- width: 1rem;
14988
- height: 1rem;
14989
- }
14990
-
14991
- /* Placeholder for leaf nodes (no toggle) */
14992
- .mint-sample-tree__toggle-placeholder {
14993
- width: 1.25rem;
14994
- flex-shrink: 0;
14995
- }
14996
- .mint-sample-tree--sm .mint-sample-tree__toggle-placeholder {
14997
- width: 1rem;
14998
- }
14999
- .mint-sample-tree--lg .mint-sample-tree__toggle-placeholder {
15000
- width: 1.5rem;
15001
- }
15002
-
15003
- /* Icon */
15004
- .mint-sample-tree__icon {
15005
- display: flex;
15006
- align-items: center;
15007
- justify-content: center;
15008
- width: 1.25rem;
15009
- height: 1.25rem;
15010
- flex-shrink: 0;
15011
- }
15012
- .mint-sample-tree__icon svg {
15013
- width: 1rem;
15014
- height: 1rem;
15015
- }
15016
- .mint-sample-tree--sm .mint-sample-tree__icon {
15017
- width: 1rem;
15018
- height: 1rem;
15019
- }
15020
- .mint-sample-tree--sm .mint-sample-tree__icon svg {
15021
- width: 0.75rem;
15022
- height: 0.75rem;
15023
- }
15024
- .mint-sample-tree--lg .mint-sample-tree__icon {
15025
- width: 1.5rem;
15026
- height: 1.5rem;
15027
- }
15028
- .mint-sample-tree--lg .mint-sample-tree__icon svg {
15029
- width: 1.25rem;
15030
- height: 1.25rem;
15031
- }
15032
-
15033
- /* Icon colors by type */
15034
- .mint-sample-tree__icon--study {
15035
- color: var(--text-muted);
15036
- }
15037
- .mint-sample-tree__icon--experiment {
15038
- color: var(--color-primary);
15039
- }
15040
- .mint-sample-tree__icon--plate {
15041
- color: var(--mint-info);
15042
- }
15043
- .mint-sample-tree__icon--sample {
15044
- color: var(--mint-success);
15045
- }
15046
- .mint-sample-tree__icon--cell_line {
15047
- color: var(--color-purple);
15021
+ .mint-reagent-editor__add-btn:active:not(:disabled) {
15022
+ transform: scale(0.92);
15048
15023
  }
15049
- .mint-sample-tree__icon--passage {
15050
- color: var(--text-secondary);
15024
+ .mint-reagent-editor__add-btn:disabled {
15025
+ opacity: var(--mint-disabled-opacity);
15026
+ cursor: not-allowed;
15051
15027
  }
15052
- .mint-sample-tree__icon--clone {
15053
- color: var(--mint-warning);
15028
+
15029
+ /* Level table */
15030
+ .mint-reagent-editor__table {
15031
+ border: 1px solid var(--border-color);
15032
+ border-radius: var(--radius);
15033
+ overflow: hidden;
15034
+ max-height: 14rem;
15035
+ display: flex;
15036
+ flex-direction: column;
15054
15037
  }
15055
- .mint-sample-tree__icon--treatment {
15056
- color: var(--color-cta);
15038
+ .mint-reagent-editor__table-body {
15039
+ flex: 1;
15040
+ overflow-y: auto;
15041
+ scrollbar-width: thin;
15042
+ scrollbar-color: var(--scrollbar-thumb) transparent;
15057
15043
  }
15058
- .mint-sample-tree__icon--folder {
15044
+ .mint-reagent-editor__table-header {
15045
+ display: flex;
15046
+ align-items: center;
15047
+ padding: 0.375rem 0.5rem;
15048
+ background-color: var(--bg-tertiary);
15049
+ border-bottom: 1px solid var(--border-color);
15050
+ }
15051
+ .mint-reagent-editor__table-header .mint-reagent-editor__table-col {
15052
+ font-size: 0.6875rem;
15053
+ font-weight: 600;
15054
+ text-transform: uppercase;
15055
+ letter-spacing: 0.03em;
15059
15056
  color: var(--text-muted);
15060
15057
  }
15061
- .mint-sample-tree__icon--custom {
15062
- color: var(--text-secondary);
15058
+ .mint-reagent-editor__table-row {
15059
+ display: flex;
15060
+ align-items: center;
15061
+ padding: 0.25rem 0.5rem;
15062
+ border-bottom: 1px solid var(--border-color);
15063
+ border-left: 2px solid transparent;
15064
+ transition: background-color 0.1s ease, border-left-color 0.1s ease;
15063
15065
  }
15064
-
15065
- /* Label */
15066
- .mint-sample-tree__label {
15066
+ .mint-reagent-editor__table-row:last-child {
15067
+ border-bottom: none;
15068
+ }
15069
+ .mint-reagent-editor__table-row:hover {
15070
+ background-color: color-mix(in srgb, var(--reagent-color, var(--color-primary)) 5%, var(--bg-secondary));
15071
+ border-left-color: var(--reagent-color, var(--color-primary));
15072
+ }
15073
+ .mint-reagent-editor__table-col--level {
15067
15074
  flex: 1;
15068
15075
  min-width: 0;
15076
+ display: flex;
15077
+ align-items: baseline;
15078
+ gap: 0.25rem;
15079
+ }
15080
+ .mint-reagent-editor__table-col--reps {
15081
+ width: 5.5rem;
15082
+ flex-shrink: 0;
15083
+ }
15084
+ .mint-reagent-editor__table-col--action {
15085
+ width: 1.75rem;
15086
+ flex-shrink: 0;
15087
+ display: flex;
15088
+ justify-content: center;
15089
+ }
15090
+ .mint-reagent-editor__level-value {
15091
+ font-family: 'Fira Code', monospace;
15092
+ font-size: 0.8125rem;
15093
+ font-weight: 500;
15069
15094
  color: var(--text-primary);
15070
15095
  overflow: hidden;
15071
15096
  text-overflow: ellipsis;
15072
15097
  white-space: nowrap;
15073
15098
  }
15074
-
15075
- /* Badge */
15076
- .mint-sample-tree__badge {
15077
- display: inline-flex;
15099
+ .mint-reagent-editor__level-unit {
15100
+ font-family: 'Fira Code', monospace;
15101
+ font-size: 0.6875rem;
15102
+ color: var(--text-muted);
15103
+ }
15104
+ .mint-reagent-editor__remove-level-btn {
15105
+ display: flex;
15078
15106
  align-items: center;
15079
15107
  justify-content: center;
15080
- min-width: 1.25rem;
15081
- padding: 0.125rem 0.375rem;
15082
- font-size: 0.625rem;
15083
- font-weight: 600;
15084
- border-radius: 9999px;
15085
- flex-shrink: 0;
15086
- }
15087
- .mint-sample-tree--sm .mint-sample-tree__badge {
15088
- min-width: 1rem;
15089
- padding: 0.0625rem 0.25rem;
15090
- font-size: 0.5rem;
15091
- }
15092
- .mint-sample-tree--lg .mint-sample-tree__badge {
15093
- min-width: 1.5rem;
15094
- padding: 0.125rem 0.5rem;
15095
- font-size: 0.75rem;
15096
- }
15097
- .mint-sample-tree__badge--default {
15098
- background-color: var(--bg-tertiary);
15099
- color: var(--text-secondary);
15100
- }
15101
- .mint-sample-tree__badge--success {
15102
- background-color: var(--mint-success-bg);
15103
- color: var(--mint-success);
15108
+ width: 1.375rem;
15109
+ height: 1.375rem;
15110
+ border-radius: var(--radius-sm);
15111
+ background: transparent;
15112
+ color: var(--text-muted);
15113
+ border: none;
15114
+ cursor: pointer;
15115
+ opacity: 0;
15116
+ transition: opacity 0.1s ease, color 0.1s ease, background-color 0.1s ease;
15104
15117
  }
15105
- .mint-sample-tree__badge--warning {
15106
- background-color: var(--mint-warning-bg);
15107
- color: var(--mint-warning);
15118
+ .mint-reagent-editor__table-row:hover .mint-reagent-editor__remove-level-btn {
15119
+ opacity: 1;
15108
15120
  }
15109
- .mint-sample-tree__badge--error {
15110
- background-color: var(--mint-error-bg);
15121
+ .mint-reagent-editor__remove-level-btn:hover {
15111
15122
  color: var(--mint-error);
15123
+ background-color: var(--mint-error-bg);
15112
15124
  }
15113
15125
 
15114
- /* Children container */
15115
- .mint-sample-tree__children {
15116
- margin-left: 1.25rem;
15117
- padding-left: 0.75rem;
15118
- border-left: 1px solid var(--border-color);
15119
- overflow: hidden;
15120
- }
15121
- .mint-sample-tree--sm .mint-sample-tree__children {
15122
- margin-left: 1rem;
15123
- padding-left: 0.5rem;
15124
- }
15125
- .mint-sample-tree--lg .mint-sample-tree__children {
15126
- margin-left: 1.5rem;
15127
- padding-left: 1rem;
15126
+ /* Empty state */
15127
+ .mint-reagent-editor__empty {
15128
+ text-align: center;
15129
+ padding: 1.25rem 0.75rem;
15130
+ font-size: 0.8125rem;
15131
+ color: var(--text-muted);
15132
+ font-style: italic;
15128
15133
  }
15129
15134
 
15130
- /* Animation */
15131
- .mint-sample-tree__children--entering {
15132
- animation: mint-tree-expand 0.15s ease-out;
15135
+ /* Position summary — reagent-tinted background */
15136
+ .mint-reagent-editor__summary {
15137
+ display: flex;
15138
+ align-items: center;
15139
+ justify-content: center;
15140
+ gap: 0.625rem;
15141
+ padding: 0.625rem 1rem;
15142
+ background-color: color-mix(in srgb, var(--reagent-color, var(--color-primary)) 6%, var(--bg-tertiary));
15143
+ border-bottom: 1px solid var(--border-color);
15133
15144
  }
15134
- .mint-sample-tree__children--leaving {
15135
- animation: mint-tree-collapse 0.15s ease-out forwards;
15145
+ .mint-reagent-editor__summary-item {
15146
+ display: flex;
15147
+ align-items: baseline;
15148
+ gap: 0.25rem;
15136
15149
  }
15137
- @keyframes mint-tree-expand {
15138
- from {
15139
- opacity: 0;
15140
- max-height: 0;
15150
+ .mint-reagent-editor__summary-value {
15151
+ font-family: 'Fira Code', monospace;
15152
+ font-size: 0.8125rem;
15153
+ font-weight: 600;
15154
+ color: var(--reagent-color, var(--text-primary));
15141
15155
  }
15142
- to {
15143
- opacity: 1;
15144
- max-height: 1000px;
15156
+ .mint-reagent-editor__summary-label {
15157
+ font-size: 0.6875rem;
15158
+ color: var(--text-muted);
15159
+ }
15160
+ .mint-reagent-editor__summary-dot {
15161
+ width: 3px;
15162
+ height: 3px;
15163
+ border-radius: 50%;
15164
+ background-color: var(--reagent-color, var(--text-muted));
15165
+ opacity: 0.5;
15166
+ flex-shrink: 0;
15145
15167
  }
15168
+
15169
+ /* Overflow warning */
15170
+ .mint-reagent-editor__summary--overflow {
15171
+ background-color: var(--mint-warning-bg);
15146
15172
  }
15147
- @keyframes mint-tree-collapse {
15148
- from {
15149
- opacity: 1;
15150
- max-height: 1000px;
15173
+ .mint-reagent-editor__summary--overflow .mint-reagent-editor__summary-value {
15174
+ color: var(--mint-warning-hover);
15151
15175
  }
15152
- to {
15153
- opacity: 0;
15154
- max-height: 0;
15176
+ .mint-reagent-editor__summary--overflow .mint-reagent-editor__summary-dot {
15177
+ background-color: var(--mint-warning);
15155
15178
  }
15179
+ .mint-reagent-editor__summary-warning {
15180
+ font-size: 0.6875rem;
15181
+ font-weight: 600;
15182
+ color: var(--mint-warning-hover);
15183
+ margin-left: 0.25rem;
15156
15184
  }
15157
15185
 
15158
- /* Empty state */
15159
- .mint-sample-tree__empty {
15160
- padding: 1rem;
15161
- text-align: center;
15162
- color: var(--text-muted);
15163
- }
15164
- .mint-sample-tree__empty-icon {
15165
- width: 2rem;
15166
- height: 2rem;
15167
- margin: 0 auto 0.5rem;
15168
- opacity: 0.5;
15186
+ /* Footer */
15187
+ .mint-reagent-editor__footer {
15188
+ padding: 0.75rem 1rem;
15169
15189
  }
15170
- .mint-sample-tree__empty-text {
15171
- font-size: 0.875rem;
15172
- margin-top: 0 !important;
15173
- margin-bottom: 0 !important;
15174
- padding: 0 !important;
15190
+ .mint-reagent-editor__footer .mint-button {
15191
+ width: 100%;
15175
15192
  }
15176
15193
  /* ProtocolStepEditor Component Styles */
15177
15194
  .mint-protocol-editor {
@@ -17987,6 +18004,11 @@ to { transform: rotate(360deg);
17987
18004
  --text-primary: #1E293B;
17988
18005
  --text-secondary: #64748B;
17989
18006
  --text-muted: #94A3B8;
18007
+ /* De-emphasized label for low-emphasis interactive controls (secondary/ghost
18008
+ buttons). A true dark gray — softer than --text-primary's near-black — that
18009
+ still clears WCAG AA (4.5:1) on the secondary hover surface (--bg-tertiary),
18010
+ where --text-secondary would drop to ~4.35:1. */
18011
+ --text-secondary-strong: #475569;
17990
18012
 
17991
18013
  /* Brand colors */
17992
18014
  --color-primary: #6366F1;
@@ -18093,6 +18115,9 @@ html.dark {
18093
18115
  --text-primary: #F8FAFC;
18094
18116
  --text-secondary: #94A3B8;
18095
18117
  --text-muted: #64748B;
18118
+ /* Dark-mode analog: soft light-gray instead of near-white, AA-safe (7.2:1)
18119
+ on the dark secondary hover surface (--bg-tertiary #334155). */
18120
+ --text-secondary-strong: #CBD5E1;
18096
18121
 
18097
18122
  /* Scrollbar */
18098
18123
  --scrollbar-track: #1E293B;
@@ -19876,10 +19901,11 @@ code, pre {
19876
19901
  }
19877
19902
  .mint-button--secondary {
19878
19903
  background-color: var(--bg-secondary);
19879
- color: var(--text-primary);
19904
+ color: var(--text-secondary-strong);
19880
19905
  border: 1px solid var(--border-color);
19881
- /* Intentionally tighter + fainter than the colored variants
19882
- secondary shouldn't "float" the way filled buttons do. */
19906
+ /* Secondary is lower-emphasis through surface, border, and shadow, but keeps
19907
+ medium label weight so it still reads as an actionable button. */
19908
+ font-weight: 500;
19883
19909
  box-shadow: 0 1px 1px rgba(15, 23, 42, 0.03);
19884
19910
  }
19885
19911
  .mint-button--secondary:hover:not(.mint-button--disabled) {
@@ -19915,7 +19941,9 @@ code, pre {
19915
19941
  }
19916
19942
  .mint-button--ghost {
19917
19943
  background-color: transparent;
19918
- color: var(--text-primary);
19944
+ color: var(--text-secondary-strong);
19945
+ /* Lowest-emphasis variant: regular (400) weight, below secondary. */
19946
+ font-weight: 400;
19919
19947
  }
19920
19948
  .mint-button--ghost:hover:not(.mint-button--disabled) {
19921
19949
  background-color: var(--bg-tertiary);
@@ -19924,8 +19952,14 @@ code, pre {
19924
19952
  .mint-button--sm {
19925
19953
  padding: 0.375rem 0.75rem;
19926
19954
  font-size: 0.875rem;
19955
+ /* Small buttons live in dense/secondary contexts — regular (400) weight
19956
+ keeps the compact label from reading too heavy. Applies to all variants. */
19957
+ font-weight: 400;
19927
19958
  min-height: var(--form-height-sm);
19928
19959
  }
19960
+ .mint-button--secondary.mint-button--sm {
19961
+ font-weight: 500;
19962
+ }
19929
19963
  .mint-button--md {
19930
19964
  padding: 0.5rem 1rem;
19931
19965
  font-size: 0.875rem;
@@ -22278,6 +22312,9 @@ code, pre {
22278
22312
  }
22279
22313
  .mint-modal__close {
22280
22314
  flex-shrink: 0;
22315
+ /* Always pin the close affordance to the right edge of the header, even when
22316
+ there is no title/subtitle (no flex-1 header-text to push it over). */
22317
+ margin-left: auto;
22281
22318
  width: 1.75rem;
22282
22319
  height: 1.75rem;
22283
22320
  padding: 0;
@@ -24612,6 +24649,10 @@ html.dark .mint-toast__item .mint-toast__message {
24612
24649
  .mint-sample-selector__expand-btn:hover {
24613
24650
  background-color: var(--bg-hover);
24614
24651
  }
24652
+ .mint-sample-selector__expand-btn:focus-visible {
24653
+ outline: none;
24654
+ box-shadow: var(--focus-ring);
24655
+ }
24615
24656
  .mint-sample-selector__expand-icon {
24616
24657
  width: 0.875rem;
24617
24658
  height: 0.875rem;
@@ -24716,6 +24757,10 @@ html.dark .mint-toast__item .mint-toast__message {
24716
24757
  transform: scale(1.25);
24717
24758
  box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08), 0 0 0 3px rgba(0, 0, 0, 0.06);
24718
24759
  }
24760
+ .mint-sample-selector__color-dot--clickable:focus-visible {
24761
+ outline: none;
24762
+ box-shadow: var(--focus-ring);
24763
+ }
24719
24764
  /* Count Badge */
24720
24765
  .mint-sample-selector__count-badge {
24721
24766
  font-size: 0.625rem;
@@ -24745,6 +24790,12 @@ html.dark .mint-toast__item .mint-toast__message {
24745
24790
  background-color: var(--mint-error-bg);
24746
24791
  color: var(--mint-error);
24747
24792
  }
24793
+ /* Reveal the hover-hidden delete button when reached by keyboard, and ring it. */
24794
+ .mint-sample-selector__delete-btn:focus-visible {
24795
+ outline: none;
24796
+ opacity: 1;
24797
+ box-shadow: var(--focus-ring);
24798
+ }
24748
24799
  .mint-sample-selector__delete-btn--hidden {
24749
24800
  opacity: 0;
24750
24801
  }
@@ -25822,7 +25873,7 @@ html.dark .mint-toast__item .mint-toast__message {
25822
25873
  font-size: 0.8125rem;
25823
25874
  color: var(--mint-error);
25824
25875
  background: var(--mint-error-bg);
25825
- border: 1px solid rgba(239, 68, 68, 0.3);
25876
+ border: 1px solid var(--mint-error-border);
25826
25877
  border-radius: var(--radius);
25827
25878
  }
25828
25879
  /* --- Experiment mode --- */
@@ -25842,7 +25893,7 @@ html.dark .mint-toast__item .mint-toast__message {
25842
25893
  }
25843
25894
  .mint-auto-group__experiment-error {
25844
25895
  padding: 1.5rem;
25845
- border: 1px solid rgba(239, 68, 68, 0.3);
25896
+ border: 1px solid var(--mint-error-border);
25846
25897
  border-radius: var(--radius-md);
25847
25898
  background: var(--mint-error-bg);
25848
25899
  font-size: 0.8125rem;
@@ -25873,7 +25924,7 @@ html.dark .mint-toast__item .mint-toast__message {
25873
25924
  .mint-auto-group__link-btn:focus-visible {
25874
25925
  outline: 2px solid var(--color-primary);
25875
25926
  outline-offset: 1px;
25876
- border-radius: 2px;
25927
+ border-radius: var(--radius-sm);
25877
25928
  }
25878
25929
  .mint-auto-group__experiment-loaded {
25879
25930
  padding: 1.5rem;
@@ -26188,14 +26239,10 @@ html.dark .mint-toast__item .mint-toast__message {
26188
26239
  .mint-auto-group__preview-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
26189
26240
  .mint-auto-group__preview-panel { background: var(--bg-secondary); border: 1px solid var(--border); border-radius: var(--radius); padding: 14px; }
26190
26241
  .mint-auto-group__preview-panel h4 { margin: 0 0 10px; font-size: 12px; color: var(--text-muted); text-transform: uppercase; letter-spacing: .06em; }
26191
- .mint-auto-group__preview-group { border: 1px solid var(--border-color); border-radius: var(--radius); overflow: hidden; }
26192
- .mint-auto-group__preview-group[open] { background: var(--bg-secondary); }
26193
- .mint-auto-group__preview-group summary { display: flex; align-items: center; gap: 10px; cursor: pointer; font-size: 13px; padding: 0.5rem 0.875rem; }
26194
- .mint-auto-group__preview-group[open] summary { border-bottom: 1px solid var(--border); }
26195
- .mint-auto-group__preview-dot { width: 10px; height: 10px; border-radius: 9999px; flex-shrink: 0; }
26196
- .mint-auto-group__preview-count { margin-left: auto; font-family: 'Fira Code', monospace; font-size: 12px; color: var(--text-secondary); background: var(--bg-primary); border: 1px solid var(--border); padding: 2px 8px; border-radius: 9999px; }
26197
- .mint-auto-group__preview-samples { display: flex; flex-wrap: wrap; gap: 6px; padding: 0.5rem 0.875rem 0.625rem; }
26198
- .mint-auto-group__preview-sample { font-family: 'Fira Code', monospace; font-size: 11.5px; color: var(--text-primary); background: var(--bg-primary); border: 1px solid var(--border); padding: 3px 8px; border-radius: 9999px; }
26242
+ /* Nested experimental groups render as a collapsible SampleHierarchyTree; cap
26243
+ its height so a large batch scrolls inside the panel instead of the modal. */
26244
+ .mint-auto-group__preview-tree { max-height: 320px; overflow-y: auto; }
26245
+ .mint-auto-group__preview-empty { margin: 0; font-size: 13px; color: var(--text-muted); }
26199
26246
  .mint-auto-group__qc-chips { display: flex; flex-wrap: wrap; gap: 6px; }
26200
26247
  .mint-auto-group__qc-chip { background: var(--mint-warning-bg); color: #92400E; border: 1px solid var(--mint-warning-border); padding: 4px 10px; border-radius: 9999px; font-size: 12px; }
26201
26248
  .mint-auto-group__fingerprint { margin-top: 14px; }