@morscherlab/mint-sdk 1.0.0-rc.4 → 1.0.0-rc.6

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 (324) hide show
  1. package/dist/__tests__/components/AppTopBar.navigation.test.d.ts +1 -0
  2. package/dist/__tests__/components/DoseCalculatorVolumeField.test.d.ts +1 -0
  3. package/dist/__tests__/components/PlateMapEditorToolbarInternal.test.d.ts +1 -0
  4. package/dist/__tests__/components/PluginWorkspaceView.controls.test.d.ts +1 -0
  5. package/dist/__tests__/components/PluginWorkspaceView.navigation.test.d.ts +1 -0
  6. package/dist/__tests__/components/PluginWorkspaceView.shell.test.d.ts +1 -0
  7. package/dist/__tests__/components/ProtocolStep.presentation.test.d.ts +1 -0
  8. package/dist/__tests__/components/ProtocolStepEditor.state.test.d.ts +1 -0
  9. package/dist/__tests__/components/ProtocolStepParameterField.test.d.ts +1 -0
  10. package/dist/__tests__/components/ReagentList.presentation.test.d.ts +1 -0
  11. package/dist/__tests__/components/SampleSelector.colors.test.d.ts +1 -0
  12. package/dist/__tests__/components/SampleSelector.drag.test.d.ts +1 -0
  13. package/dist/__tests__/components/SampleSelector.groups.test.d.ts +1 -0
  14. package/dist/__tests__/components/SampleSelector.selection.test.d.ts +1 -0
  15. package/dist/__tests__/components/SampleSelectorSampleRow.test.d.ts +1 -0
  16. package/dist/__tests__/components/ScheduleCalendar.test.d.ts +1 -0
  17. package/dist/__tests__/components/SettingsModal.schema.test.d.ts +1 -0
  18. package/dist/__tests__/components/WellPlate.colors.test.d.ts +1 -0
  19. package/dist/__tests__/components/WellPlate.conditions.test.d.ts +1 -0
  20. package/dist/__tests__/components/WellPlate.geometry.test.d.ts +1 -0
  21. package/dist/__tests__/components/WellPlate.interaction.test.d.ts +1 -0
  22. package/dist/__tests__/components/WellPlate.legend.test.d.ts +1 -0
  23. package/dist/__tests__/components/WellPlate.rendering.test.d.ts +1 -0
  24. package/dist/__tests__/components/WellPlate.sampleDrop.test.d.ts +1 -0
  25. package/dist/__tests__/composables/autoGroup/classify.test.d.ts +1 -0
  26. package/dist/__tests__/composables/autoGroup/columns.test.d.ts +1 -0
  27. package/dist/__tests__/composables/autoGroup/compose.test.d.ts +1 -0
  28. package/dist/__tests__/composables/autoGroup/cooccurrence.test.d.ts +1 -0
  29. package/dist/__tests__/composables/autoGroup/fingerprint.test.d.ts +1 -0
  30. package/dist/__tests__/composables/autoGroup/integration.test.d.ts +1 -0
  31. package/dist/__tests__/composables/autoGroup/template.test.d.ts +1 -0
  32. package/dist/__tests__/composables/autoGroup/tokenize.test.d.ts +1 -0
  33. package/dist/__tests__/composables/useAutoGroupInputSources.test.d.ts +1 -0
  34. package/dist/__tests__/composables/useScheduleCalendarLayout.test.d.ts +1 -0
  35. package/dist/__tests__/docs/extractDocsComponents.test.d.ts +1 -0
  36. package/dist/__tests__/docs/extractDocsExports.test.d.ts +1 -0
  37. package/dist/__tests__/docs/extractDocsParsing.test.d.ts +1 -0
  38. package/dist/__tests__/docs/extractDocsTemplates.test.d.ts +1 -0
  39. package/dist/__tests__/docs/extractDocsTheme.test.d.ts +1 -0
  40. package/dist/components/AppSidebar.vue.d.ts +9 -6
  41. package/dist/components/AppTopBar.navigation.d.ts +11 -0
  42. package/dist/components/BaseButton.vue.d.ts +1 -1
  43. package/dist/components/BaseCheckbox.vue.d.ts +7 -2
  44. package/dist/components/BaseInput.vue.d.ts +2 -2
  45. package/dist/components/BasePill.vue.d.ts +2 -2
  46. package/dist/components/BaseRadioGroup.vue.d.ts +2 -2
  47. package/dist/components/BaseSelect.vue.d.ts +1 -1
  48. package/dist/components/BaseSlider.vue.d.ts +2 -2
  49. package/dist/components/BaseTextarea.vue.d.ts +2 -2
  50. package/dist/components/BaseToggle.vue.d.ts +7 -2
  51. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +2 -2
  52. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +1 -1
  53. package/dist/components/CollapsibleCard.vue.d.ts +9 -0
  54. package/dist/components/ColorSlider.vue.d.ts +2 -2
  55. package/dist/components/ConcentrationInput.vue.d.ts +2 -2
  56. package/dist/components/ControlWorkspaceView.vue.d.ts +4 -4
  57. package/dist/components/DatePicker.vue.d.ts +1 -1
  58. package/dist/components/DateTimePicker.vue.d.ts +2 -2
  59. package/dist/components/DoseCalculatorVolumeField.vue.d.ts +15 -0
  60. package/dist/components/DoseDesignWorkspaceView.vue.d.ts +2 -2
  61. package/dist/components/DropdownButton.vue.d.ts +1 -1
  62. package/dist/components/FileUploader.vue.d.ts +2 -2
  63. package/dist/components/FormulaInput.vue.d.ts +2 -2
  64. package/dist/components/IconButton.vue.d.ts +1 -1
  65. package/dist/components/LoadingSpinner.vue.d.ts +1 -1
  66. package/dist/components/MoleculeInput.vue.d.ts +2 -2
  67. package/dist/components/MultiSelect.vue.d.ts +1 -1
  68. package/dist/components/NumberInput.vue.d.ts +1 -1
  69. package/dist/components/PlateMapEditor.vue.d.ts +6 -6
  70. package/dist/components/PluginWorkspaceView.controls.d.ts +28 -0
  71. package/dist/components/PluginWorkspaceView.navigation.d.ts +29 -0
  72. package/dist/components/PluginWorkspaceView.props.d.ts +151 -0
  73. package/dist/components/PluginWorkspaceView.shell.d.ts +19 -0
  74. package/dist/components/PluginWorkspaceView.vue.d.ts +51 -196
  75. package/dist/components/ProgressBar.vue.d.ts +1 -1
  76. package/dist/components/ProtocolStep.presentation.d.ts +4 -0
  77. package/dist/components/ProtocolStepEditor.state.d.ts +18 -0
  78. package/dist/components/ProtocolStepParameterField.vue.d.ts +12 -0
  79. package/dist/components/ReagentList.presentation.d.ts +16 -0
  80. package/dist/components/ResourceCard.vue.d.ts +1 -1
  81. package/dist/components/SampleSelector.colors.d.ts +13 -0
  82. package/dist/components/SampleSelector.drag.d.ts +24 -0
  83. package/dist/components/SampleSelector.groups.d.ts +15 -0
  84. package/dist/components/SampleSelector.selection.d.ts +26 -0
  85. package/dist/components/SampleSelector.vue.d.ts +4 -1
  86. package/dist/components/SampleSelectorSampleRow.vue.d.ts +21 -0
  87. package/dist/components/SegmentedControl.vue.d.ts +1 -1
  88. package/dist/components/SequenceInput.vue.d.ts +2 -2
  89. package/dist/components/SequenceProgressBar.vue.d.ts +1 -1
  90. package/dist/components/SettingsModal.schema.d.ts +9 -0
  91. package/dist/components/StatusIndicator.vue.d.ts +1 -1
  92. package/dist/components/TagsInput.vue.d.ts +2 -2
  93. package/dist/components/TimePicker.vue.d.ts +2 -2
  94. package/dist/components/TimeRangeInput.vue.d.ts +1 -1
  95. package/dist/components/UnitInput.vue.d.ts +2 -2
  96. package/dist/components/WellPlate.colors.d.ts +9 -0
  97. package/dist/components/WellPlate.conditions.d.ts +26 -0
  98. package/dist/components/WellPlate.geometry.d.ts +23 -0
  99. package/dist/components/WellPlate.interaction.d.ts +71 -0
  100. package/dist/components/WellPlate.legend.d.ts +2 -0
  101. package/dist/components/WellPlate.rendering.d.ts +24 -0
  102. package/dist/components/WellPlate.sampleDrop.d.ts +8 -0
  103. package/dist/components/WellPlate.vue.d.ts +1 -1
  104. package/dist/components/index.js +2 -2
  105. package/dist/components/internal/ActionItemInternal.vue.d.ts +1 -1
  106. package/dist/components/internal/PlateMapEditorToolbarInternal.vue.d.ts +28 -0
  107. package/dist/{components-DafPc4rM.js → components-Blx4MG--.js} +4073 -4222
  108. package/dist/components-Blx4MG--.js.map +1 -0
  109. package/dist/composables/autoGroup/classKey.d.ts +4 -0
  110. package/dist/composables/autoGroup/classify.d.ts +28 -0
  111. package/dist/composables/autoGroup/colors.d.ts +2 -0
  112. package/dist/composables/autoGroup/columns.d.ts +10 -0
  113. package/dist/composables/autoGroup/compose.d.ts +8 -0
  114. package/dist/composables/autoGroup/cooccurrence.d.ts +2 -0
  115. package/dist/composables/autoGroup/csv-shim.d.ts +2 -0
  116. package/dist/composables/autoGroup/fingerprint.d.ts +3 -0
  117. package/dist/composables/autoGroup/index.d.ts +16 -0
  118. package/dist/composables/autoGroup/replicatePreGroup.d.ts +38 -0
  119. package/dist/composables/autoGroup/template.d.ts +15 -0
  120. package/dist/composables/autoGroup/tokenize.d.ts +8 -0
  121. package/dist/composables/autoGroupConstants.d.ts +1 -0
  122. package/dist/composables/autoGroupGrouping.d.ts +3 -0
  123. package/dist/composables/controlComponentBindings.d.ts +1 -1
  124. package/dist/composables/controlSchemaAdapters.d.ts +1 -1
  125. package/dist/composables/controlSchemaDoseDesign.d.ts +11 -0
  126. package/dist/composables/controlSchemaLayout.d.ts +1 -1
  127. package/dist/composables/controlSchemaModel.d.ts +5 -0
  128. package/dist/composables/controlSchemaNormalize.d.ts +1 -1
  129. package/dist/composables/controlSchemaTypes.d.ts +311 -0
  130. package/dist/composables/controlWorkspaceOptions.d.ts +1 -1
  131. package/dist/composables/formBuilderSchema.d.ts +18 -0
  132. package/dist/composables/index.js +3 -3
  133. package/dist/composables/pluginEndpointBuilder.d.ts +13 -0
  134. package/dist/composables/protocolTemplateCatalog.d.ts +26 -0
  135. package/dist/composables/useAutoGroup.d.ts +61 -74
  136. package/dist/composables/useAutoGroupInputSources.d.ts +32 -0
  137. package/dist/composables/useBioTemplateControls.d.ts +1 -1
  138. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +1 -1
  139. package/dist/composables/useBioTemplateWorkspace.d.ts +1 -1
  140. package/dist/composables/useControlSchema.d.ts +4 -316
  141. package/dist/composables/useControlWorkspace.d.ts +1 -1
  142. package/dist/composables/useForm.d.ts +2 -33
  143. package/dist/composables/useFormBuilder.d.ts +2 -9
  144. package/dist/composables/useFormValidation.d.ts +34 -0
  145. package/dist/composables/usePluginClient.d.ts +1 -4
  146. package/dist/composables/useProtocolTemplates.d.ts +2 -24
  147. package/dist/composables/useScheduleCalendarLayout.d.ts +49 -0
  148. package/dist/{composables-BMkPQhVK.js → composables-CHDjDIQT.js} +33 -31
  149. package/dist/composables-CHDjDIQT.js.map +1 -0
  150. package/dist/index.js +4 -4
  151. package/dist/install.js +2 -2
  152. package/dist/styles.css +1432 -660
  153. package/dist/templates/controlSchemaTypes.d.ts +1 -1
  154. package/dist/templates/index.js +1 -1
  155. package/dist/templates/templateAdapterTypes.d.ts +48 -0
  156. package/dist/templates/templateCreateOptions.d.ts +165 -0
  157. package/dist/templates/templateQpcrTypes.d.ts +42 -0
  158. package/dist/templates/types.d.ts +5 -250
  159. package/dist/{templates-bUAWMn5L.js → templates-DSbHJC4v.js} +1536 -297
  160. package/dist/templates-DSbHJC4v.js.map +1 -0
  161. package/dist/types/auto-group.d.ts +79 -9
  162. package/dist/types/componentLabTypes.d.ts +161 -0
  163. package/dist/types/componentWorkflowTypes.d.ts +150 -0
  164. package/dist/types/components.d.ts +14 -311
  165. package/dist/types/form-builder.d.ts +3 -0
  166. package/dist/types/index.d.ts +1 -1
  167. package/dist/{useProtocolTemplates-QZtHFFH2.js → useProtocolTemplates-BbPOYPzO.js} +1220 -454
  168. package/dist/useProtocolTemplates-BbPOYPzO.js.map +1 -0
  169. package/package.json +1 -1
  170. package/src/__tests__/components/AppSidebar.test.ts +67 -0
  171. package/src/__tests__/components/AppTopBar.navigation.test.ts +70 -0
  172. package/src/__tests__/components/CollapsibleCard.test.ts +47 -0
  173. package/src/__tests__/components/DoseCalculatorVolumeField.test.ts +53 -0
  174. package/src/__tests__/components/FormBuilder.test.ts +57 -0
  175. package/src/__tests__/components/PlateMapEditorToolbarInternal.test.ts +54 -0
  176. package/src/__tests__/components/PluginWorkspaceView.controls.test.ts +156 -0
  177. package/src/__tests__/components/PluginWorkspaceView.navigation.test.ts +102 -0
  178. package/src/__tests__/components/PluginWorkspaceView.shell.test.ts +43 -0
  179. package/src/__tests__/components/ProtocolStep.presentation.test.ts +31 -0
  180. package/src/__tests__/components/ProtocolStepEditor.state.test.ts +165 -0
  181. package/src/__tests__/components/ProtocolStepParameterField.test.ts +44 -0
  182. package/src/__tests__/components/ReagentList.presentation.test.ts +68 -0
  183. package/src/__tests__/components/SampleSelector.colors.test.ts +49 -0
  184. package/src/__tests__/components/SampleSelector.drag.test.ts +100 -0
  185. package/src/__tests__/components/SampleSelector.groups.test.ts +81 -0
  186. package/src/__tests__/components/SampleSelector.selection.test.ts +70 -0
  187. package/src/__tests__/components/SampleSelector.test.ts +32 -0
  188. package/src/__tests__/components/SampleSelectorSampleRow.test.ts +37 -0
  189. package/src/__tests__/components/ScheduleCalendar.test.ts +44 -0
  190. package/src/__tests__/components/SettingsModal.schema.test.ts +97 -0
  191. package/src/__tests__/components/WellPlate.colors.test.ts +28 -0
  192. package/src/__tests__/components/WellPlate.conditions.test.ts +68 -0
  193. package/src/__tests__/components/WellPlate.geometry.test.ts +54 -0
  194. package/src/__tests__/components/WellPlate.interaction.test.ts +171 -0
  195. package/src/__tests__/components/WellPlate.legend.test.ts +13 -0
  196. package/src/__tests__/components/WellPlate.rendering.test.ts +122 -0
  197. package/src/__tests__/components/WellPlate.sampleDrop.test.ts +70 -0
  198. package/src/__tests__/composables/autoGroup/classify.test.ts +107 -0
  199. package/src/__tests__/composables/autoGroup/columns.test.ts +135 -0
  200. package/src/__tests__/composables/autoGroup/compose.test.ts +227 -0
  201. package/src/__tests__/composables/autoGroup/cooccurrence.test.ts +91 -0
  202. package/src/__tests__/composables/autoGroup/fingerprint.test.ts +50 -0
  203. package/src/__tests__/composables/autoGroup/integration.test.ts +79 -0
  204. package/src/__tests__/composables/autoGroup/template.test.ts +70 -0
  205. package/src/__tests__/composables/autoGroup/tokenize.test.ts +33 -0
  206. package/src/__tests__/composables/useAutoGroup.test.ts +129 -625
  207. package/src/__tests__/composables/useAutoGroupInputSources.test.ts +107 -0
  208. package/src/__tests__/composables/useControlSchema.test.ts +23 -0
  209. package/src/__tests__/composables/useScheduleCalendarLayout.test.ts +89 -0
  210. package/src/__tests__/docs/extractDocsComponents.test.ts +142 -0
  211. package/src/__tests__/docs/extractDocsExports.test.ts +77 -0
  212. package/src/__tests__/docs/extractDocsParsing.test.ts +69 -0
  213. package/src/__tests__/docs/extractDocsTemplates.test.ts +54 -0
  214. package/src/__tests__/docs/extractDocsTheme.test.ts +89 -0
  215. package/src/__tests__/docs/frontendDocsCatalog.test.ts +1 -1
  216. package/src/__tests__/fixtures/auto-group/mixed-lc-ms-batch.txt +187 -0
  217. package/src/components/AppSidebar.story.vue +79 -6
  218. package/src/components/AppSidebar.vue +74 -6
  219. package/src/components/AppTopBar.navigation.ts +62 -0
  220. package/src/components/AppTopBar.vue +17 -44
  221. package/src/components/AutoGroupModal.story.vue +50 -0
  222. package/src/components/AutoGroupModal.vue +441 -158
  223. package/src/components/BaseCheckbox.story.vue +27 -0
  224. package/src/components/BaseCheckbox.vue +63 -1
  225. package/src/components/BaseToggle.story.vue +27 -0
  226. package/src/components/BaseToggle.vue +66 -1
  227. package/src/components/CollapsibleCard.vue +123 -45
  228. package/src/components/ControlWorkspaceView.vue +2 -6
  229. package/src/components/DoseCalculator.vue +13 -73
  230. package/src/components/DoseCalculatorVolumeField.vue +61 -0
  231. package/src/components/ExperimentTimeline.vue +6 -31
  232. package/src/components/FormBuilder.story.vue +13 -0
  233. package/src/components/FormBuilder.vue +2 -7
  234. package/src/components/PlateMapEditor.vue +32 -106
  235. package/src/components/PluginWorkspaceView.controls.ts +182 -0
  236. package/src/components/PluginWorkspaceView.navigation.ts +106 -0
  237. package/src/components/PluginWorkspaceView.props.ts +174 -0
  238. package/src/components/PluginWorkspaceView.shell.ts +67 -0
  239. package/src/components/PluginWorkspaceView.vue +88 -404
  240. package/src/components/ProtocolStep.presentation.ts +31 -0
  241. package/src/components/ProtocolStepEditor.state.ts +104 -0
  242. package/src/components/ProtocolStepEditor.vue +48 -179
  243. package/src/components/ProtocolStepParameterField.vue +134 -0
  244. package/src/components/ReagentList.presentation.ts +105 -0
  245. package/src/components/ReagentList.vue +16 -79
  246. package/src/components/SampleSelector.colors.ts +43 -0
  247. package/src/components/SampleSelector.drag.ts +164 -0
  248. package/src/components/SampleSelector.groups.ts +109 -0
  249. package/src/components/SampleSelector.selection.ts +103 -0
  250. package/src/components/SampleSelector.vue +82 -349
  251. package/src/components/SampleSelectorSampleRow.vue +64 -0
  252. package/src/components/ScheduleCalendar.vue +44 -199
  253. package/src/components/SettingsModal.schema.ts +71 -0
  254. package/src/components/SettingsModal.vue +16 -46
  255. package/src/components/WellPlate.colors.ts +56 -0
  256. package/src/components/WellPlate.conditions.ts +100 -0
  257. package/src/components/WellPlate.geometry.ts +91 -0
  258. package/src/components/WellPlate.interaction.ts +272 -0
  259. package/src/components/WellPlate.legend.ts +8 -0
  260. package/src/components/WellPlate.rendering.ts +105 -0
  261. package/src/components/WellPlate.sampleDrop.ts +73 -0
  262. package/src/components/WellPlate.vue +102 -550
  263. package/src/components/internal/FormFieldRendererInternal.vue +23 -5
  264. package/src/components/internal/PlateMapEditorToolbarInternal.vue +128 -0
  265. package/src/composables/autoGroup/classKey.ts +5 -0
  266. package/src/composables/autoGroup/classify.ts +205 -0
  267. package/src/composables/autoGroup/colors.ts +6 -0
  268. package/src/composables/autoGroup/columns.ts +226 -0
  269. package/src/composables/autoGroup/compose.ts +156 -0
  270. package/src/composables/autoGroup/cooccurrence.ts +46 -0
  271. package/src/composables/autoGroup/csv-shim.ts +44 -0
  272. package/src/composables/autoGroup/fingerprint.ts +49 -0
  273. package/src/composables/autoGroup/index.ts +20 -0
  274. package/src/composables/autoGroup/replicatePreGroup.ts +90 -0
  275. package/src/composables/autoGroup/template.ts +126 -0
  276. package/src/composables/autoGroup/tokenize.ts +41 -0
  277. package/src/composables/autoGroup/vocab.json +67 -0
  278. package/src/composables/autoGroupConstants.ts +4 -0
  279. package/src/composables/autoGroupGrouping.ts +148 -0
  280. package/src/composables/controlComponentBindings.ts +1 -1
  281. package/src/composables/controlSchemaAdapters.ts +4 -1
  282. package/src/composables/controlSchemaDoseDesign.ts +215 -0
  283. package/src/composables/controlSchemaFormFields.ts +4 -1
  284. package/src/composables/controlSchemaLayout.ts +1 -1
  285. package/src/composables/controlSchemaModel.ts +163 -0
  286. package/src/composables/controlSchemaNormalize.ts +1 -1
  287. package/src/composables/controlSchemaTypes.ts +372 -0
  288. package/src/composables/controlWorkspaceOptions.ts +1 -1
  289. package/src/composables/formBuilderSchema.ts +153 -0
  290. package/src/composables/pluginEndpointBuilder.ts +203 -0
  291. package/src/composables/protocolTemplateCatalog.ts +325 -0
  292. package/src/composables/useAutoGroup.ts +395 -549
  293. package/src/composables/useAutoGroupInputSources.ts +147 -0
  294. package/src/composables/useBioTemplateControls.ts +1 -1
  295. package/src/composables/useBioTemplatePresetWorkspace.ts +1 -1
  296. package/src/composables/useBioTemplateWorkspace.ts +1 -1
  297. package/src/composables/useControlSchema.ts +21 -692
  298. package/src/composables/useControlWorkspace.ts +7 -13
  299. package/src/composables/useForm.ts +5 -187
  300. package/src/composables/useFormBuilder.ts +11 -153
  301. package/src/composables/useFormValidation.ts +154 -0
  302. package/src/composables/usePluginClient.ts +10 -193
  303. package/src/composables/useProtocolTemplates.ts +10 -328
  304. package/src/composables/useScheduleCalendarLayout.ts +287 -0
  305. package/src/styles/components/app-sidebar.css +134 -6
  306. package/src/styles/components/auto-group-modal.css +248 -310
  307. package/src/styles/components/checkbox.css +87 -0
  308. package/src/styles/components/collapsible-card.css +154 -14
  309. package/src/styles/components/toggle.css +80 -0
  310. package/src/templates/controlSchemaTypes.ts +1 -1
  311. package/src/templates/templateAdapterTypes.ts +58 -0
  312. package/src/templates/templateCreateOptions.ts +208 -0
  313. package/src/templates/templateQpcrTypes.ts +48 -0
  314. package/src/templates/types.ts +79 -275
  315. package/src/types/auto-group.ts +107 -9
  316. package/src/types/componentLabTypes.ts +235 -0
  317. package/src/types/componentWorkflowTypes.ts +190 -0
  318. package/src/types/components.ts +95 -424
  319. package/src/types/form-builder.ts +3 -0
  320. package/src/types/index.ts +2 -0
  321. package/dist/components-DafPc4rM.js.map +0 -1
  322. package/dist/composables-BMkPQhVK.js.map +0 -1
  323. package/dist/templates-bUAWMn5L.js.map +0 -1
  324. package/dist/useProtocolTemplates-QZtHFFH2.js.map +0 -1
