@morscherlab/mint-sdk 1.2.0-beta.9 → 1.2.1

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 (215) hide show
  1. package/README.md +30 -0
  2. package/dist/{ExperimentPopover-oL0fg_A0.js → ExperimentPopover-CJdNlCZb.js} +21 -14
  3. package/dist/ExperimentPopover-CJdNlCZb.js.map +1 -0
  4. package/dist/{ExperimentSelectorModal-BeEOomw_.js → ExperimentSelectorModal-DHE9k8TP.js} +5 -5
  5. package/dist/{ExperimentSelectorModal-BeEOomw_.js.map → ExperimentSelectorModal-DHE9k8TP.js.map} +1 -1
  6. package/dist/{SettingsModal-Dphh3RrI.js → SettingsModal-DOcCf0Vo.js} +41 -18
  7. package/dist/SettingsModal-DOcCf0Vo.js.map +1 -0
  8. package/dist/{Skeleton-DxtwJ5gt.js → Skeleton-jhF9wUkU.js} +19 -9
  9. package/dist/Skeleton-jhF9wUkU.js.map +1 -0
  10. package/dist/__tests__/apiErrors.test.d.ts +1 -0
  11. package/dist/__tests__/components/FileBrowserModal.test.d.ts +1 -0
  12. package/dist/__tests__/components/FilePicker.state.test.d.ts +1 -0
  13. package/dist/__tests__/components/FilePicker.test.d.ts +1 -0
  14. package/dist/__tests__/components/FormField.test.d.ts +1 -0
  15. package/dist/__tests__/components/NumberInput.test.d.ts +1 -0
  16. package/dist/__tests__/components/PlotlyChart.test.d.ts +1 -0
  17. package/dist/__tests__/components/iconButtonIconSizing.test.d.ts +1 -0
  18. package/dist/__tests__/composables/localFiles.test.d.ts +1 -0
  19. package/dist/__tests__/composables/useFileBrowser.test.d.ts +1 -0
  20. package/dist/__tests__/composables/usePickerSelection.test.d.ts +1 -0
  21. package/dist/__tests__/composables/usePlatformFilePickerAdapter.test.d.ts +1 -0
  22. package/dist/__tests__/styles/tokenOnlyColors.test.d.ts +1 -0
  23. package/dist/apiErrors.d.ts +26 -0
  24. package/dist/components/AppSidebar.vue.d.ts +7 -7
  25. package/dist/components/BaseInput.vue.d.ts +1 -1
  26. package/dist/components/BasePill.vue.d.ts +3 -0
  27. package/dist/components/BaseSelect.vue.d.ts +1 -1
  28. package/dist/components/BaseTabs.vue.d.ts +1 -4
  29. package/dist/components/BaseTextarea.vue.d.ts +1 -1
  30. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +2 -2
  31. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +2 -2
  32. package/dist/components/ConcentrationInput.vue.d.ts +1 -1
  33. package/dist/components/DatePicker.vue.d.ts +1 -1
  34. package/dist/components/DateTimePicker.vue.d.ts +1 -1
  35. package/dist/components/FileBrowserModal.vue.d.ts +99 -0
  36. package/dist/components/FilePicker.vue.d.ts +32 -0
  37. package/dist/components/FileUploader.vue.d.ts +8 -2
  38. package/dist/components/FormField.vue.d.ts +8 -1
  39. package/dist/components/FormulaInput.vue.d.ts +1 -1
  40. package/dist/components/GeneratedPlotlyResult.vue.d.ts +1 -3
  41. package/dist/components/MobileSupportGate.vue.d.ts +1 -1
  42. package/dist/components/MoleculeInput.vue.d.ts +1 -1
  43. package/dist/components/NumberInput.vue.d.ts +1 -1
  44. package/dist/components/PlotlyChart.vue.d.ts +59 -0
  45. package/dist/components/PluginWorkspaceView.props.d.ts +3 -3
  46. package/dist/components/ResourceCard.vue.d.ts +1 -1
  47. package/dist/components/SecretInput.vue.d.ts +1 -1
  48. package/dist/components/SequenceInput.vue.d.ts +1 -1
  49. package/dist/components/StatusIndicator.vue.d.ts +1 -1
  50. package/dist/components/TagsInput.vue.d.ts +1 -1
  51. package/dist/components/TimePicker.vue.d.ts +1 -1
  52. package/dist/components/TimeRangeInput.vue.d.ts +1 -1
  53. package/dist/components/UnitInput.vue.d.ts +1 -1
  54. package/dist/components/WellPlate.vue.d.ts +1 -1
  55. package/dist/components/fileBrowserPresentation.d.ts +10 -0
  56. package/dist/components/index.d.ts +4 -0
  57. package/dist/components/index.js +8 -8
  58. package/dist/components/internal/FileBrowserDialogInternal.vue.d.ts +34 -0
  59. package/dist/components/internal/FileBrowserListingInternal.vue.d.ts +25 -0
  60. package/dist/components/internal/FileBrowserToolbarInternal.vue.d.ts +26 -0
  61. package/dist/components/internal/FilePickerPreviewInternal.vue.d.ts +18 -0
  62. package/dist/components/internal/FilePickerTreeInternal.vue.d.ts +31 -0
  63. package/dist/{components-CgAUzF8F.js → components-Cp8DcNrU.js} +4363 -1730
  64. package/dist/components-Cp8DcNrU.js.map +1 -0
  65. package/dist/composables/filePicker/localFiles.d.ts +3 -0
  66. package/dist/composables/filePicker/usePickerNavigation.d.ts +96 -0
  67. package/dist/composables/filePicker/usePickerSelection.d.ts +31 -0
  68. package/dist/composables/filePicker/validation.d.ts +5 -0
  69. package/dist/composables/index.d.ts +2 -0
  70. package/dist/composables/index.js +10 -10
  71. package/dist/composables/pluginWorkspaceModel.d.ts +0 -3
  72. package/dist/composables/useApi.d.ts +14 -7
  73. package/dist/composables/useFileBrowser.d.ts +55 -0
  74. package/dist/composables/useFilePicker.d.ts +189 -0
  75. package/dist/composables/usePlatformFilePickerAdapter.d.ts +11 -0
  76. package/dist/composables/useToast.d.ts +22 -1
  77. package/dist/{composables-B_pia3hO.js → composables-D_4qqOlp.js} +300 -11
  78. package/dist/composables-D_4qqOlp.js.map +1 -0
  79. package/dist/{errors-_W0-LbA6.js → errors-BLuqMee5.js} +78 -15
  80. package/dist/errors-BLuqMee5.js.map +1 -0
  81. package/dist/{experiment-Cwl9AYxw.js → experiment-CVDRAnqp.js} +2 -2
  82. package/dist/{experiment-Cwl9AYxw.js.map → experiment-CVDRAnqp.js.map} +1 -1
  83. package/dist/{experiment-utils-DV3DrvE_.js → experiment-utils-CV2Wza3z.js} +1 -1
  84. package/dist/{experiment-utils-DV3DrvE_.js.map → experiment-utils-CV2Wza3z.js.map} +1 -1
  85. package/dist/index.d.ts +1 -0
  86. package/dist/index.js +15 -15
  87. package/dist/install.js +2 -2
  88. package/dist/stores/index.js +2 -2
  89. package/dist/styles.css +2957 -1708
  90. package/dist/templates/index.js +2 -2
  91. package/dist/{templates-Qq113pyZ.js → templates-Dd9bBSs6.js} +2 -2
  92. package/dist/{templates-Qq113pyZ.js.map → templates-Dd9bBSs6.js.map} +1 -1
  93. package/dist/types/components.d.ts +21 -0
  94. package/dist/types/fileBrowserTypes.d.ts +77 -0
  95. package/dist/types/filePicker.d.ts +77 -0
  96. package/dist/types/form-builder.d.ts +2 -0
  97. package/dist/types/generated-ui.d.ts +2 -0
  98. package/dist/types/index.d.ts +3 -1
  99. package/dist/{useControlSchema-aMZlb4Sc.js → useControlSchema-BB2GRPhW.js} +190 -105
  100. package/dist/useControlSchema-BB2GRPhW.js.map +1 -0
  101. package/dist/{useDropdownState-DitCtrTT.js → useDropdownState-C7hRiVQf.js} +2 -2
  102. package/dist/{useDropdownState-DitCtrTT.js.map → useDropdownState-C7hRiVQf.js.map} +1 -1
  103. package/dist/{useExperimentSelector-I8HC8hUu.js → useExperimentSelector-G_CAOFTX.js} +4 -4
  104. package/dist/{useExperimentSelector-I8HC8hUu.js.map → useExperimentSelector-G_CAOFTX.js.map} +1 -1
  105. package/dist/{useFormBuilder-TCxNnqeb.js → useFormBuilder-BnGSdSRG.js} +2 -2
  106. package/dist/{useFormBuilder-TCxNnqeb.js.map → useFormBuilder-BnGSdSRG.js.map} +1 -1
  107. package/dist/{useProtocolTemplates-BmX_iVBR.js → validation-CTxuzLIX.js} +70 -13
  108. package/dist/validation-CTxuzLIX.js.map +1 -0
  109. package/package.json +1 -1
  110. package/src/__tests__/apiErrors.test.ts +81 -0
  111. package/src/__tests__/components/AppSidebar.test.ts +84 -94
  112. package/src/__tests__/components/AppToastContainer.test.ts +55 -1
  113. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +0 -21
  114. package/src/__tests__/components/ControlWorkspaceView.test.ts +0 -2
  115. package/src/__tests__/components/DoseDesignWorkspaceView.test.ts +0 -2
  116. package/src/__tests__/components/ExperimentPopover.test.ts +30 -0
  117. package/src/__tests__/components/FileBrowserModal.test.ts +460 -0
  118. package/src/__tests__/components/FilePicker.state.test.ts +287 -0
  119. package/src/__tests__/components/FilePicker.test.ts +487 -0
  120. package/src/__tests__/components/FormBuilder.test.ts +26 -0
  121. package/src/__tests__/components/FormField.test.ts +26 -0
  122. package/src/__tests__/components/GeneratedPathInput.test.ts +18 -0
  123. package/src/__tests__/components/GeneratedPlotlyResult.test.ts +52 -5
  124. package/src/__tests__/components/NumberInput.test.ts +105 -0
  125. package/src/__tests__/components/PlotlyChart.test.ts +305 -0
  126. package/src/__tests__/components/PluginWorkspaceView.internal.test.ts +1 -2
  127. package/src/__tests__/components/PluginWorkspaceView.test.ts +1 -2
  128. package/src/__tests__/components/SegmentedControl.test.ts +19 -0
  129. package/src/__tests__/components/iconButtonIconSizing.test.ts +18 -0
  130. package/src/__tests__/composables/localFiles.test.ts +57 -0
  131. package/src/__tests__/composables/useApi.test.ts +92 -9
  132. package/src/__tests__/composables/useFileBrowser.test.ts +305 -0
  133. package/src/__tests__/composables/useGeneratedAnalysis.test.ts +7 -2
  134. package/src/__tests__/composables/usePickerSelection.test.ts +98 -0
  135. package/src/__tests__/composables/usePlatformFilePickerAdapter.test.ts +67 -0
  136. package/src/__tests__/composables/usePluginClient.test.ts +3 -0
  137. package/src/__tests__/generatedUi.test.ts +111 -0
  138. package/src/__tests__/styles/tokenOnlyColors.test.ts +16 -0
  139. package/src/apiErrors.ts +85 -0
  140. package/src/components/AppLayout.story.vue +1 -1
  141. package/src/components/AppSidebar.story.vue +7 -10
  142. package/src/components/AppSidebar.vue +178 -58
  143. package/src/components/AppToastContainer.vue +65 -23
  144. package/src/components/BasePill.story.vue +2 -0
  145. package/src/components/BasePill.vue +4 -0
  146. package/src/components/BaseTabs.story.vue +0 -42
  147. package/src/components/BaseTabs.vue +3 -6
  148. package/src/components/ExperimentPopover.vue +10 -2
  149. package/src/components/FileBrowserModal.story.vue +203 -0
  150. package/src/components/FileBrowserModal.vue +384 -0
  151. package/src/components/FilePicker.story.vue +44 -0
  152. package/src/components/FilePicker.vue +284 -0
  153. package/src/components/FileUploader.vue +42 -15
  154. package/src/components/FormField.vue +10 -3
  155. package/src/components/GeneratedPathInput.vue +11 -7
  156. package/src/components/GeneratedPlotlyResult.vue +34 -69
  157. package/src/components/GeneratedResultRenderer.vue +0 -5
  158. package/src/components/NumberInput.story.vue +32 -13
  159. package/src/components/NumberInput.vue +116 -55
  160. package/src/components/PlotlyChart.story.vue +61 -0
  161. package/src/components/PlotlyChart.vue +233 -0
  162. package/src/components/PluginWorkspaceView.props.ts +3 -3
  163. package/src/components/SegmentedControl.vue +2 -2
  164. package/src/components/fileBrowserPresentation.ts +39 -0
  165. package/src/components/index.ts +5 -0
  166. package/src/components/internal/FileBrowserDialogInternal.vue +75 -0
  167. package/src/components/internal/FileBrowserListingInternal.vue +197 -0
  168. package/src/components/internal/FileBrowserToolbarInternal.vue +136 -0
  169. package/src/components/internal/FilePickerPreviewInternal.vue +100 -0
  170. package/src/components/internal/FilePickerTreeInternal.vue +238 -0
  171. package/src/components/internal/FormFieldRendererInternal.vue +17 -0
  172. package/src/components/internal/WorkspaceSidebarInternal.vue +1 -2
  173. package/src/composables/filePicker/localFiles.ts +65 -0
  174. package/src/composables/filePicker/usePickerNavigation.ts +220 -0
  175. package/src/composables/filePicker/usePickerSelection.ts +270 -0
  176. package/src/composables/filePicker/validation.ts +41 -0
  177. package/src/composables/index.ts +7 -0
  178. package/src/composables/pluginWorkspaceModel.ts +0 -3
  179. package/src/composables/useApi.ts +57 -13
  180. package/src/composables/useFileBrowser.ts +314 -0
  181. package/src/composables/useFilePicker.ts +366 -0
  182. package/src/composables/useGeneratedAnalysis.ts +10 -17
  183. package/src/composables/usePlatformFilePickerAdapter.ts +104 -0
  184. package/src/composables/usePluginClient.ts +3 -0
  185. package/src/composables/usePluginWorkspace.ts +1 -2
  186. package/src/composables/useToast.ts +21 -5
  187. package/src/generated/schema.ts +58 -18
  188. package/src/index.ts +3 -0
  189. package/src/styles/components/app-sidebar.css +282 -121
  190. package/src/styles/components/file-browser-modal.css +489 -0
  191. package/src/styles/components/file-picker.css +502 -0
  192. package/src/styles/components/form-builder.css +1 -1
  193. package/src/styles/components/form-field.css +28 -0
  194. package/src/styles/components/icon-button.css +9 -0
  195. package/src/styles/components/number-input.css +73 -91
  196. package/src/styles/components/pill.css +49 -51
  197. package/src/styles/components/segmented-control.css +16 -11
  198. package/src/styles/components/tabs.css +18 -34
  199. package/src/styles/components/toast.css +136 -27
  200. package/src/styles/index.css +3 -0
  201. package/src/styles/variables.css +25 -5
  202. package/src/types/components.ts +23 -0
  203. package/src/types/fileBrowserTypes.ts +85 -0
  204. package/src/types/filePicker.ts +72 -0
  205. package/src/types/form-builder.ts +2 -0
  206. package/src/types/generated-ui.ts +2 -0
  207. package/src/types/index.ts +16 -0
  208. package/dist/ExperimentPopover-oL0fg_A0.js.map +0 -1
  209. package/dist/SettingsModal-Dphh3RrI.js.map +0 -1
  210. package/dist/Skeleton-DxtwJ5gt.js.map +0 -1
  211. package/dist/components-CgAUzF8F.js.map +0 -1
  212. package/dist/composables-B_pia3hO.js.map +0 -1
  213. package/dist/errors-_W0-LbA6.js.map +0 -1
  214. package/dist/useControlSchema-aMZlb4Sc.js.map +0 -1
  215. package/dist/useProtocolTemplates-BmX_iVBR.js.map +0 -1
