@morscherlab/mint-sdk 1.2.0 → 1.2.2

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 (152) hide show
  1. package/dist/{ExperimentSelectorModal-DCXmwKNS.js → ExperimentSelectorModal-DHE9k8TP.js} +3 -3
  2. package/dist/{ExperimentSelectorModal-DCXmwKNS.js.map → ExperimentSelectorModal-DHE9k8TP.js.map} +1 -1
  3. package/dist/{SettingsModal-BYR20I4c.js → SettingsModal-DELMkUFR.js} +39 -16
  4. package/dist/SettingsModal-DELMkUFR.js.map +1 -0
  5. package/dist/{Skeleton-BAF3CKY7.js → Skeleton-jhF9wUkU.js} +17 -7
  6. package/dist/Skeleton-jhF9wUkU.js.map +1 -0
  7. package/dist/__tests__/components/ChartContainer.test.d.ts +1 -0
  8. package/dist/__tests__/components/ChemicalFormula.test.d.ts +1 -0
  9. package/dist/__tests__/components/FormField.test.d.ts +1 -0
  10. package/dist/__tests__/components/LayoutResizeHandle.test.d.ts +1 -0
  11. package/dist/__tests__/components/NumberInput.test.d.ts +1 -0
  12. package/dist/__tests__/components/SearchableSelect.test.d.ts +1 -0
  13. package/dist/__tests__/components/WellPlate.decoration.test.d.ts +1 -0
  14. package/dist/__tests__/composables/localFiles.test.d.ts +1 -0
  15. package/dist/__tests__/composables/useManualLayoutResize.test.d.ts +1 -0
  16. package/dist/__tests__/composables/usePickerSelection.test.d.ts +1 -0
  17. package/dist/__tests__/styles/tokenOnlyColors.test.d.ts +1 -0
  18. package/dist/components/AdductText.vue.d.ts +17 -0
  19. package/dist/components/AppSidebar.vue.d.ts +7 -7
  20. package/dist/components/BasePill.vue.d.ts +3 -0
  21. package/dist/components/BaseTabs.vue.d.ts +1 -4
  22. package/dist/components/ChartContainer.vue.d.ts +19 -5
  23. package/dist/components/ChemicalFormula.vue.d.ts +28 -2
  24. package/dist/components/DataFrame.vue.d.ts +1 -1
  25. package/dist/components/FileUploader.vue.d.ts +3 -0
  26. package/dist/components/FormField.vue.d.ts +8 -1
  27. package/dist/components/LayoutResizeHandle.vue.d.ts +23 -0
  28. package/dist/components/PlotlyChart.vue.d.ts +34 -6
  29. package/dist/components/PluginWorkspaceView.props.d.ts +3 -3
  30. package/dist/components/SearchableSelect.vue.d.ts +57 -0
  31. package/dist/components/WellPlate.vue.d.ts +5 -1
  32. package/dist/components/index.d.ts +3 -1
  33. package/dist/components/index.js +6 -6
  34. package/dist/{components-DIum5hkx.js → components-CxQVQCpP.js} +1215 -546
  35. package/dist/components-CxQVQCpP.js.map +1 -0
  36. package/dist/composables/index.d.ts +1 -0
  37. package/dist/composables/index.js +8 -8
  38. package/dist/composables/pluginWorkspaceModel.d.ts +0 -3
  39. package/dist/composables/useManualLayoutResize.d.ts +56 -0
  40. package/dist/composables/useToast.d.ts +22 -1
  41. package/dist/{composables-mFXsTA4g.js → composables-DAqOU8Aq.js} +97 -8
  42. package/dist/composables-DAqOU8Aq.js.map +1 -0
  43. package/dist/index.js +11 -11
  44. package/dist/install.js +2 -2
  45. package/dist/styles.css +855 -320
  46. package/dist/templates/index.js +2 -2
  47. package/dist/{templates-CmGfmBRA.js → templates-NuaNHohp.js} +2 -2
  48. package/dist/{templates-CmGfmBRA.js.map → templates-NuaNHohp.js.map} +1 -1
  49. package/dist/types/componentLabTypes.d.ts +3 -0
  50. package/dist/types/components.d.ts +26 -1
  51. package/dist/types/form-builder.d.ts +2 -0
  52. package/dist/types/generated-ui.d.ts +2 -0
  53. package/dist/types/index.d.ts +1 -1
  54. package/dist/{useControlSchema-DldpxNOP.js → useControlSchema-vLiRPUmj.js} +181 -71
  55. package/dist/useControlSchema-vLiRPUmj.js.map +1 -0
  56. package/dist/{useExperimentSelector-CEcIaueJ.js → useExperimentSelector-G_CAOFTX.js} +2 -2
  57. package/dist/{useExperimentSelector-CEcIaueJ.js.map → useExperimentSelector-G_CAOFTX.js.map} +1 -1
  58. package/dist/{useFormBuilder-z5L_dUIy.js → useFormBuilder-D37ajgS8.js} +2 -2
  59. package/dist/{useFormBuilder-z5L_dUIy.js.map → useFormBuilder-D37ajgS8.js.map} +1 -1
  60. package/dist/{validation-uwoJGEb6.js → validation-ChMyixAf.js} +21 -9
  61. package/dist/validation-ChMyixAf.js.map +1 -0
  62. package/package.json +1 -1
  63. package/src/__tests__/components/AppSidebar.test.ts +84 -94
  64. package/src/__tests__/components/AppToastContainer.test.ts +55 -1
  65. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +0 -21
  66. package/src/__tests__/components/ChartContainer.test.ts +24 -0
  67. package/src/__tests__/components/ChemicalFormula.test.ts +27 -0
  68. package/src/__tests__/components/ControlWorkspaceView.test.ts +0 -2
  69. package/src/__tests__/components/DoseDesignWorkspaceView.test.ts +0 -2
  70. package/src/__tests__/components/FormBuilder.test.ts +26 -0
  71. package/src/__tests__/components/FormField.test.ts +26 -0
  72. package/src/__tests__/components/GeneratedPathInput.test.ts +18 -0
  73. package/src/__tests__/components/LayoutResizeHandle.test.ts +19 -0
  74. package/src/__tests__/components/NumberInput.test.ts +149 -0
  75. package/src/__tests__/components/PlotlyChart.test.ts +48 -0
  76. package/src/__tests__/components/PluginWorkspaceView.internal.test.ts +1 -2
  77. package/src/__tests__/components/PluginWorkspaceView.test.ts +1 -2
  78. package/src/__tests__/components/RackEditor.test.ts +9 -0
  79. package/src/__tests__/components/SearchableSelect.test.ts +61 -0
  80. package/src/__tests__/components/WellPlate.decoration.test.ts +28 -0
  81. package/src/__tests__/composables/localFiles.test.ts +57 -0
  82. package/src/__tests__/composables/useManualLayoutResize.test.ts +21 -0
  83. package/src/__tests__/composables/usePickerSelection.test.ts +98 -0
  84. package/src/__tests__/generatedUi.test.ts +111 -0
  85. package/src/__tests__/styles/tokenOnlyColors.test.ts +16 -0
  86. package/src/components/AdductText.story.vue +15 -0
  87. package/src/components/AdductText.vue +40 -0
  88. package/src/components/AppLayout.story.vue +1 -1
  89. package/src/components/AppSidebar.story.vue +7 -10
  90. package/src/components/AppSidebar.vue +178 -58
  91. package/src/components/AppToastContainer.vue +65 -23
  92. package/src/components/BasePill.story.vue +2 -0
  93. package/src/components/BasePill.vue +4 -0
  94. package/src/components/BaseTabs.story.vue +0 -42
  95. package/src/components/BaseTabs.vue +3 -6
  96. package/src/components/ChartContainer.story.vue +21 -0
  97. package/src/components/ChartContainer.vue +27 -6
  98. package/src/components/ChemicalFormula.story.vue +7 -0
  99. package/src/components/ChemicalFormula.vue +40 -11
  100. package/src/components/FileUploader.vue +10 -1
  101. package/src/components/FormField.vue +10 -3
  102. package/src/components/GeneratedPathInput.vue +11 -7
  103. package/src/components/LayoutResizeHandle.story.vue +26 -0
  104. package/src/components/LayoutResizeHandle.vue +62 -0
  105. package/src/components/NumberInput.story.vue +32 -13
  106. package/src/components/NumberInput.vue +145 -56
  107. package/src/components/PlotlyChart.vue +77 -11
  108. package/src/components/PluginWorkspaceView.props.ts +3 -3
  109. package/src/components/RackEditor.vue +38 -32
  110. package/src/components/SearchableSelect.story.vue +24 -0
  111. package/src/components/SearchableSelect.vue +223 -0
  112. package/src/components/WellPlate.story.vue +16 -0
  113. package/src/components/WellPlate.vue +17 -8
  114. package/src/components/index.ts +3 -1
  115. package/src/components/internal/FormFieldRendererInternal.vue +17 -0
  116. package/src/components/internal/WorkspaceSidebarInternal.vue +1 -2
  117. package/src/composables/filePicker/localFiles.ts +21 -14
  118. package/src/composables/filePicker/usePickerSelection.ts +15 -4
  119. package/src/composables/index.ts +10 -0
  120. package/src/composables/pluginWorkspaceModel.ts +0 -3
  121. package/src/composables/useManualLayoutResize.ts +165 -0
  122. package/src/composables/usePluginWorkspace.ts +1 -2
  123. package/src/composables/useToast.ts +21 -5
  124. package/src/generated/schema.ts +58 -18
  125. package/src/styles/components/adduct-text.css +45 -0
  126. package/src/styles/components/app-sidebar.css +282 -121
  127. package/src/styles/components/chart-container.css +92 -0
  128. package/src/styles/components/chemical-formula.css +34 -4
  129. package/src/styles/components/form-builder.css +1 -1
  130. package/src/styles/components/form-field.css +28 -0
  131. package/src/styles/components/layout-resize-handle.css +60 -0
  132. package/src/styles/components/number-input.css +75 -91
  133. package/src/styles/components/pill.css +49 -51
  134. package/src/styles/components/rack-editor.css +31 -9
  135. package/src/styles/components/searchable-select.css +63 -0
  136. package/src/styles/components/segmented-control.css +16 -11
  137. package/src/styles/components/tabs.css +18 -34
  138. package/src/styles/components/toast.css +136 -27
  139. package/src/styles/components/well-plate.css +9 -0
  140. package/src/styles/index.css +3 -0
  141. package/src/styles/variables.css +25 -5
  142. package/src/types/componentLabTypes.ts +6 -0
  143. package/src/types/components.ts +30 -0
  144. package/src/types/form-builder.ts +2 -0
  145. package/src/types/generated-ui.ts +2 -0
  146. package/src/types/index.ts +5 -0
  147. package/dist/SettingsModal-BYR20I4c.js.map +0 -1
  148. package/dist/Skeleton-BAF3CKY7.js.map +0 -1
  149. package/dist/components-DIum5hkx.js.map +0 -1
  150. package/dist/composables-mFXsTA4g.js.map +0 -1
  151. package/dist/useControlSchema-DldpxNOP.js.map +0 -1
  152. package/dist/validation-uwoJGEb6.js.map +0 -1