@@ -0,0 +1,187 @@
1
+ exp281_260413_YS_H2_400ulES_1ul_071
2
+ exp281_260413_YS_K2_400ulES_1ul_070
3
+ exp281_260413_YS_L2_400ulES_1ul_069
4
+ exp281_260415_SAM_SAH_SAHStandard_5nM_002
5
+ exp281_260415_SAM_SAH_SAHStandard_5nM_093
6
+ exp281_260415_SAM_SAH_SAMstandard_5nM_001
7
+ exp281_260415_SAM_SAH_SAMstandard_5nM_092
8
+ exp281_260415_SAM_SAH_Tissues_ExtractionS_00B
9
+ exp281_260415_SAM_SAH_Tissues_ExtractionS_091
10
+ exp281_260415_SAM_SAH_Tissues_IQC_003
11
+ exp281_260415_SAM_SAH_Tissues_IQC_056
12
+ exp281_260415_SAM_SAH_Tissues_IQC_090
13
+ exp281_260415_SAM_SAH_Tissues_Kidney_M10_085
14
+ exp281_260415_SAM_SAH_Tissues_Kidney_M11_080
15
+ exp281_260415_SAM_SAH_Tissues_Kidney_M12_027
16
+ exp281_260415_SAM_SAH_Tissues_Kidney_M13_048
17
+ exp281_260415_SAM_SAH_Tissues_Kidney_M14_023
18
+ exp281_260415_SAM_SAH_Tissues_Kidney_M15_074
19
+ exp281_260415_SAM_SAH_Tissues_Kidney_M16_088
20
+ exp281_260415_SAM_SAH_Tissues_Kidney_M17_070
21
+ exp281_260415_SAM_SAH_Tissues_Kidney_M18_006
22
+ exp281_260415_SAM_SAH_Tissues_Kidney_M19_033
23
+ exp281_260415_SAM_SAH_Tissues_Kidney_M1_050
24
+ exp281_260415_SAM_SAH_Tissues_Kidney_M20_004
25
+ exp281_260415_SAM_SAH_Tissues_Kidney_M21_061
26
+ exp281_260415_SAM_SAH_Tissues_Kidney_M22_032
27
+ exp281_260415_SAM_SAH_Tissues_Kidney_M23_024
28
+ exp281_260415_SAM_SAH_Tissues_Kidney_M24_040
29
+ exp281_260415_SAM_SAH_Tissues_Kidney_M25_045
30
+ exp281_260415_SAM_SAH_Tissues_Kidney_M26_026
31
+ exp281_260415_SAM_SAH_Tissues_Kidney_M27_067
32
+ exp281_260415_SAM_SAH_Tissues_Kidney_M2_086
33
+ exp281_260415_SAM_SAH_Tissues_Kidney_M3_083
34
+ exp281_260415_SAM_SAH_Tissues_Kidney_M4_068
35
+ exp281_260415_SAM_SAH_Tissues_Kidney_M5_049
36
+ exp281_260415_SAM_SAH_Tissues_Kidney_M6_069
37
+ exp281_260415_SAM_SAH_Tissues_Kidney_M7_054
38
+ exp281_260415_SAM_SAH_Tissues_Kidney_M8_079
39
+ exp281_260415_SAM_SAH_Tissues_Kidney_M9_009
40
+ exp281_260415_SAM_SAH_Tissues_Liver_M10_011
41
+ exp281_260415_SAM_SAH_Tissues_Liver_M11_075
42
+ exp281_260415_SAM_SAH_Tissues_Liver_M12_022
43
+ exp281_260415_SAM_SAH_Tissues_Liver_M13_060
44
+ exp281_260415_SAM_SAH_Tissues_Liver_M14_025
45
+ exp281_260415_SAM_SAH_Tissues_Liver_M15_031
46
+ exp281_260415_SAM_SAH_Tissues_Liver_M16_078
47
+ exp281_260415_SAM_SAH_Tissues_Liver_M17_029
48
+ exp281_260415_SAM_SAH_Tissues_Liver_M18_046
49
+ exp281_260415_SAM_SAH_Tissues_Liver_M19_073
50
+ exp281_260415_SAM_SAH_Tissues_Liver_M1_047
51
+ exp281_260415_SAM_SAH_Tissues_Liver_M20_072
52
+ exp281_260415_SAM_SAH_Tissues_Liver_M21_042
53
+ exp281_260415_SAM_SAH_Tissues_Liver_M22_030
54
+ exp281_260415_SAM_SAH_Tissues_Liver_M23_014
55
+ exp281_260415_SAM_SAH_Tissues_Liver_M24_043
56
+ exp281_260415_SAM_SAH_Tissues_Liver_M25_008
57
+ exp281_260415_SAM_SAH_Tissues_Liver_M26_057
58
+ exp281_260415_SAM_SAH_Tissues_Liver_M27_053
59
+ exp281_260415_SAM_SAH_Tissues_Liver_M2_019
60
+ exp281_260415_SAM_SAH_Tissues_Liver_M3_017
61
+ exp281_260415_SAM_SAH_Tissues_Liver_M4_007
62
+ exp281_260415_SAM_SAH_Tissues_Liver_M5_059
63
+ exp281_260415_SAM_SAH_Tissues_Liver_M6_005
64
+ exp281_260415_SAM_SAH_Tissues_Liver_M7_035
65
+ exp281_260415_SAM_SAH_Tissues_Liver_M8_036
66
+ exp281_260415_SAM_SAH_Tissues_Liver_M9_055
67
+ exp281_260415_SAM_SAH_Tissues_Tumor_M10_037
68
+ exp281_260415_SAM_SAH_Tissues_Tumor_M11_015
69
+ exp281_260415_SAM_SAH_Tissues_Tumor_M12_062
70
+ exp281_260415_SAM_SAH_Tissues_Tumor_M13_087
71
+ exp281_260415_SAM_SAH_Tissues_Tumor_M14_081
72
+ exp281_260415_SAM_SAH_Tissues_Tumor_M15_016
73
+ exp281_260415_SAM_SAH_Tissues_Tumor_M16_013
74
+ exp281_260415_SAM_SAH_Tissues_Tumor_M17_084
75
+ exp281_260415_SAM_SAH_Tissues_Tumor_M18_021
76
+ exp281_260415_SAM_SAH_Tissues_Tumor_M19_064
77
+ exp281_260415_SAM_SAH_Tissues_Tumor_M1_066
78
+ exp281_260415_SAM_SAH_Tissues_Tumor_M20_012
79
+ exp281_260415_SAM_SAH_Tissues_Tumor_M21_038
80
+ exp281_260415_SAM_SAH_Tissues_Tumor_M22_034
81
+ exp281_260415_SAM_SAH_Tissues_Tumor_M23_089
82
+ exp281_260415_SAM_SAH_Tissues_Tumor_M24_028
83
+ exp281_260415_SAM_SAH_Tissues_Tumor_M25_063
84
+ exp281_260415_SAM_SAH_Tissues_Tumor_M26_018
85
+ exp281_260415_SAM_SAH_Tissues_Tumor_M27_082
86
+ exp281_260415_SAM_SAH_Tissues_Tumor_M2_076
87
+ exp281_260415_SAM_SAH_Tissues_Tumor_M3_071
88
+ exp281_260415_SAM_SAH_Tissues_Tumor_M4_041
89
+ exp281_260415_SAM_SAH_Tissues_Tumor_M5_051
90
+ exp281_260415_SAM_SAH_Tissues_Tumor_M6_044
91
+ exp281_260415_SAM_SAH_Tissues_Tumor_M7_065
92
+ exp281_260415_SAM_SAH_Tissues_Tumor_M8_010
93
+ exp281_260415_SAM_SAH_Tissues_Tumor_M9_052
94
+ exp280_260413_SK_ESwithSpikeIn_02
95
+ exp280_260413_SK_ESwithSpikeIn_1to100_Stock_05
96
+ exp280_260413_SK_ESwithSpikeIn_1to100_Stock_10
97
+ exp280_260413_SK_ESwithSpikeIn_1to10_04
98
+ exp280_260413_SK_SAM_5nM_03
99
+ exp280_260413_SK_SAM_5nM_06
100
+ exp280_260413_YS_Experiment_EQC_002
101
+ exp280_260413_YS_Experiment_EQC_067
102
+ exp280_260413_YS_Experiment_EQC_102
103
+ exp280_260413_YS_Experiment_Plasma_M10_031
104
+ exp280_260413_YS_Experiment_Plasma_M10_0dot5ul_061
105
+ exp280_260413_YS_Experiment_Plasma_M10_0dot5ul_097
106
+ exp280_260413_YS_Experiment_Plasma_M11_018
107
+ exp280_260413_YS_Experiment_Plasma_M11_0dot5ul_054
108
+ exp280_260413_YS_Experiment_Plasma_M11_0dot5ul_090
109
+ exp280_260413_YS_Experiment_Plasma_M12_026
110
+ exp280_260413_YS_Experiment_Plasma_M12_0dot5ul_059
111
+ exp280_260413_YS_Experiment_Plasma_M12_0dot5ul_095
112
+ exp280_260413_YS_Experiment_Plasma_M13_027
113
+ exp280_260413_YS_Experiment_Plasma_M13_0dot5ul_037
114
+ exp280_260413_YS_Experiment_Plasma_M13_0dot5ul_073
115
+ exp280_260413_YS_Experiment_Plasma_M14_011
116
+ exp280_260413_YS_Experiment_Plasma_M14_0dot5ul_058
117
+ exp280_260413_YS_Experiment_Plasma_M14_0dot5ul_094
118
+ exp280_260413_YS_Experiment_Plasma_M15_029
119
+ exp280_260413_YS_Experiment_Plasma_M15_0dot5ul_065
120
+ exp280_260413_YS_Experiment_Plasma_M15_0dot5ul_100
121
+ exp280_260413_YS_Experiment_Plasma_M16_024
122
+ exp280_260413_YS_Experiment_Plasma_M16_0dot5ul_048
123
+ exp280_260413_YS_Experiment_Plasma_M16_0dot5ul_084
124
+ exp280_260413_YS_Experiment_Plasma_M17_006
125
+ exp280_260413_YS_Experiment_Plasma_M17_0dot5ul_055
126
+ exp280_260413_YS_Experiment_Plasma_M17_0dot5ul_091
127
+ exp280_260413_YS_Experiment_Plasma_M18_013
128
+ exp280_260413_YS_Experiment_Plasma_M18_0dot5ul_064
129
+ exp280_260413_YS_Experiment_Plasma_M18_0dot5ul_099
130
+ exp280_260413_YS_Experiment_Plasma_M19_030
131
+ exp280_260413_YS_Experiment_Plasma_M19_0dot5ul_051
132
+ exp280_260413_YS_Experiment_Plasma_M19_0dot5ul_087
133
+ exp280_260413_YS_Experiment_Plasma_M1_015
134
+ exp280_260413_YS_Experiment_Plasma_M1_0dot5ul_039
135
+ exp280_260413_YS_Experiment_Plasma_M1_0dot5ul_075
136
+ exp280_260413_YS_Experiment_Plasma_M20_005
137
+ exp280_260413_YS_Experiment_Plasma_M20_0dot5ul_049
138
+ exp280_260413_YS_Experiment_Plasma_M20_0dot5ul_085
139
+ exp280_260413_YS_Experiment_Plasma_M21_004
140
+ exp280_260413_YS_Experiment_Plasma_M21_0dot5ul_050
141
+ exp280_260413_YS_Experiment_Plasma_M21_0dot5ul_086
142
+ exp280_260413_YS_Experiment_Plasma_M22_009
143
+ exp280_260413_YS_Experiment_Plasma_M22_0dot5ul_040
144
+ exp280_260413_YS_Experiment_Plasma_M22_0dot5ul_076
145
+ exp280_260413_YS_Experiment_Plasma_M23_023
146
+ exp280_260413_YS_Experiment_Plasma_M23_0dot5ul_066
147
+ exp280_260413_YS_Experiment_Plasma_M23_0dot5ul_101
148
+ exp280_260413_YS_Experiment_Plasma_M24_003
149
+ exp280_260413_YS_Experiment_Plasma_M24_0dot5ul_042
150
+ exp280_260413_YS_Experiment_Plasma_M24_0dot5ul_078
151
+ exp280_260413_YS_Experiment_Plasma_M25_007
152
+ exp280_260413_YS_Experiment_Plasma_M25_0dot5ul_038
153
+ exp280_260413_YS_Experiment_Plasma_M25_0dot5ul_074
154
+ exp280_260413_YS_Experiment_Plasma_M26_014
155
+ exp280_260413_YS_Experiment_Plasma_M26_0dot5ul_056
156
+ exp280_260413_YS_Experiment_Plasma_M26_0dot5ul_092
157
+ exp280_260413_YS_Experiment_Plasma_M27_032
158
+ exp280_260413_YS_Experiment_Plasma_M27_0dot5ul_063
159
+ exp280_260413_YS_Experiment_Plasma_M27_0dot5ul_098
160
+ exp280_260413_YS_Experiment_Plasma_M2_020
161
+ exp280_260413_YS_Experiment_Plasma_M2_0dot5ul_047
162
+ exp280_260413_YS_Experiment_Plasma_M2_0dot5ul_083
163
+ exp280_260413_YS_Experiment_Plasma_M3_025
164
+ exp280_260413_YS_Experiment_Plasma_M3_0dot5ul_060
165
+ exp280_260413_YS_Experiment_Plasma_M3_0dot5ul_096
166
+ exp280_260413_YS_Experiment_Plasma_M4_008
167
+ exp280_260413_YS_Experiment_Plasma_M4_0dot5ul_045
168
+ exp280_260413_YS_Experiment_Plasma_M4_0dot5ul_081
169
+ exp280_260413_YS_Experiment_Plasma_M5_012
170
+ exp280_260413_YS_Experiment_Plasma_M5_0dot5ul_057
171
+ exp280_260413_YS_Experiment_Plasma_M5_0dot5ul_093
172
+ exp280_260413_YS_Experiment_Plasma_M6_016
173
+ exp280_260413_YS_Experiment_Plasma_M6_0dot5ul_046
174
+ exp280_260413_YS_Experiment_Plasma_M6_0dot5ul_082
175
+ exp280_260413_YS_Experiment_Plasma_M7_017
176
+ exp280_260413_YS_Experiment_Plasma_M7_0dot5ul_041
177
+ exp280_260413_YS_Experiment_Plasma_M7_0dot5ul_077
178
+ exp280_260413_YS_Experiment_Plasma_M8_022
179
+ exp280_260413_YS_Experiment_Plasma_M8_0dot5ul_043
180
+ exp280_260413_YS_Experiment_Plasma_M8_0dot5ul_079
181
+ exp280_260413_YS_Experiment_Plasma_M9_021
182
+ exp280_260413_YS_Experiment_Plasma_M9_0dot5ul_052
183
+ exp280_260413_YS_Experiment_Plasma_M9_0dot5ul_088
184
+ exp280_260413_YS_Experiment_SAH_1nM_036
185
+ exp280_260413_YS_Experiment_SAH_1nM_072
186
+ exp280_260413_YS_Experiment_SAM_1nM_035
187
+ exp280_260413_YS_Experiment_SAM_1nM_071
@@ -4,6 +4,7 @@ import AppSidebar from './AppSidebar.vue'
4
4
  import BaseSlider from './BaseSlider.vue'