@@ -18,6 +18,8 @@
18
18
  border-left: 1px solid var(--border-color);
19
19
  }
20
20
 
21
+ /* Floating shell — the platform's layout language. Kept as-is; only the
22
+ nested per-section card inside it was removed. */
21
23
  .mint-sidebar--floating {
22
24
  position: absolute;
23
25
  top: 0;
@@ -41,27 +43,9 @@
41
43
  border-right: 1px solid var(--border-color);
42
44
  }
43
45
 
44
- .mint-sidebar--analysis {
45
- background-color: var(--bg-secondary);
46
- }
47
-
48
- .mint-sidebar--analysis .mint-sidebar__header {
49
- padding: 1rem;
50
- }
51
-
52
- .mint-sidebar--analysis .mint-sidebar__sections {
53
- padding: 0.75rem;
54
- gap: 0.75rem;
55
- }
56
-
57
- .mint-sidebar--analysis.mint-sidebar--dense .mint-sidebar__sections {
58
- padding: 0.75rem;
59
- gap: 0.75rem;
60
- }
61
-
62
46
  /* Header / Footer slots */
63
47
  .mint-sidebar__header {
64
- padding: 0.75rem;
48
+ padding: 0.625rem 0.875rem;
65
49
  flex-shrink: 0;
66
50
  display: flex;
67
51
  align-items: center;
@@ -70,6 +54,10 @@
70
54
  border-bottom: 1px solid var(--border-color);
71
55
  }