@@ -0,0 +1,60 @@
1
+ .mint-layout-resize-handle {
2
+ display: flex;
3
+ flex-shrink: 0;
4
+ align-items: center;
5
+ justify-content: center;
6
+ background: transparent;
7
+ cursor: col-resize;
8
+ }
9
+
10
+ .mint-layout-resize-handle--vertical { width: 1rem; min-height: 2.75rem; }
11
+ .mint-layout-resize-handle--horizontal { min-width: 2.75rem; height: 1rem; cursor: row-resize; }
12
+ .mint-layout-resize-handle--edge-left,
13
+ .mint-layout-resize-handle--edge-right { position: absolute; top: 0; bottom: 0; z-index: 10; height: auto; }
14
+ .mint-layout-resize-handle--edge-left { left: 0; transform: translateX(-100%); }
15
+ .mint-layout-resize-handle--edge-right { right: 0; transform: translateX(100%); }
16
+
17
+ .mint-layout-resize-handle__bar {
18
+ display: block;
19
+ width: 0.25rem;
20
+ height: 2.75rem;
21
+ border-radius: 999px;
22
+ background: var(--border-color);
23
+ opacity: 0.72;
24
+ transition: background-color 150ms ease, opacity 150ms ease, transform 150ms ease;
25
+ }
26
+
27
+ .mint-layout-resize-handle--horizontal .mint-layout-resize-handle__bar {
28
+ width: 2.75rem;
29
+ height: 0.25rem;
30
+ }
31
+
32
+ .mint-layout-resize-handle:hover .mint-layout-resize-handle__bar,
33
+ .mint-layout-resize-handle:focus-visible .mint-layout-resize-handle__bar {
34
+ background: var(--color-primary);
35
+ opacity: 1;
36
+ }
37
+
38
+ .mint-layout-resize-handle--vertical:hover .mint-layout-resize-handle__bar,
39
+ .mint-layout-resize-handle--vertical:focus-visible .mint-layout-resize-handle__bar { transform: scaleX(1.35); }
40
+ .mint-layout-resize-handle--horizontal:hover .mint-layout-resize-handle__bar,
41
+ .mint-layout-resize-handle--horizontal:focus-visible .mint-layout-resize-handle__bar { transform: scaleY(1.35); }
42
+
43
+ .mint-layout-resize-handle:focus-visible {
44
+ outline: 2px solid var(--color-primary);
45
+ outline-offset: 2px;
46
+ }
47
+
48
+ .mint-layout-resize-handle--edge-left:focus-visible,
49
+ .mint-layout-resize-handle--edge-right:focus-visible { outline-offset: -2px; }
50
+
51
+ .mint-layout-resize-handle[aria-disabled='true'] { cursor: not-allowed; opacity: 0.5; }
52
+
53
+ @media (prefers-reduced-motion: reduce) {
54
+ .mint-layout-resize-handle__bar { transition: none; }
55
+ }
56
+
57
+ @media (pointer: coarse) {
58
+ .mint-layout-resize-handle--vertical { width: 2.75rem; }
59
+ .mint-layout-resize-handle--horizontal { height: 2.75rem; }
60
+ }
@@ -1,21 +1,22 @@
1
- /* NumberInput Component Styles */
1
+ /* NumberInput Component Styles — one object: the field is the slider. */
2
2
 