5
5
  import BaseSelect from './BaseSelect.vue'
6
6
  import BaseToggle from './BaseToggle.vue'
7
+ import BaseCheckbox from './BaseCheckbox.vue'
7
8
  import BaseButton from './BaseButton.vue'
8
9
  import BaseInput from './BaseInput.vue'
9
10
  import NumberInput from './NumberInput.vue'
@@ -25,6 +26,10 @@ const icons = {
25
26
  zap: 'M13 2L3 14h9l-1 8 10-12h-9l1-8',
26
27
  route: ['M18 6l-6 6-4-4-6 6'],
27
28
  settings: ['M12 2L2 7l10 5 10-5-10-5z', 'M2 17l10 5 10-5', 'M2 12l10 5 10-5'],
29
+ reset: ['M16.023 9.348h4.992v-.001', 'M2.985 19.644v-4.992', 'M4.031 9.865a8.25 8.25 0 0113.803-3.7'],
30
+ eye: ['M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z', 'M12 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6z'],
31
+ chart: ['M3 3v18h18', 'M7 15l3-3 3 2 4-6'],
32
+ database: ['M12 3c4.418 0 8 1.343 8 3s-3.582 3-8 3-8-1.343-8-3 3.582-3 8-3z', 'M4 6v6c0 1.657 3.582 3 8 3s8-1.343 8-3V6', 'M4 12v6c0 1.657 3.582 3 8 3s8-1.343 8-3v-6'],
28
33
  }