72
56
 
57
+ .mint-sidebar--comfortable .mint-sidebar__header {
58
+ padding: 0.875rem 1rem;
59
+ }
60
+
73
61
  .mint-sidebar__heading {
74
62
  min-width: 0;
75
63
  display: flex;
@@ -161,7 +149,7 @@
161
149
  }
162
150
 
163
151
  .mint-sidebar__footer {
164
- padding: 0.75rem;
152
+ padding: 0.625rem 0.875rem;
165
153
  flex-shrink: 0;
166
154
  border-top: 1px solid var(--border-color);
167
155
  }
@@ -171,12 +159,249 @@
171
159
  flex: 1 1 0;
172
160
  min-height: 0;
173
161
  overflow-y: auto;
174
- padding: 0.75rem;
175
162
  display: flex;
176
163
  flex-direction: column;
164
+ }
165
+
166
+ /* ---------- Flat section groups: header rows separated by one hairline ---------- */
167
+
168
+ .mint-sidebar__group {
169
+ flex-shrink: 0;
170
+ }
171
+
172
+ .mint-sidebar__group + .mint-sidebar__group {
173
+ border-top: 1px solid var(--border-light);
174
+ }
175
+
176
+ .mint-sidebar__group-head {
177
+ display: flex;
178
+ align-items: center;
179
+ transition: background-color 120ms ease;
180
+ }
181
+
182
+ .mint-sidebar__group-head:hover {
183
+ background: var(--bg-hover);
184
+ }
185
+
186
+ .mint-sidebar__group-toggle {
187
+ flex: 1;
188
+ min-width: 0;
189
+ display: flex;
190
+ align-items: center;
177
191
  gap: 0.5rem;
192
+ min-height: 2.25rem;
193
+ padding: 0.4375rem 0.5rem 0.4375rem 0.875rem;
194
+ border: 0;
195
+ background: transparent;
196
+ cursor: pointer;
197
+ text-align: left;
198
+ font-family: inherit;
199
+ }
200
+
201
+ .mint-sidebar__group-toggle:focus-visible {
202
+ outline: none;
203
+ box-shadow: inset var(--focus-ring-soft);
204
+ }
205
+
206
+ .mint-sidebar__group-icon {
207
+ display: flex;
208
+ align-items: center;
209
+ justify-content: center;
210
+ flex-shrink: 0;
211
+ width: 1.25rem;
212
+ height: 1.25rem;
213
+ border-radius: 0.3125rem;
214
+ }
215
+
216
+ .mint-sidebar__group-svg {
217
+ width: 0.75rem;
218
+ height: 0.75rem;
219
+ }
220
+
221
+ .mint-sidebar__group-text-icon {
222
+ font-size: 0.75rem;
223
+ line-height: 1;
224
+ }
225
+
226
+ .mint-sidebar__group-copy {
227
+ flex: 1;
228
+ min-width: 0;
229
+ display: flex;
230
+ align-items: baseline;
231
+ gap: 0.4375rem;
232
+ }
233
+
234
+ .mint-sidebar__group-label {
235
+ flex: 0 1 auto;
236
+ min-width: max-content;
237
+ overflow: hidden;
238
+ color: var(--text-primary);
239
+ font-size: 0.8125rem;
240
+ font-weight: 600;
241
+ line-height: 1.3;
242
+ white-space: nowrap;
243
+ text-overflow: ellipsis;
244
+ transition: color 120ms ease;
245
+ }
246
+
247
+ .mint-sidebar__group--closed .mint-sidebar__group-label {
248
+ color: var(--text-secondary);
249
+ }
250
+
251
+ /* Subtitle carries file names and parameter values, not prose: mono, and the
252
+ disposable half when the row truncates. */
253
+ .mint-sidebar__group-subtitle {
254
+ flex-shrink: 1;
255
+ min-width: 0;
256
+ overflow: hidden;
257
+ color: var(--text-muted);
258
+ font-family: var(--font-mono);
259
+ font-size: 0.6875rem;
260
+ line-height: 1.3;
261
+ white-space: nowrap;
262
+ text-overflow: ellipsis;
263
+ }
264
+
265
+ .mint-sidebar__group-tail {
266
+ display: flex;
267
+ align-items: center;
268
+ flex-shrink: 0;
269
+ gap: 0.375rem;
270
+ padding-right: 0.625rem;
271
+ }
272
+
273
+ .mint-sidebar__tag {
274
+ display: inline-flex;
275
+ align-items: center;
276
+ justify-content: center;
277
+ min-width: 1.125rem;
278
+ height: 1rem;
279
+ padding: 0 0.25rem;
280
+ border-radius: 0.1875rem;
281
+ background: color-mix(in srgb, var(--mint-sidebar-tone) 14%, transparent);
282
+ color: var(--mint-sidebar-tone);
283
+ font-family: var(--font-mono);
284
+ font-size: 0.625rem;
285
+ font-weight: 600;
286
+ line-height: 1;
287
+ font-variant-numeric: tabular-nums;
288
+ }
289
+
290
+ .mint-sidebar__group-action,
291
+ .mint-sidebar__chevron-button {
292
+ display: inline-flex;
293
+ align-items: center;
294
+ justify-content: center;
295
+ width: 1.25rem;
296
+ height: 1.25rem;
297
+ padding: 0;
298
+ border: 0;
299
+ border-radius: var(--radius-sm);
300
+ background: transparent;
301
+ color: var(--text-muted);
302
+ cursor: pointer;
303
+ transition: color 120ms ease, background-color 120ms ease;
304
+ }
305
+
306
+ .mint-sidebar__group-action {
307
+ color: var(--mint-sidebar-tone, var(--text-secondary));
308
+ }
309
+
310
+ .mint-sidebar__group-action:hover:not(:disabled),
311
+ .mint-sidebar__chevron-button:hover:not(:disabled) {
312
+ color: var(--text-primary);
313
+ background: var(--bg-tertiary);
314
+ }
315
+
316
+ .mint-sidebar__group-action:focus-visible,
317
+ .mint-sidebar__chevron-button:focus-visible {
318
+ outline: none;
319
+ box-shadow: var(--focus-ring);
320
+ }
321
+
322
+ .mint-sidebar__group-action:disabled {
323
+ opacity: var(--mint-disabled-opacity);
324
+ cursor: not-allowed;
325
+ }
326
+
327
+ .mint-sidebar__group-action-icon,
328
+ .mint-sidebar__chevron {
329
+ width: 0.75rem;
330
+ height: 0.75rem;
331
+ }
332
+
333
+ .mint-sidebar__chevron {
334
+ transition: transform 180ms var(--mint-ease-out-quart);
335
+ }
336
+
337
+ .mint-sidebar__chevron--open {
338
+ transform: rotate(180deg);
339
+ }
340
+
341
+ /* Inline enable switch: 26×15 track, 11px knob. */
342
+ .mint-sidebar__switch {
343
+ position: relative;
344
+ display: inline-block;
345
+ flex-shrink: 0;
346
+ width: 26px;
347
+ height: 15px;
348
+ padding: 0;
349
+ border: 0;
350
+ border-radius: 9999px;
351
+ background: var(--bg-tertiary);
352
+ cursor: pointer;
353
+ transition: background-color 150ms ease;
354
+ }
355
+
356
+ .mint-sidebar__switch--on {
357
+ background: var(--color-primary);
358
+ }
359
+
360
+ .mint-sidebar__switch:focus-visible {
361
+ outline: none;
362
+ box-shadow: var(--focus-ring-offset);
363
+ }
364
+
365
+ .mint-sidebar__switch-knob {
366
+ position: absolute;
367
+ top: 2px;
368
+ left: 2px;
369
+ width: 11px;
370
+ height: 11px;
371
+ border-radius: 9999px;
372
+ background: white;
373
+ box-shadow: var(--shadow-sm);
374
+ transition: left 180ms var(--mint-ease-out-quart);
375
+ }
376
+
377
+ .mint-sidebar__switch--on .mint-sidebar__switch-knob {
378
+ left: 13px;
379
+ }
380
+
381
+ .mint-sidebar__group-body {
382
+ display: flex;
383
+ flex-direction: column;
384
+ gap: 0.625rem;
385
+ padding: 0.125rem 0.875rem 0.75rem;
386
+ }
387
+
388
+ /* Comfortable density: the old roomier spacing as an opt-in. */
389
+ .mint-sidebar--comfortable .mint-sidebar__group-toggle {
390
+ min-height: 2.625rem;
391
+ padding: 0.625rem 0.5rem 0.625rem 1rem;
392
+ }
393
+
394
+ .mint-sidebar--comfortable .mint-sidebar__group-tail {
395
+ padding-right: 0.75rem;
396
+ }
397
+
398
+ .mint-sidebar--comfortable .mint-sidebar__group-body {
399
+ gap: 0.875rem;
400
+ padding: 0.25rem 1rem 1rem;
178
401
  }