3
3
  .mint-number-input {
4
4
  display: flex;
5
- flex-direction: column;
6
- gap: 0.375rem;
7
5
  max-width: 100%;
8
6
  }
9
7
 
10
- /* ---------- Field wrapper (numeric input + steppers + optional unit) ---------- */
8
+ /* ---------- Field wrapper (scrub area + steppers) ---------- */
11
9
 
12
10
  .mint-number-input__field {
13
11
  position: relative;
14
12
  display: flex;
15
- align-items: center;
13
+ flex: 1;
14
+ min-width: 0;
15
+ align-items: stretch;
16
+ overflow: hidden;
16
17
  background-color: var(--bg-secondary);
17
18
  border: 1px solid var(--border-color);
18
- border-radius: 0.5rem;
19
+ border-radius: var(--radius);
19
20
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
20
21
  }
21
22
 
@@ -45,21 +46,67 @@
45
46
  background-color: var(--bg-tertiary);
46
47
  }
47
48
 
49
+ /* ---------- Scrub area: range fill (wash + rule) lives under the value ---------- */
50
+
51
+ .mint-number-input__scrub {
52
+ position: relative;
53
+ display: flex;
54
+ flex: 1;
55
+ min-width: 0;
56
+ align-items: center;
57
+ gap: 0.375rem;
58
+ }
59
+
60
+ .mint-number-input--slider .mint-number-input__scrub {
61
+ cursor: ew-resize;
62
+ touch-action: none;
63
+ }
64
+
65
+ .mint-number-input--slider .mint-number-input__scrub:focus-visible {
66
+ outline: none;
67
+ box-shadow: inset var(--focus-ring-soft);
68
+ }
69
+
70
+ .mint-number-input__wash,
71
+ .mint-number-input__rule {
72
+ position: absolute;
73
+ left: 0;
74
+ bottom: 0;
75
+ width: var(--mint-number-input-fill, 0%);
76
+ pointer-events: none;
77
+ transition: width 0.1s ease;
78
+ }
79
+
80
+ .mint-number-input__wash {
81
+ top: 0;
82
+ background: color-mix(in srgb, var(--color-primary) 9%, transparent);
83
+ }
84
+
85
+ .mint-number-input__rule {
86
+ height: 2px;
87
+ background: var(--color-primary);
88
+ }
89
+
48
90
  /* ---------- Numeric input — left-aligned, Fira Code ---------- */