29
34
 
30
35
  /* --- Sequence builder panels --- */
@@ -46,6 +51,8 @@ const sequencePanels: Record<string, SidebarToolSection[]> = {
46
51
  iconColor: '#6366f1',
47
52
  iconBg: '#e0e7ff',
48
53
  showToggle: true,
54
+ badge: 'on',
55
+ badgeTone: 'success',
49
56
  },
50
57
  {
51
58
  id: 'randomize',
@@ -55,6 +62,11 @@ const sequencePanels: Record<string, SidebarToolSection[]> = {
55
62
  iconColor: '#6366f1',
56
63
  iconBg: '#e0e7ff',
57
64
  showToggle: true,
65
+ badge: 3,
66
+ badgeTone: 'cta',
67
+ actions: [
68
+ { id: 'reset-randomize', label: 'Reset randomization', icon: icons.reset, tone: 'neutral' },
69
+ ],
58
70
  defaultOpen: false,
59
71
  },
60
72
  {
@@ -128,6 +140,7 @@ const methods = [
128
140
  ]
129
141
  const showOutliers = ref(true)
130
142
  const logScale = ref(false)
143
+ const includeMetadata = ref(true)
131
144
  const polarity = ref('negative')
132
145
  const container = ref('vial')
133
146
  const expNumber = ref(1)
@@ -169,6 +182,10 @@ const schemaControls = defineControls({
169
182
  showOutliers: {
170
183
  label: 'Show outliers',
171
184
  default: true,
185
+ hint: 'Keep flagged points visible',
186
+ icon: icons.eye,
187
+ iconColor: '#0ea5e9',
188
+ iconBg: '#e0f2fe',
172
189
  section: 'display',
173
190
  sectionLabel: 'Display',
174
191
  sectionSubtitle: 'Result filters',
@@ -206,7 +223,14 @@ const modelDrivenSidebarModel = defineControlModel({
206
223
  defaultOpen: false,
207
224
  },
208
225
  controls: {
209
- showOutliers: true,
226
+ showOutliers: {
227
+ label: 'Show outliers',
228
+ default: true,
229
+ hint: 'Keep flagged points visible',
230
+ icon: icons.eye,
231
+ iconColor: '#0ea5e9',
232
+ iconBg: '#e0f2fe',
233
+ },
210
234
  minPeakArea: { type: 'number', default: 1000, min: 0 },
211
235
  },
212
236
  },
@@ -301,7 +325,15 @@ function initSimpleToolkit() {
301
325
  </div>
302
326
  </template>
303
327
  <template #section-method>
304
- <BaseToggle model-value label="Use custom method paths" />
328
+ <BaseToggle
329
+ model-value
330
+ variant="row"
331
+ label="Use custom method paths"
332
+ description="Override the default acquisition directory"
333
+ :icon="icons.route"
334
+ icon-color="#8b5cf6"
335
+ icon-bg="#ede9fe"
336
+ />
305
337
  <BaseSelect
306
338
  model-value=""
307
339
  placeholder="-- Select Method --"
@@ -445,13 +477,46 @@ function initSimpleToolkit() {
445
477
  <BaseSelect v-model="method" label="Method" :options="methods" />
446
478
  </template>
447
479
  <template #section-filters>
448
- <BaseToggle v-model="showOutliers" label="Exclude outliers" />
480
+ <BaseToggle
481
+ v-model="showOutliers"
482
+ variant="row"
483
+ label="Exclude outliers"
484
+ description="Hide flagged injections from summaries"
485
+ :icon="icons.eye"
486
+ icon-color="#0ea5e9"
487
+ icon-bg="#e0f2fe"
488
+ />
449
489
  </template>
450
490
  <template #section-display>
451
- <BaseToggle v-model="showOutliers" label="Show outliers" />
452
- <BaseToggle v-model="logScale" label="Log scale" />
491
+ <BaseToggle
492
+ v-model="showOutliers"
493
+ variant="row"
494
+ label="Show outliers"
495
+ description="Keep flagged peaks visible"
496
+ :icon="icons.eye"
497
+ icon-color="#0ea5e9"
498
+ icon-bg="#e0f2fe"
499
+ />
500
+ <BaseToggle
501
+ v-model="logScale"
502
+ variant="row"
503
+ label="Log scale"
504
+ description="Compress high-intensity spread"
505
+ :icon="icons.chart"
506
+ icon-color="#8b5cf6"
507
+ icon-bg="#ede9fe"
508
+ />
453
509
  </template>
454
510
  <template #section-export>
511
+ <BaseCheckbox
512
+ v-model="includeMetadata"
513
+ variant="row"
514
+ label="Include metadata"
515
+ description="Add method and sample context"
516
+ :icon="icons.database"
517
+ icon-color="#10b981"
518
+ icon-bg="#d1fae5"
519
+ />
455
520
  <BaseButton size="sm" variant="secondary">Export CSV</BaseButton>
456
521
  <BaseButton size="sm" variant="secondary">Export PNG</BaseButton>
457
522
  </template>
@@ -499,7 +564,15 @@ function initSimpleToolkit() {
499
564
  <BaseSelect v-model="method" label="Method" :options="methods" />
500
565
  </template>
501
566
  <template #section-filters>
502
- <BaseToggle v-model="showOutliers" label="Exclude outliers" />
567
+ <BaseToggle
568
+ v-model="showOutliers"
569
+ variant="row"
570
+ label="Exclude outliers"
571
+ description="Hide flagged injections from summaries"
572
+ :icon="icons.eye"
573
+ icon-color="#0ea5e9"
574
+ icon-bg="#e0f2fe"
575
+ />
503
576
  </template>
504
577
  <template #footer>
505
578
  <BaseButton size="sm" variant="ghost" style="width: 100%;">Reset Defaults</BaseButton>
@@ -31,9 +31,9 @@ import type { FormEnhancements, FormSchema } from '../types/form-builder'
31
31
  import {
32
32
  controlsToSectionFormSchemas,
33
33
  controlsToSidebarPanels,
34
- defineControlModel,
35
34
  getControlDefaults,
36
35
  mergeControlWorkspaceOptions,
36
+ resolveControlModel,
37
37
  type ControlModel,
38
38
  type ControlModelBinding,
39
39
  type ControlSchema,
@@ -153,6 +153,7 @@ const emit = defineEmits<{
153
153
  'update:modelValue': [values: Record<string, unknown>]
154
154
  'update:values': [values: Record<string, unknown>]
155
155
  'update:collapsed': [value: boolean]
156
+ 'section-action': [sectionId: string, actionId: string]
156
157
  'form-submit': [sectionId: string, values: Record<string, unknown>]
157
158
  'form-cancel': [sectionId: string]
158
159
  }>()
@@ -173,8 +174,7 @@ const resolvedWidth = computed(() => props.width ?? (isAnalysisVariant.value ? '
173
174
  const resolvedCollapsible = computed(() => props.collapsible ?? isAnalysisVariant.value)
174
175
 
175
176
  const resolvedModel = computed<ControlModelBinding | undefined>(() => {
176
- if (props.model === undefined) return undefined
177
- return isControlModelBinding(props.model) ? props.model : defineControlModel(props.model)
177
+ return resolveControlModel(props.model)
178
178
  })
179
179
 
180
180
  const resolvedControls = computed<ControlSchema | undefined>(() =>
@@ -269,6 +269,30 @@ function expandCollapsed() {
269
269
  collapsedModel.value = false
270
270
  }
271
271
 
272
+ function handleSectionAction(sectionId: string, actionId: string) {
273
+ emit('section-action', sectionId, actionId)
274
+ }
275
+
276
+ function isSvgIcon(icon?: string | string[]): boolean {
277
+ if (!icon) return false
278
+ return Array.isArray(icon) || icon.startsWith('M') || icon.startsWith('m')
279
+ }
280
+
281
+ function sectionInitial(section: SidebarToolSection): string {
282
+ return section.label.trim().charAt(0).toUpperCase() || '?'
283
+ }
284
+
285
+ function railIconStyle(section: SidebarToolSection): Record<string, string> {
286
+ return {
287
+ backgroundColor: section.iconBg ?? 'var(--color-primary-soft)',
288
+ color: section.iconColor ?? 'var(--color-primary)',
289
+ }
290
+ }
291
+
292
+ function badgeToneClass(section: SidebarToolSection): string {
293
+ return `mint-sidebar__rail-badge--${section.badgeTone ?? 'cta'}`
294
+ }
295
+
272
296
  function mergeSidebarPanels(
273
297
  generated: Record<string, SidebarToolSection[]>,
274
298
  explicit: Record<string, SidebarToolSection[]>,
@@ -297,9 +321,6 @@ function firstVisibleViewId(panels: Record<string, SidebarToolSection[]>): strin
297
321
  return ''
298
322
  }
299
323
 
300
- function isControlModelBinding(model: ControlModel | ControlModelBinding): model is ControlModelBinding {
301
- return 'controls' in model && 'controlOptions' in model
302
- }
303
324
  </script>
304
325
 
305
326
  <template>
@@ -363,10 +384,14 @@ function isControlModelBinding(model: ControlModel | ControlModelBinding): model
363
384
  :icon="section.icon"
364
385
  :icon-color="section.iconColor"
365
386
  :icon-bg="section.iconBg"
387
+ :badge="section.badge"
388
+ :badge-tone="section.badgeTone"
389
+ :actions="section.actions"
366
390
  :dense="dense"
367
391
  :default-open="section.defaultOpen !== false"
368
392
  :show-toggle="section.showToggle"
369
393
  :toggle-value="toggleState[section.id] ?? false"
394
+ @action="handleSectionAction(section.id, $event)"
370
395
  @update:toggle-value="emit('update:toggle', section.id, $event)"
371
396
  >
372
397
  <slot :name="`section-${section.id}`">
@@ -402,10 +427,53 @@ function isControlModelBinding(model: ControlModel | ControlModelBinding): model
402
427
  />
403
428
  </div>
404
429
 
430
+ <div v-else class="mint-sidebar__collapsed mint-sidebar__collapsed--default">
431
+ <button
432
+ v-for="section in activeSections"
433
+ :key="section.id"
434
+ type="button"
435
+ class="mint-sidebar__rail-item"
436
+ :aria-label="`Expand ${section.label}`"
437
+ :title="section.label"
438
+ @click="expandCollapsed"
439
+ >
440
+ <span class="mint-sidebar__rail-icon" :style="railIconStyle(section)">
441
+ <svg
442
+ v-if="section.icon && isSvgIcon(section.icon)"
443
+ class="mint-sidebar__rail-svg"
444
+ viewBox="0 0 24 24"
445
+ fill="none"
446
+ stroke="currentColor"
447
+ stroke-width="2"
448
+ stroke-linecap="round"
449
+ stroke-linejoin="round"
450
+ aria-hidden="true"
451
+ >
452
+ <template v-if="Array.isArray(section.icon)">
453
+ <path v-for="(d, i) in section.icon" :key="i" :d="d" />
454
+ </template>
455
+ <path v-else :d="section.icon" />
456
+ </svg>
457
+ <span v-else class="mint-sidebar__rail-text-icon">
458
+ {{ section.icon || sectionInitial(section) }}
459
+ </span>
460
+ </span>
461
+ <span
462
+ v-if="section.badge !== undefined"
463
+ :class="['mint-sidebar__rail-badge', badgeToneClass(section)]"
464
+ >
465
+ {{ section.badge }}
466
+ </span>
467
+ </button>
468
+ </div>
469
+
405
470
  <!-- Footer slot -->
406
471
  <div v-if="!collapsedModel && $slots.footer" class="mint-sidebar__footer">
407
472
  <slot name="footer" />
408
473
  </div>
474
+ <div v-else-if="collapsedModel && $slots['collapsed-footer']" class="mint-sidebar__footer mint-sidebar__footer--collapsed">
475
+ <slot name="collapsed-footer" />
476
+ </div>
409
477
  </aside>
410
478
  </template>
411
479
 
@@ -0,0 +1,62 @@
1
+ import type { PageSelectorItem } from '../types/components'
2
+ import type { PluginNavItem } from '../types/platform'
3
+
4
+ export interface PluginNavPageSelectorOptions {
5
+ pluginIcon?: string
6
+ pluginName?: string
7
+ }
8
+
9
+ export function normalizeNavPath(path?: string): string {
10
+ const raw = path?.trim() || '/'
11
+ const prefixed = raw.startsWith('/') ? raw : `/${raw}`
12
+ return prefixed.replace(/\/+$/, '') || '/'
13
+ }
14
+
15
+ export function pageIdFromPath(path: string, fallback: string): string {
16
+ const normalized = normalizeNavPath(path)
17
+ if (normalized === '/') return 'dashboard'
18
+ return normalized.replace(/^\/+/, '').replace(/\/+/g, '-') || fallback
19
+ }
20
+
21
+ export function pluginNavItemToPageSelectorItem(
22
+ item: PluginNavItem,
23
+ index: number,
24
+ options: PluginNavPageSelectorOptions = {},
25
+ ): PageSelectorItem {
26
+ const path = normalizeNavPath(item.path)
27
+ return {
28
+ id: item.id || pageIdFromPath(path, `page-${index + 1}`),
29
+ label: item.label,
30
+ to: path,
31
+ icon: item.icon || options.pluginIcon,
32
+ hint: item.description || options.pluginName,
33
+ }
34
+ }
35
+
36
+ export function currentPagePath(
37
+ pathname: string | undefined,
38
+ routePrefix?: string,
39
+ ): string | undefined {
40
+ if (!pathname) return undefined
41
+ const normalizedPathname = normalizeNavPath(pathname)
42
+ const normalizedRoutePrefix = normalizeNavPath(routePrefix)
43
+
44
+ if (normalizedPathname === normalizedRoutePrefix) return '/'
45
+ if (
46
+ normalizedRoutePrefix !== '/' &&
47
+ normalizedPathname.startsWith(`${normalizedRoutePrefix}/`)
48
+ ) {
49
+ return normalizeNavPath(normalizedPathname.slice(normalizedRoutePrefix.length))
50
+ }
51
+ return normalizedPathname
52
+ }
53
+
54
+ export function currentItemIdFromLocation(
55
+ pages: Array<Pick<PageSelectorItem, 'id' | 'to' | 'href'>>,
56
+ pathname: string | undefined,
57
+ routePrefix?: string,
58
+ ): string | undefined {
59
+ const path = currentPagePath(pathname, routePrefix)
60
+ if (!path) return undefined
61
+ return pages.find((page) => normalizeNavPath(page.to || page.href) === path)?.id
62
+ }
@@ -14,7 +14,6 @@ import type {
14
14
  AccountMenuItem,
15
15
  SettingsTab,
16
16
  } from '../types/components'
17
- import type { PluginNavItem } from '../types/platform'
18
17
  import { normalizeItemInput } from '../utils/items'
19
18
  import ThemeToggle from './ThemeToggle.vue'
20
19
  import SettingsModal from './SettingsModal.vue'
@@ -27,6 +26,10 @@ import AppPluginSwitcher from './AppPluginSwitcher.vue'
27
26
  import PluginIcon from './PluginIcon.vue'
28
27
  import { usePlatformContext } from '../composables/usePlatformContext'
29
28
  import { APP_EXPERIMENT_KEY } from '../composables/useAppExperiment'
29
+ import {
30
+ currentItemIdFromLocation,
31
+ pluginNavItemToPageSelectorItem,
32
+ } from './AppTopBar.navigation'
30
33
 
31
34
  interface Props {
32
35
  /** App or plugin title shown in the left title group when no page selector is present. */
@@ -153,7 +156,12 @@ const hasTitleOnly = computed(
153
156
  )
154
157
  const platformPageSelector = computed<PageSelectorItem[]>(() =>
155
158
  hasPlatformPageSelector.value
156
- ? plugin.value?.nav_items?.map(pluginNavItemToPageSelectorItem) ?? []
159
+ ? plugin.value?.nav_items?.map((item, index) =>
160
+ pluginNavItemToPageSelectorItem(item, index, {
161
+ pluginIcon: plugin.value?.icon,
162
+ pluginName: plugin.value?.name,
163
+ })
164
+ ) ?? []
157
165
  : [],
158
166
  )
159
167
  const normalizedPageSelector = computed<PageSelectorItem[]>(() =>
@@ -167,50 +175,15 @@ const normalizedSettingsTabs = computed<SettingsTab[]>(() =>
167
175
  )
168
176
  const effectiveCurrentPageSelectorId = computed(() =>
169
177
  props.currentPageSelectorId
170
- ?? (hasPlatformPageSelector.value ? currentItemIdFromLocation(normalizedPageSelector.value) : undefined)
178
+ ?? (hasPlatformPageSelector.value
179
+ ? currentItemIdFromLocation(
180
+ normalizedPageSelector.value,
181
+ typeof window === 'undefined' ? undefined : window.location.pathname,
182
+ plugin.value?.route_prefix,
183
+ )
184
+ : undefined)
171
185
  ?? (hasPlatformPageSelector.value ? normalizedPageSelector.value[0]?.id : undefined),
172
186
  )
173
-
174
- function normalizeNavPath(path?: string): string {
175
- const raw = path?.trim() || '/'
176
- const prefixed = raw.startsWith('/') ? raw : `/${raw}`
177
- return prefixed.replace(/\/+$/, '') || '/'
178
- }
179
-
180
- function pageIdFromPath(path: string, fallback: string): string {
181
- const normalized = normalizeNavPath(path)
182
- if (normalized === '/') return 'dashboard'
183
- return normalized.replace(/^\/+/, '').replace(/\/+/g, '-') || fallback
184
- }
185
-
186
- function pluginNavItemToPageSelectorItem(item: PluginNavItem, index: number): PageSelectorItem {
187
- const path = normalizeNavPath(item.path)
188
- return {
189
- id: item.id || pageIdFromPath(path, `page-${index + 1}`),
190
- label: item.label,
191
- to: path,
192
- icon: item.icon || plugin.value?.icon,
193
- hint: item.description || plugin.value?.name,
194
- }
195
- }
196
-
197
- function currentPagePath(): string | undefined {
198
- if (typeof window === 'undefined') return undefined
199
- const pathname = normalizeNavPath(window.location.pathname)
200
- const routePrefix = normalizeNavPath(plugin.value?.route_prefix)
201
-
202
- if (pathname === routePrefix) return '/'
203
- if (routePrefix !== '/' && pathname.startsWith(`${routePrefix}/`)) {
204
- return normalizeNavPath(pathname.slice(routePrefix.length))
205
- }
206
- return pathname
207
- }
208
-
209
- function currentItemIdFromLocation(pages: Array<Pick<PageSelectorItem, 'id' | 'to' | 'href'>>): string | undefined {
210
- const path = currentPagePath()
211
- if (!path) return undefined
212
- return pages.find((page) => normalizeNavPath(page.to || page.href) === path)?.id
213
- }
214
187
  </script>
215
188
 
216
189
  <template>