179
402
 
403
+ /* ---------- Collapsed rail ---------- */
404
+
180
405
  .mint-sidebar__collapsed {
181
406
  flex: 1 1 0;
182
407
  min-height: 0;
@@ -251,7 +476,7 @@
251
476
  height: 1rem;
252
477
  padding: 0 0.25rem;
253
478
  border-radius: 9999px;
254
- background: var(--mint-sidebar-rail-badge-color);
479
+ background: var(--mint-sidebar-tone);
255
480
  color: white;
256
481
  font-size: 0.625rem;
257
482
  font-weight: 700;
@@ -260,118 +485,51 @@
260
485
  font-variant-numeric: tabular-nums;
261
486
  }
262
487
 
263
- .mint-sidebar__rail-badge--primary {
264
- --mint-sidebar-rail-badge-color: var(--color-primary);
265
- }
266
-
267
- .mint-sidebar__rail-badge--cta {
268
- --mint-sidebar-rail-badge-color: var(--color-cta);
269
- }
270
-
271
- .mint-sidebar__rail-badge--success {
272
- --mint-sidebar-rail-badge-color: var(--mint-success);
273
- }
274
-
275
- .mint-sidebar__rail-badge--warning {
276
- --mint-sidebar-rail-badge-color: var(--mint-warning);
277
- }
278
-
279
- .mint-sidebar__rail-badge--error {
280
- --mint-sidebar-rail-badge-color: var(--mint-error);
281
- }
282
-
283
- .mint-sidebar__rail-badge--info {
284
- --mint-sidebar-rail-badge-color: var(--mint-info);
285
- }
286
-
287
- .mint-sidebar__rail-badge--neutral {
288
- --mint-sidebar-rail-badge-color: var(--text-secondary);
289
- }
290
-
291
- /* Dense sidebar variant — compact sections */
292
- .mint-sidebar--dense .mint-sidebar__sections {
293
- padding: 0.5rem;
294
- gap: 0.375rem;
295
- }
296
-
297
- .mint-sidebar--dense .mint-sidebar__sections > .mint-collapsible-card {
298
- box-shadow: none;
299
- border-color: var(--border-light);
300
- }
301
-
302
- /* CollapsibleCard appearance inside sidebar */
303
- .mint-sidebar__sections > .mint-collapsible-card {
304
- flex-shrink: 0;
305
- border: 1px solid var(--border-light);
306
- border-radius: var(--radius-md);
307
- background-color: var(--bg-card);
308
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
309
- }
310
-
311
- .mint-sidebar--analysis .mint-sidebar__sections > .mint-collapsible-card {
312
- border-color: var(--border-color);
313
- border-radius: var(--radius-lg);
488
+ /* Semantic tones shared by the rail badge, the inline tag and section actions. */
489
+ .mint-sidebar__rail-badge--primary,
490
+ .mint-sidebar__tag--primary,
491
+ .mint-sidebar__group-action--primary {
492
+ --mint-sidebar-tone: var(--color-primary);
314
493
  }
315
494
 
316
- .mint-sidebar__sections > .mint-collapsible-card .mint-collapsible-card__header {
317
- padding: 0.625rem 0.75rem;
318
- min-height: auto;
495
+ .mint-sidebar__rail-badge--cta,
496
+ .mint-sidebar__tag--cta,
497
+ .mint-sidebar__group-action--cta {
498
+ --mint-sidebar-tone: var(--color-cta);
319
499
  }
320
500
 
321
- .mint-sidebar__sections > .mint-collapsible-card .mint-collapsible-card__icon-badge {
322
- width: 1.75rem;
323
- height: 1.75rem;
324
- border-radius: var(--radius-md);
501
+ .mint-sidebar__rail-badge--success,
502
+ .mint-sidebar__tag--success,
503
+ .mint-sidebar__group-action--success {
504
+ --mint-sidebar-tone: var(--mint-success);
325
505
  }
326
506
 
327
- .mint-sidebar__sections > .mint-collapsible-card .mint-collapsible-card__icon {
328
- width: 0.9375rem;
329
- height: 0.9375rem;
507
+ .mint-sidebar__rail-badge--warning,
508
+ .mint-sidebar__tag--warning,
509
+ .mint-sidebar__group-action--warning {
510
+ --mint-sidebar-tone: var(--mint-warning);
330
511
  }
331
512
 
332
- .mint-sidebar__sections > .mint-collapsible-card .mint-collapsible-card__icon-text {
333
- font-size: 0.9375rem;
513
+ .mint-sidebar__tag--warning {
514
+ color: var(--mint-warning-text);
334
515
  }
335
516
 
336
- .mint-sidebar__sections > .mint-collapsible-card .mint-collapsible-card__title {
337
- font-size: 0.875rem;
338
- font-weight: 600;
339
- color: var(--text-primary);
340
- }
341
-
342
- .mint-sidebar__sections > .mint-collapsible-card .mint-collapsible-card__subtitle {
343
- font-size: 0.75rem;
344
- color: var(--text-muted);
517
+ .mint-sidebar__rail-badge--error,
518
+ .mint-sidebar__tag--error,
519
+ .mint-sidebar__group-action--error {
520
+ --mint-sidebar-tone: var(--mint-error);
345
521
  }
346
522
 
347
- .mint-sidebar__sections > .mint-collapsible-card .mint-collapsible-card__chevron {
348
- width: 0.875rem;
349
- height: 0.875rem;
523
+ .mint-sidebar__rail-badge--info,
524
+ .mint-sidebar__tag--info,
525
+ .mint-sidebar__group-action--info {
526
+ --mint-sidebar-tone: var(--mint-info);
350
527
  }
351
528
 
352
- .mint-sidebar__sections > .mint-collapsible-card .mint-collapsible-card__toggle-track {
353
- width: 1.75rem;
354
- height: 1rem;
355
- }
356
-
357
- /* Scaled-down knob: 12px circle inside a 28px track. Must also override the
358
- base `--on` left position (1.125rem = 18px, calibrated for the 36px track)
359
- because otherwise the knob overflows the narrower track. */
360
- .mint-sidebar__sections > .mint-collapsible-card .mint-collapsible-card__toggle-knob {
361
- width: 0.75rem;
362
- height: 0.75rem;
363
- margin-top: -0.375rem;
364
- }
365
-
366
- .mint-sidebar__sections > .mint-collapsible-card .mint-collapsible-card__toggle-knob--on {
367
- left: 0.875rem;
368
- }
369
-
370
- .mint-sidebar__sections > .mint-collapsible-card .mint-collapsible-card__content {
371
- padding: 0.75rem;
372
- display: flex;
373
- flex-direction: column;
374
- gap: 0.75rem;
529
+ .mint-sidebar__rail-badge--neutral,
530
+ .mint-sidebar__tag--neutral,
531
+ .mint-sidebar__group-action--neutral {
532
+ --mint-sidebar-tone: var(--text-secondary);
375
533
  }
376
534
 
377
535
  .mint-sidebar__footer--collapsed {
@@ -381,7 +539,10 @@
381
539
  @media (prefers-reduced-motion: reduce) {
382
540
  .mint-sidebar,
383
541
  .mint-sidebar__rail-item,
384
- .mint-sidebar__rail-icon {
542
+ .mint-sidebar__rail-icon,
543
+ .mint-sidebar__chevron,
544
+ .mint-sidebar__switch,
545
+ .mint-sidebar__switch-knob {
385
546
  transition: none;
386
547
  }
387
548