49
91
 
50
92
  .mint-number-input__input {
93
+ position: relative;
51
94
  flex: 1;
52
95
  min-width: 0;
96
+ width: 100%;
53
97
  text-align: left;
54
98
  background-color: transparent;
55
99
  color: var(--text-primary);
56
100
  border: none;
57
101
  outline: none;
58
102
  line-height: 1.25;
59
- font-family: var(--font-mono, 'Fira Code', monospace);
103
+ font-family: var(--font-mono);
104
+ font-variant-numeric: tabular-nums;
60
105
  -webkit-appearance: textfield;
61
106
  -moz-appearance: textfield;
62
107
  appearance: textfield;
108
+ cursor: ew-resize;
109
+ touch-action: pan-y;
63
110
  }
64
111
 
65
112
  .mint-number-input__input::-webkit-outer-spin-button,
@@ -72,128 +119,65 @@
72
119
 
73
120
  /* Horizontal padding matches BaseInput canonical scale (10/12/16) so FormField's
74
121
  12px label indent aligns with the numeric text across all input types. */
75
- .mint-number-input__input--sm { padding: 0.375rem 0.625rem; font-size: 0.875rem; }
122
+ .mint-number-input__input--sm { padding: 0.375rem 0.625rem; font-size: 0.8125rem; }
76
123
  .mint-number-input__input--md { padding: 0.5rem 0.75rem; font-size: 0.875rem; }
77
124
  .mint-number-input__input--lg { padding: 0.75rem 1rem; font-size: 1rem; }
78
125
 
79
126
  /* ---------- Unit suffix ---------- */
80
127
 
81
128
  .mint-number-input__unit {
82
- padding: 0 0.625rem 0 0;
129
+ position: relative;
130
+ flex-shrink: 0;
131
+ padding-right: 0.5rem;
83
132
  color: var(--text-muted);
84
- font-size: 0.8125rem;
85
- font-family: var(--font-mono, 'Fira Code', monospace);
133
+ font-size: 0.6875rem;
134
+ font-family: var(--font-mono);
86
135
  user-select: none;
87
136
  white-space: nowrap;
88
137
  }
89
138
 
90
- /* ---------- Steppers — hover/focus reveal ---------- */
139
+ /* ---------- Steppers — always visible, horizontal, hairline-divided ---------- */
91
140
 
92
141
  .mint-number-input__steppers {
93
142
  display: flex;
94
- flex-direction: column;
95
- margin-right: 0.25rem;
96
- opacity: 0;
97
- transform: translateX(-2px);
98
- transition: opacity 0.15s ease, transform 0.15s ease;
99
- pointer-events: none;
100
- }
101
-
102
- .mint-number-input__field:hover .mint-number-input__steppers,
103
- .mint-number-input__field:focus-within .mint-number-input__steppers {
104
- opacity: 1;
105
- transform: translateX(0);
106
- pointer-events: auto;
143
+ flex-shrink: 0;
107
144
  }
108
145
 
109
146
  .mint-number-input__stepper {
110
147
  display: flex;
111
148
  align-items: center;
112
149
  justify-content: center;
113
- width: 1.125rem;
114
- height: 0.875rem;
150
+ width: 1.625rem;
115
151
  padding: 0;
116
152
  background: transparent;
117
- color: var(--text-muted);
153
+ color: var(--text-secondary-strong);
118
154
  border: none;
155
+ border-left: 1px solid var(--border-color);
119
156
  cursor: pointer;
120
- transition: color 0.1s ease;
157
+ transition: background-color 0.12s ease, color 0.12s ease;
121
158
  }
122
159
 
123
160
  .mint-number-input__stepper:hover:not(:disabled) {
124
- color: var(--color-primary);
161
+ background: var(--color-primary-soft);
162
+ color: var(--color-primary-hover);
125
163
  }
126
164
 
127
165
  .mint-number-input__stepper:disabled {
128
- opacity: 0.35;
166
+ color: var(--text-muted);
167
+ opacity: 0.45;
129
168
  cursor: not-allowed;
130
169
  }
131
170
 
132
171
  .mint-number-input__stepper svg {
133
172
  width: 0.625rem;
134
- height: 0.375rem;
173
+ height: 0.625rem;
135
174
  }
136
175
 
137
176
  @media (prefers-reduced-motion: reduce) {
138
- .mint-number-input__steppers {
177
+ .mint-number-input__field,
178
+ .mint-number-input__wash,
179
+ .mint-number-input__rule,
180
+ .mint-number-input__stepper {
139
181
  transition: none;
140
- opacity: 1;
141
- transform: none;
142
- pointer-events: auto;
143
182
  }
144
183
  }
145
-
146
- /* ---------- Slider (variant="slider" auto-activated by min+max) ---------- */
147
-
148
- .mint-number-input__slider {
149
- -webkit-appearance: none;
150
- appearance: none;
151
- width: 100%;
152
- height: 4px;
153
- background: linear-gradient(
154
- to right,
155
- var(--color-primary) 0%,
156
- var(--color-primary) var(--mint-slider-fill, 0%),
157
- var(--bg-tertiary) var(--mint-slider-fill, 0%),
158
- var(--bg-tertiary) 100%
159
- );
160
- border-radius: 9999px;
161
- outline: none;
162
- cursor: pointer;
163
- }
164
-
165
- .mint-number-input__slider::-webkit-slider-thumb {
166
- -webkit-appearance: none;
167
- appearance: none;
168
- width: 14px;
169
- height: 14px;
170
- background: var(--bg-secondary);
171
- border: 2px solid var(--color-primary);
172
- border-radius: 50%;
173
- cursor: pointer;
174
- box-shadow: var(--shadow-sm);
175
- transition: transform 0.1s ease;
176
- }
177
-
178
- .mint-number-input__slider::-webkit-slider-thumb:hover {
179
- transform: scale(1.12);
180
- }
181
-
182
- .mint-number-input__slider::-moz-range-thumb {
183
- width: 14px;
184
- height: 14px;
185
- background: var(--bg-secondary);
186
- border: 2px solid var(--color-primary);
187
- border-radius: 50%;
188
- cursor: pointer;
189
- box-shadow: var(--shadow-sm);
190
- }
191
-
192
- .mint-number-input__slider:focus-visible {
193
- box-shadow: var(--focus-ring-soft);
194
- }
195
-
196
- .mint-number-input__slider:disabled {
197
- cursor: not-allowed;
198
- opacity: var(--mint-disabled-opacity);
199
- }
@@ -28,6 +28,23 @@
28
28
  font-size: 0.8125rem;
29
29
  }
30
30
 
31
+ /* Semantic tones — every color resolves from a token. `--mint-pill-tone` is the
32
+ accent (soft-tint background, dot, outline border); `--mint-pill-ink` the text. */
33
+ .mint-pill--primary { --mint-pill-tone: var(--color-primary); --mint-pill-ink: var(--color-primary-hover); }
34
+ .mint-pill--success { --mint-pill-tone: var(--mint-success); --mint-pill-ink: var(--mint-success-hover); }
35
+ .mint-pill--warning { --mint-pill-tone: var(--mint-warning); --mint-pill-ink: var(--mint-warning-text); }
36
+ .mint-pill--error { --mint-pill-tone: var(--mint-error); --mint-pill-ink: var(--mint-error-hover); }
37
+ .mint-pill--info { --mint-pill-tone: var(--mint-info); --mint-pill-ink: color-mix(in srgb, var(--mint-info) 78%, black); }
38
+ .mint-pill--neutral { --mint-pill-tone: var(--text-secondary); --mint-pill-ink: var(--text-secondary-strong); }
39
+
40
+ html.dark .mint-pill--primary,
41
+ html.dark .mint-pill--success,
42
+ html.dark .mint-pill--warning,
43
+ html.dark .mint-pill--error,
44
+ html.dark .mint-pill--info {
45
+ --mint-pill-ink: var(--mint-pill-tone);
46
+ }
47
+
31
48
  /* Variants */
32
49
  .mint-pill--default,
33
50
  .mint-pill--neutral {
@@ -35,49 +52,30 @@
35
52
  color: var(--text-secondary);
36
53
  }
37
54
 
38
- .mint-pill--primary {
39
- background-color: rgba(59, 130, 246, 0.1);
40
- color: var(--color-primary);
41
- }
42
-
43
- html.dark .mint-pill--primary {
44
- background-color: rgba(59, 130, 246, 0.2);
45
- }
46
-
47
- .mint-pill--success {
48
- background-color: rgba(16, 185, 129, 0.1);
49
- color: var(--mint-success);
50
- }
51
-
52
- html.dark .mint-pill--success {
53
- background-color: rgba(16, 185, 129, 0.2);
54
- }
55
-
56
- .mint-pill--warning {
57
- background-color: rgba(245, 158, 11, 0.1);
58
- color: var(--mint-warning);
59
- }
60
-
61
- html.dark .mint-pill--warning {
62
- background-color: rgba(245, 158, 11, 0.2);
63
- }
64
-
65
- .mint-pill--error {
66
- background-color: rgba(239, 68, 68, 0.1);
67
- color: var(--mint-error);
68
- }
69
-
70
- html.dark .mint-pill--error {
71
- background-color: rgba(239, 68, 68, 0.2);
72
- }
73
-
55
+ .mint-pill--primary,
56
+ .mint-pill--success,
57
+ .mint-pill--warning,
58
+ .mint-pill--error,
74
59
  .mint-pill--info {
75
- background-color: rgba(59, 130, 246, 0.1);
76
- color: var(--mint-info);
60
+ background-color: color-mix(in srgb, var(--mint-pill-tone) 12%, transparent);
61
+ color: var(--mint-pill-ink);
77
62
  }
78
63
 
64
+ html.dark .mint-pill--primary,
65
+ html.dark .mint-pill--success,
66
+ html.dark .mint-pill--warning,
67
+ html.dark .mint-pill--error,
79
68
  html.dark .mint-pill--info {
80
- background-color: rgba(59, 130, 246, 0.2);
69
+ background-color: color-mix(in srgb, var(--mint-pill-tone) 22%, transparent);
70
+ }
71
+
72
+ /* Status dot */
73
+ .mint-pill__dot {
74
+ flex-shrink: 0;
75
+ width: 0.375rem;
76
+ height: 0.375rem;
77
+ border-radius: 9999px;
78
+ background-color: var(--mint-pill-tone, currentColor);
81
79
  }
82
80
 
83
81
  /* ========================================================================
@@ -94,13 +92,17 @@ html.dark .mint-pill--info {
94
92
  color: var(--text-secondary);
95
93
  }
96
94
 
97
- .mint-pill--outline.mint-pill--neutral { border-color: var(--text-muted); color: var(--text-primary); }
98
- .mint-pill--outline.mint-pill--primary { border-color: var(--color-primary); color: var(--color-primary); }
99
- .mint-pill--outline.mint-pill--success { border-color: var(--mint-success); color: var(--mint-success); }
100
- /* Warning text uses -hover (darker) so AA contrast holds on white; border uses the lighter primary warning tone. */
101
- .mint-pill--outline.mint-pill--warning { border-color: var(--mint-warning); color: var(--mint-warning-hover); }
102
- .mint-pill--outline.mint-pill--error { border-color: var(--mint-error); color: var(--mint-error); }
103
- .mint-pill--outline.mint-pill--info { border-color: var(--mint-info); color: var(--mint-info); }
95
+ .mint-pill--outline.mint-pill--neutral { border-color: var(--text-muted); color: var(--text-primary); }
96
+
97
+ .mint-pill--outline.mint-pill--primary,
98
+ .mint-pill--outline.mint-pill--success,
99
+ .mint-pill--outline.mint-pill--warning,
100
+ .mint-pill--outline.mint-pill--error,
101
+ .mint-pill--outline.mint-pill--info {
102
+ background-color: transparent;
103
+ border-color: var(--mint-pill-tone);
104
+ color: var(--mint-pill-ink);
105
+ }
104
106
 
105
107
  /* Disabled */
106
108
  .mint-pill--disabled {
@@ -160,11 +162,7 @@ html.dark .mint-pill--info {
160
162
 
161
163
  .mint-pill__remove:hover {
162
164
  opacity: 1;
163
- background-color: rgba(0, 0, 0, 0.1);
164
- }
165
-
166
- html.dark .mint-pill__remove:hover {
167
- background-color: rgba(255, 255, 255, 0.1);
165
+ background-color: color-mix(in srgb, currentColor 12%, transparent);
168
166
  }
169
167
 
170
168
  .mint-pill__remove:focus-visible {
@@ -20,6 +20,12 @@
20
20
  gap: 2px;
21
21
  }
22
22
 
23
+ .mint-rack-editor__tab-item {
24
+ position: relative;
25
+ display: flex;
26
+ align-items: flex-end;
27
+ }
28
+
23
29
  .mint-rack-editor__tab {
24
30
  position: relative;
25
31
  display: flex;
@@ -32,7 +38,7 @@
32
38
  border-top-right-radius: 0.5rem;
33
39
  border: 1px solid transparent;
34
40
  cursor: grab;
35
- transition: all 0.2s;
41
+ transition: background-color 0.2s, border-color 0.2s, color 0.2s, opacity 0.2s;
36
42
  background: transparent;
37
43
  color: var(--text-muted);
38
44
  white-space: nowrap;
@@ -47,6 +53,11 @@
47
53
  color: var(--text-secondary);
48
54
  }
49
55
 
56
+ .mint-rack-editor__tab:focus-visible {
57
+ outline: 2px solid var(--color-primary);
58
+ outline-offset: -2px;
59
+ }
60
+
50
61
  .mint-rack-editor__tab--active {
51
62
  background-color: var(--bg-secondary);
52
63
  color: var(--text-primary);
@@ -61,7 +72,7 @@
61
72
  }
62
73
 
63
74
  .mint-rack-editor__tab--drag-over {
64
- box-shadow: 0 0 0 2px #6366f1, 0 0 0 3px white;
75
+ box-shadow: var(--focus-ring);
65
76
  }
66
77
 
67
78
  /* Slot color dot */
@@ -82,8 +93,8 @@
82
93
  }
83
94
 
84
95
  .mint-rack-editor__count--active {
85
- background-color: rgba(16, 185, 129, 0.15);
86
- color: #10b981;
96
+ background-color: color-mix(in srgb, var(--mint-success) 15%, transparent);
97
+ color: var(--mint-success);
87
98
  }
88
99
 
89
100
  .mint-rack-editor__count--inactive {
@@ -104,7 +115,7 @@
104
115
  justify-content: center;
105
116
  font-size: 10px;
106
117
  font-weight: 700;
107
- background-color: rgba(239, 68, 68, 0.9);
118
+ background-color: color-mix(in srgb, var(--mint-error) 90%, transparent);
108
119
  color: white;
109
120
  border: none;
110
121
  cursor: pointer;
@@ -112,7 +123,8 @@
112
123
  transition: opacity 0.15s, transform 0.15s;
113
124
  }
114
125
 
115
- .mint-rack-editor__tab:hover .mint-rack-editor__tab-remove {
126
+ .mint-rack-editor__tab-item:hover .mint-rack-editor__tab-remove,
127
+ .mint-rack-editor__tab-item:focus-within .mint-rack-editor__tab-remove {
116
128
  opacity: 1;
117
129
  }
118
130
 
@@ -120,6 +132,16 @@
120
132
  transform: scale(1.1);
121
133
  }
122
134
 
135
+ .mint-rack-editor__tab-remove:focus-visible {
136
+ opacity: 1;
137
+ outline: 2px solid var(--color-primary);
138
+ outline-offset: 2px;
139
+ }
140
+
141
+ @media (hover: none) {
142
+ .mint-rack-editor__tab-remove { opacity: 1; }
143
+ }
144
+
123
145
  /* Add rack button */
124
146
  .mint-rack-editor__add-btn {
125
147
  display: flex;
@@ -131,15 +153,15 @@
131
153
  font-weight: 500;
132
154
  border-radius: var(--radius-md);
133
155
  cursor: pointer;
134
- transition: all 0.2s;
156
+ transition: background-color 0.2s, color 0.2s;
135
157
  border: none;
136
158
  background: transparent;
137
159
  color: var(--text-muted);
138
160
  }
139
161
 
140
162
  .mint-rack-editor__add-btn:hover {
141
- background-color: rgba(16, 185, 129, 0.1);
142
- color: #10b981;
163
+ background-color: color-mix(in srgb, var(--mint-success) 10%, transparent);
164
+ color: var(--mint-success);
143
165
  }
144
166
 
145
167
  /* Toolbar */
@@ -0,0 +1,63 @@
1
+ .mint-searchable-select { position: relative; min-width: 0; }
2
+
3
+ .mint-searchable-select__trigger {
4
+ display: flex;
5
+ align-items: center;
6
+ width: 100%;
7
+ min-height: var(--form-height-md);
8
+ gap: 0.5rem;
9
+ padding: 0.5rem 0.75rem;
10
+ border: 1px solid var(--border-color);
11
+ border-radius: var(--radius-md);
12
+ background: var(--bg-secondary);
13
+ color: var(--text-primary);
14
+ font: inherit;
15
+ font-size: 0.8125rem;
16
+ cursor: pointer;
17
+ transition: border-color 150ms ease, box-shadow 150ms ease;
18
+ }
19
+
20
+ .mint-searchable-select--sm .mint-searchable-select__trigger { min-height: var(--form-height-sm); padding: 0.3rem 0.5rem; font-size: 0.75rem; }
21
+ .mint-searchable-select--lg .mint-searchable-select__trigger { min-height: var(--form-height-lg); padding: 0.75rem 1rem; font-size: 1rem; }
22
+ .mint-searchable-select__trigger:focus-visible { outline: none; border-color: transparent; box-shadow: var(--focus-ring); }
23
+ .mint-searchable-select__trigger:disabled { background: var(--bg-tertiary); cursor: not-allowed; opacity: var(--mint-disabled-opacity); }
24
+ .mint-searchable-select__trigger svg { width: 1rem; height: 1rem; flex: none; color: var(--text-muted); }
25
+ .mint-searchable-select__value { flex: 1; min-width: 0; overflow: hidden; text-align: left; text-overflow: ellipsis; white-space: nowrap; }
26
+ .mint-searchable-select__value--placeholder { color: var(--text-muted); }
27
+
28
+ .mint-searchable-select__panel {
29
+ position: absolute;
30
+ top: calc(100% + 0.25rem);
31
+ right: 0;
32
+ left: 0;
33
+ z-index: 30;
34
+ display: flex;
35
+ max-height: min(38rem, 80vh);
36
+ flex-direction: column;
37
+ overflow: hidden;
38
+ border: 1px solid var(--border-color);
39
+ border-radius: var(--radius-md);
40
+ background: var(--bg-card);
41
+ box-shadow: var(--shadow-lg);
42
+ }
43
+
44
+ .mint-searchable-select__search-wrap { position: relative; padding: 0.5rem; border-bottom: 1px solid var(--border-color); }
45
+ .mint-searchable-select__search-wrap svg { position: absolute; top: 50%; left: 1rem; width: 0.875rem; height: 0.875rem; color: var(--text-muted); transform: translateY(-50%); pointer-events: none; }
46
+ .mint-searchable-select__search { width: 100%; min-height: var(--form-height-sm); padding: 0.375rem 0.625rem 0.375rem 1.75rem; border: 1px solid var(--border-color); border-radius: var(--radius-md); background: var(--bg-primary); color: var(--text-primary); font: inherit; font-size: 0.8125rem; box-sizing: border-box; }
47
+ .mint-searchable-select__search:focus-visible { outline: none; border-color: transparent; box-shadow: var(--focus-ring); }
48
+ .mint-searchable-select__list { min-height: 0; margin: 0; padding: 0.25rem; overflow-y: auto; list-style: none; }
49
+ .mint-searchable-select__option { display: flex; align-items: center; gap: 0.5rem; padding: 0.375rem 0.5rem; border-radius: var(--radius-sm); color: var(--text-primary); cursor: pointer; }
50
+ .mint-searchable-select__option--active { background: var(--bg-tertiary); }
51
+ .mint-searchable-select__option--selected { background: var(--color-primary-soft); color: var(--text-primary); }
52
+ .mint-searchable-select__option--disabled { cursor: not-allowed; opacity: 0.5; }
53
+ .mint-searchable-select__option-text { display: flex; min-width: 0; flex: 1; flex-direction: column; }
54
+ .mint-searchable-select__option-label { overflow: hidden; font-size: 0.75rem; font-weight: 500; text-overflow: ellipsis; white-space: nowrap; }
55
+ .mint-searchable-select__option-description { font-size: 0.625rem; line-height: 1.35; color: var(--text-muted); }
56
+ .mint-searchable-select__option-meta { flex: none; padding: 0.0625rem 0.3125rem; border-radius: var(--radius-sm); background: var(--bg-secondary); color: var(--text-muted); font-family: var(--font-mono); font-size: 0.5625rem; letter-spacing: 0.04em; text-transform: uppercase; }
57
+ .mint-searchable-select__check { width: 1rem; height: 1rem; flex: none; }
58
+ .mint-searchable-select__empty { padding: 1rem; text-align: center; color: var(--text-muted); font-size: 0.75rem; }
59
+ .mint-searchable-select__footer { padding: 0.625rem; border-top: 1px solid var(--border-color); color: var(--text-secondary); font-size: 0.6875rem; }
60
+
61
+ @media (prefers-reduced-motion: reduce) {
62
+ .mint-searchable-select__trigger { transition: none; }
63
+ }
@@ -6,13 +6,17 @@
6
6
  overflow: hidden;
7
7
  }
8
8
 
9
- /* Card variant container - matches RFA design */
9
+ /* Card variant container - matches RFA design.
10
+ `width: fit-content` is load-bearing: `inline-grid` alone gets blockified and
11
+ stretched when the control is a stretching flex/grid item. */
10
12
  .mint-segmented-control--card {
11
- display: grid;
13
+ display: inline-grid;
12
14
  grid-auto-flow: column;
13
15
  grid-auto-columns: 1fr;
14
- gap: 0.25rem;
15
- padding: 0.25rem;
16
+ width: fit-content;
17
+ max-width: 100%;
18
+ gap: 0.1875rem;
19
+ padding: 0.1875rem;
16
20
  border-radius: var(--radius-md);
17
21
  background-color: var(--bg-tertiary);
18
22
  overflow: visible;
@@ -24,6 +28,7 @@
24
28
  }
25
29
 
26
30
  .mint-segmented-control--card.mint-segmented-control--full-width {
31
+ display: grid;
27
32
  width: 100%;
28
33
  }
29
34
 
@@ -95,8 +100,8 @@
95
100
  /* Card variant - matches RFA raised card design */
96
101
  .mint-segmented-control__option--card {
97
102
  flex: 1;
98
- padding: 0.75rem 1rem;
99
- gap: 0.25rem;
103
+ padding: 0.5rem 0.75rem;
104
+ gap: 0.0625rem;
100
105
  border: none;
101
106
  border-radius: var(--radius);
102
107
  background-color: transparent;
@@ -111,7 +116,7 @@
111
116
  .mint-segmented-control__option--card.mint-segmented-control__option--active {
112
117
  background-color: var(--bg-card);
113
118
  color: var(--text-primary);
114
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
119
+ box-shadow: var(--shadow-sm);
115
120
  }
116
121
 
117
122
  /* Size variants - simple */
@@ -135,15 +140,15 @@
135
140
 
136
141
  /* Size variants - card */
137
142
  .mint-segmented-control__option--card.mint-segmented-control__option--sm {
138
- padding: 0.5rem 0.75rem;
143
+ padding: 0.3125rem 0.625rem;
139
144
  }
140
145
 
141
146
  .mint-segmented-control__option--card.mint-segmented-control__option--md {
142
- padding: 0.75rem 1rem;
147
+ padding: 0.5rem 0.75rem;
143
148
  }
144
149
 
145
150
  .mint-segmented-control__option--card.mint-segmented-control__option--lg {
146
- padding: 1rem 1.25rem;
151
+ padding: 0.75rem 1rem;
147
152
  }
148
153
 
149
154
  /* Label */
@@ -174,7 +179,7 @@
174
179
 
175
180
  /* Description color in active state - use text-muted for card variant, primary for simple */
176
181
  .mint-segmented-control__option--simple.mint-segmented-control__option--active .mint-segmented-control__description {
177
- color: rgba(255, 255, 255, 0.8);
182
+ color: color-mix(in srgb, white 80%, transparent);
178
183
  }
179
184
 
180
185
  .mint-segmented-control__option--card.mint-segmented-control__option--active .mint-segmented-control__description {