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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/README.md +35 -5
  2. package/dist/{ExperimentPopover-tLwJ7XF4.js → ExperimentPopover-oL0fg_A0.js} +6 -4
  3. package/dist/ExperimentPopover-oL0fg_A0.js.map +1 -0
  4. package/dist/{ExperimentSelectorModal-DyPAUCLw.js → ExperimentSelectorModal-BeEOomw_.js} +5 -5
  5. package/dist/ExperimentSelectorModal-BeEOomw_.js.map +1 -0
  6. package/dist/{SettingsModal-BgKY93zh.js → SettingsModal-Dphh3RrI.js} +5 -8
  7. package/dist/SettingsModal-Dphh3RrI.js.map +1 -0
  8. package/dist/{EmptyState-p90quq8Z.js → Skeleton-DxtwJ5gt.js} +111 -93
  9. package/dist/Skeleton-DxtwJ5gt.js.map +1 -0
  10. package/dist/__tests__/components/ExperimentTimeline.test.d.ts +1 -0
  11. package/dist/__tests__/components/PluginWorkspaceView.internal.test.d.ts +1 -0
  12. package/dist/__tests__/components/SecretInput.test.d.ts +1 -0
  13. package/dist/__tests__/components/WellEditPopupInternal.test.d.ts +1 -0
  14. package/dist/__tests__/composables/useListReorder.test.d.ts +1 -0
  15. package/dist/__tests__/composables/usePluginConfig.test.d.ts +15 -0
  16. package/dist/__tests__/styles/cssTokens.test.d.ts +1 -0
  17. package/dist/components/ActionMenu.vue.d.ts +1 -1
  18. package/dist/components/AppAvatarMenu.vue.d.ts +4 -0
  19. package/dist/components/AppPluginSwitcher.vue.d.ts +2 -0
  20. package/dist/components/AppSidebar.vue.d.ts +1 -1
  21. package/dist/components/AuditTrail.vue.d.ts +13 -0
  22. package/dist/components/AutoGroupModal.vue.d.ts +1 -1
  23. package/dist/components/BatchProgressList.vue.d.ts +17 -0
  24. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +2 -2
  25. package/dist/components/DataFrame.vue.d.ts +14 -2
  26. package/dist/components/DatePicker.vue.d.ts +1 -1
  27. package/dist/components/DateTimePicker.vue.d.ts +2 -0
  28. package/dist/components/DropdownButton.vue.d.ts +2 -0
  29. package/dist/components/ExperimentDataViewer.vue.d.ts +26 -1
  30. package/dist/components/ExperimentPopover.vue.d.ts +1 -0
  31. package/dist/components/ExperimentTimeline.vue.d.ts +29 -1
  32. package/dist/components/FitPanel.vue.d.ts +1 -1
  33. package/dist/components/JobsStatusTray.vue.d.ts +9 -2
  34. package/dist/components/LcmsSequenceTable.vue.d.ts +29 -1
  35. package/dist/components/PluginWorkspaceView.props.d.ts +29 -1
  36. package/dist/components/PluginWorkspaceView.vue.d.ts +5 -5
  37. package/dist/components/ProgressBar.vue.d.ts +1 -1
  38. package/dist/components/ProtocolStepEditor.vue.d.ts +1 -0
  39. package/dist/components/ReagentList.vue.d.ts +29 -1
  40. package/dist/components/SampleHierarchyTree.vue.d.ts +29 -1
  41. package/dist/components/SampleLegend.vue.d.ts +1 -1
  42. package/dist/components/SampleSelector.drag.d.ts +13 -0
  43. package/dist/components/SampleSelector.tree.d.ts +2 -0
  44. package/dist/components/SampleSelector.vue.d.ts +35 -2
  45. package/dist/components/ScheduleCalendar.vue.d.ts +20 -0
  46. package/dist/components/SecretInput.vue.d.ts +28 -0
  47. package/dist/components/SettingsModal.vue.d.ts +1 -1
  48. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +2 -1
  49. package/dist/components/TimePicker.vue.d.ts +1 -0
  50. package/dist/components/WellPlate.geometry.d.ts +15 -0
  51. package/dist/components/WellPlate.interaction.d.ts +13 -0
  52. package/dist/components/WellPlate.vue.d.ts +29 -0
  53. package/dist/components/index.d.ts +9 -0
  54. package/dist/components/index.js +8 -8
  55. package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +2 -0
  56. package/dist/components/internal/DataStateInternal.vue.d.ts +43 -0
  57. package/dist/components/internal/WellEditPopupInternal.vue.d.ts +3 -1
  58. package/dist/components/internal/WorkspaceControlsInternal.vue.d.ts +23 -0
  59. package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +70 -0
  60. package/dist/components/internal/WorkspaceSidebarInternal.vue.d.ts +43 -0
  61. package/dist/{components-DkHddRMl.js → components-CgAUzF8F.js} +2497 -2235
  62. package/dist/components-CgAUzF8F.js.map +1 -0
  63. package/dist/composables/controlSchemaTypes.d.ts +34 -0
  64. package/dist/composables/flattenWorkspaceBindings.d.ts +61 -0
  65. package/dist/composables/index.d.ts +9 -2
  66. package/dist/composables/index.js +10 -10
  67. package/dist/composables/pluginWorkspaceModel.d.ts +164 -0
  68. package/dist/composables/useAsync.d.ts +5 -1
  69. package/dist/composables/useBioTemplateWorkspace.d.ts +4 -20
  70. package/dist/composables/useCommandHistory.d.ts +5 -1
  71. package/dist/composables/useDropdownState.d.ts +18 -2
  72. package/dist/composables/useEventStream.d.ts +9 -0
  73. package/dist/composables/useFocusTrap.d.ts +21 -0
  74. package/dist/composables/useGeneratedAnalysis.d.ts +3 -1
  75. package/dist/composables/useJobsStatusTray.d.ts +25 -1
  76. package/dist/composables/useListReorder.d.ts +90 -0
  77. package/dist/composables/useMenuKeyboard.d.ts +29 -0
  78. package/dist/composables/useOptimisticMutation.d.ts +5 -1
  79. package/dist/composables/usePluginClient.d.ts +2 -0
  80. package/dist/composables/usePluginConfig.d.ts +27 -0
  81. package/dist/composables/usePluginWorkspace.d.ts +51 -0
  82. package/dist/composables/useRequestSyncState.d.ts +42 -2
  83. package/dist/composables/useResourceCrud.d.ts +5 -1
  84. package/dist/composables/useRovingFocus.d.ts +24 -0
  85. package/dist/composables/useScheduleDrag.d.ts +1 -0
  86. package/dist/composables/useWellPainting.d.ts +5 -1
  87. package/dist/composables/useWellPlateAdapter.d.ts +5 -1
  88. package/dist/composables/useWellPlateValidation.d.ts +5 -1
  89. package/dist/composables/workspaceRecipes.d.ts +188 -0
  90. package/dist/{composables-C_i90sGS.js → composables-B_pia3hO.js} +209 -82
  91. package/dist/composables-B_pia3hO.js.map +1 -0
  92. package/dist/{useApi-J6zFkHmn.js → errors-_W0-LbA6.js} +103 -3
  93. package/dist/errors-_W0-LbA6.js.map +1 -0
  94. package/dist/{experiment-Cq145oEW.js → experiment-Cwl9AYxw.js} +3 -8
  95. package/dist/experiment-Cwl9AYxw.js.map +1 -0
  96. package/dist/{experiment-utils-CLnzPPq5.js → experiment-utils-DV3DrvE_.js} +70 -51
  97. package/dist/experiment-utils-DV3DrvE_.js.map +1 -0
  98. package/dist/index.d.ts +1 -0
  99. package/dist/index.js +15 -15
  100. package/dist/install.js +2 -7
  101. package/dist/install.js.map +1 -1
  102. package/dist/permissions.d.ts +42 -1
  103. package/dist/permissions.js +20 -10
  104. package/dist/permissions.js.map +1 -1
  105. package/dist/stores/auth.d.ts +6 -0
  106. package/dist/stores/index.d.ts +1 -1
  107. package/dist/stores/index.js +3 -3
  108. package/dist/stores/settings.d.ts +31 -1
  109. package/dist/styles.css +11247 -29501
  110. package/dist/templates/builderReadUtils.d.ts +1 -1
  111. package/dist/templates/index.js +2 -4
  112. package/dist/{templates-DsP51i-S.js → templates-Qq113pyZ.js} +303 -106
  113. package/dist/templates-Qq113pyZ.js.map +1 -0
  114. package/dist/types/auth.d.ts +1 -0
  115. package/dist/types/form-builder.d.ts +1 -1
  116. package/dist/{useControlSchema-BDx2Olha.js → useControlSchema-aMZlb4Sc.js} +462 -1130
  117. package/dist/useControlSchema-aMZlb4Sc.js.map +1 -0
  118. package/dist/{useDropdownState-DSb3BC3N.js → useDropdownState-DitCtrTT.js} +22 -6
  119. package/dist/useDropdownState-DitCtrTT.js.map +1 -0
  120. package/dist/{useExperimentSelector-CV4iNfMS.js → useExperimentSelector-I8HC8hUu.js} +4 -4
  121. package/dist/{useExperimentSelector-CV4iNfMS.js.map → useExperimentSelector-I8HC8hUu.js.map} +1 -1
  122. package/dist/{useFormBuilder-BLxG3BOX.js → useFormBuilder-TCxNnqeb.js} +2 -2
  123. package/dist/{useFormBuilder-BLxG3BOX.js.map → useFormBuilder-TCxNnqeb.js.map} +1 -1
  124. package/dist/{useProtocolTemplates-CS_SQl6U.js → useProtocolTemplates-BmX_iVBR.js} +766 -212
  125. package/dist/useProtocolTemplates-BmX_iVBR.js.map +1 -0
  126. package/dist/utils/color.d.ts +13 -0
  127. package/dist/utils/errors.d.ts +9 -0
  128. package/dist/utils/pluginSecrets.d.ts +53 -0
  129. package/dist/utils/records.d.ts +4 -0
  130. package/package.json +1 -1
  131. package/src/__tests__/components/ActionMenu.test.ts +94 -0
  132. package/src/__tests__/components/AppAvatarMenu.test.ts +123 -0
  133. package/src/__tests__/components/BaseTabs.test.ts +67 -0
  134. package/src/__tests__/components/DataFrame.test.ts +183 -11
  135. package/src/__tests__/components/DataStates.test.ts +176 -0
  136. package/src/__tests__/components/DatePicker.test.ts +76 -0
  137. package/src/__tests__/components/DateTimePicker.test.ts +36 -0
  138. package/src/__tests__/components/DropdownButton.test.ts +134 -0
  139. package/src/__tests__/components/ExperimentTimeline.test.ts +63 -0
  140. package/src/__tests__/components/GroupAssigner.test.ts +53 -0
  141. package/src/__tests__/components/LcmsSequenceTable.test.ts +22 -0
  142. package/src/__tests__/components/PluginWorkspaceView.internal.test.ts +230 -0
  143. package/src/__tests__/components/RackEditor.test.ts +35 -0
  144. package/src/__tests__/components/ReagentList.test.ts +64 -2
  145. package/src/__tests__/components/RetiredStyles.test.ts +31 -0
  146. package/src/__tests__/components/SampleSelector.drag.test.ts +51 -1
  147. package/src/__tests__/components/ScheduleCalendar.test.ts +63 -0
  148. package/src/__tests__/components/SecretInput.test.ts +87 -0
  149. package/src/__tests__/components/SegmentedControl.test.ts +88 -0
  150. package/src/__tests__/components/TimePicker.test.ts +61 -0
  151. package/src/__tests__/components/WellEditPopupInternal.test.ts +108 -0
  152. package/src/__tests__/components/WellPlate.interaction.test.ts +59 -0
  153. package/src/__tests__/composables/useAuth.test.ts +2 -0
  154. package/src/__tests__/composables/useDropdownState.test.ts +58 -1
  155. package/src/__tests__/composables/useListReorder.test.ts +145 -0
  156. package/src/__tests__/composables/usePluginClient.test.ts +140 -0
  157. package/src/__tests__/composables/usePluginConfig.test.ts +497 -0
  158. package/src/__tests__/composables/useRequestSyncState.test.ts +140 -0
  159. package/src/__tests__/docs/frontendDocsCatalog.test.ts +39 -7
  160. package/src/__tests__/stores/settings.test.ts +71 -1
  161. package/src/__tests__/styles/cssTokens.test.ts +131 -0
  162. package/src/__tests__/utils/permissions.test.ts +68 -0
  163. package/src/components/ActionMenu.vue +45 -88
  164. package/src/components/AlertBox.vue +0 -4
  165. package/src/components/AppAvatarMenu.vue +26 -7
  166. package/src/components/AppLayout.vue +0 -4
  167. package/src/components/AppPluginSwitcher.story.vue +87 -0
  168. package/src/components/AppPluginSwitcher.vue +2 -5
  169. package/src/components/AppSidebar.vue +0 -4
  170. package/src/components/AppToastContainer.vue +6 -8
  171. package/src/components/AppTopBar.vue +0 -4
  172. package/src/components/ArtifactSaveDialog.vue +0 -4
  173. package/src/components/ArtifactSelectorModal.vue +0 -4
  174. package/src/components/AuditTrail.story.vue +18 -0
  175. package/src/components/AuditTrail.vue +27 -7
  176. package/src/components/AutoGroupModal.vue +0 -4
  177. package/src/components/Avatar.vue +0 -4
  178. package/src/components/BaseButton.vue +0 -4
  179. package/src/components/BaseCheckbox.vue +0 -4
  180. package/src/components/BaseInput.vue +0 -4
  181. package/src/components/BaseModal.vue +8 -60
  182. package/src/components/BasePill.vue +0 -4
  183. package/src/components/BaseRadioGroup.vue +0 -4
  184. package/src/components/BaseSelect.vue +0 -4
  185. package/src/components/BaseSlider.vue +0 -4
  186. package/src/components/BaseTabs.vue +26 -5
  187. package/src/components/BaseTextarea.vue +0 -4
  188. package/src/components/BaseToggle.vue +0 -4
  189. package/src/components/BatchProgressList.story.vue +18 -0
  190. package/src/components/BatchProgressList.vue +32 -4
  191. package/src/components/BioTemplateExperimentWorkspaceView.vue +10 -21
  192. package/src/components/BioTemplatePackWorkspaceView.vue +11 -15
  193. package/src/components/BioTemplatePresetWorkspaceView.vue +8 -13
  194. package/src/components/Breadcrumb.vue +0 -4
  195. package/src/components/Calendar.vue +0 -4
  196. package/src/components/ChartContainer.story.vue +1 -1
  197. package/src/components/ChartContainer.vue +0 -4
  198. package/src/components/ChemicalFormula.vue +0 -4
  199. package/src/components/CollapsibleCard.vue +0 -4
  200. package/src/components/ColorSlider.vue +0 -4
  201. package/src/components/ComponentBindingRenderer.vue +1 -3
  202. package/src/components/ConcentrationInput.vue +0 -4
  203. package/src/components/ConfirmDialog.vue +0 -4
  204. package/src/components/ControlWorkspaceView.vue +11 -22
  205. package/src/components/DataFrame.story.vue +14 -0
  206. package/src/components/DataFrame.vue +97 -23
  207. package/src/components/DatePicker.vue +73 -27
  208. package/src/components/DateTimePicker.vue +45 -17
  209. package/src/components/Divider.vue +0 -4
  210. package/src/components/DoseCalculator.vue +0 -4
  211. package/src/components/DoseDesignWorkspaceView.vue +6 -25
  212. package/src/components/DropdownButton.vue +24 -6
  213. package/src/components/EmptyState.vue +0 -4
  214. package/src/components/ExperimentCodeBadge.vue +0 -4
  215. package/src/components/ExperimentDataViewer.story.vue +3 -0
  216. package/src/components/ExperimentDataViewer.vue +33 -13
  217. package/src/components/ExperimentPopover.vue +2 -5
  218. package/src/components/ExperimentSelectorModal.vue +0 -4
  219. package/src/components/ExperimentTimeline.story.vue +18 -0
  220. package/src/components/ExperimentTimeline.vue +81 -75
  221. package/src/components/FileUploader.vue +0 -4
  222. package/src/components/FitPanel.vue +0 -4
  223. package/src/components/FormActions.story.vue +96 -0
  224. package/src/components/FormActions.vue +0 -4
  225. package/src/components/FormBuilder.vue +0 -4
  226. package/src/components/FormField.vue +0 -4
  227. package/src/components/FormulaInput.vue +0 -4
  228. package/src/components/GeneratedPathInput.story.vue +68 -0
  229. package/src/components/GeneratedPlotlyResult.story.vue +96 -0
  230. package/src/components/GeneratedPlotlyResult.vue +3 -3
  231. package/src/components/GeneratedPluginView.story.vue +145 -0
  232. package/src/components/GeneratedPluginView.vue +10 -10
  233. package/src/components/GeneratedResultRenderer.story.vue +117 -0
  234. package/src/components/GeneratedResultRenderer.vue +4 -4
  235. package/src/components/GroupAssigner.vue +67 -5
  236. package/src/components/IconButton.vue +0 -4
  237. package/src/components/InstrumentAlertLog.vue +0 -4
  238. package/src/components/InstrumentStateBadge.vue +0 -4
  239. package/src/components/InstrumentStatusCard.vue +0 -4
  240. package/src/components/JobsStatusTray.vue +16 -5
  241. package/src/components/LcmsSequenceTable.vue +81 -50
  242. package/src/components/LoadingSpinner.vue +0 -4
  243. package/src/components/MobileSupportGate.vue +0 -4
  244. package/src/components/MoleculeInput.vue +0 -4
  245. package/src/components/MultiSelect.vue +0 -4
  246. package/src/components/NumberInput.vue +0 -4
  247. package/src/components/PlateMapEditor.vue +3 -14
  248. package/src/components/PluginIcon.vue +0 -4
  249. package/src/components/PluginWorkspaceView.props.ts +38 -0
  250. package/src/components/PluginWorkspaceView.vue +53 -224
  251. package/src/components/ProgressBar.vue +0 -4
  252. package/src/components/ProtocolStepEditor.vue +2 -4
  253. package/src/components/RackEditor.vue +51 -70
  254. package/src/components/ReagentEditor.vue +0 -4
  255. package/src/components/ReagentList.story.vue +18 -0
  256. package/src/components/ReagentList.vue +127 -82
  257. package/src/components/ResourceCard.vue +0 -4
  258. package/src/components/RuntimeUpdateNotice.story.vue +49 -0
  259. package/src/components/RuntimeUpdateNotice.vue +4 -4
  260. package/src/components/SampleHierarchyTree.story.vue +18 -0
  261. package/src/components/SampleHierarchyTree.vue +32 -9
  262. package/src/components/SampleLegend.vue +2 -8
  263. package/src/components/SampleSelector.drag.ts +51 -0
  264. package/src/components/SampleSelector.story.vue +6 -0
  265. package/src/components/SampleSelector.tree.ts +2 -0
  266. package/src/components/SampleSelector.vue +49 -10
  267. package/src/components/SampleSelectorGroupNode.vue +19 -0
  268. package/src/components/ScheduleCalendar.story.vue +6 -0
  269. package/src/components/ScheduleCalendar.vue +82 -7
  270. package/src/components/ScientificNumber.vue +0 -4
  271. package/src/components/SecretInput.story.vue +79 -0
  272. package/src/components/SecretInput.vue +150 -0
  273. package/src/components/SectionCard.vue +0 -4
  274. package/src/components/SegmentedControl.vue +48 -5
  275. package/src/components/SequenceInput.vue +0 -4
  276. package/src/components/SequenceProgressBar.story.vue +110 -0
  277. package/src/components/SequenceProgressBar.vue +0 -4
  278. package/src/components/SettingsModal.vue +0 -4
  279. package/src/components/Skeleton.vue +0 -4
  280. package/src/components/SmartGroupFieldRecipe.vue +8 -6
  281. package/src/components/SmartGroupManual.vue +0 -4
  282. package/src/components/StatusIndicator.vue +0 -4
  283. package/src/components/StepWizard.vue +0 -4
  284. package/src/components/TagsInput.vue +4 -6
  285. package/src/components/ThemeToggle.vue +0 -4
  286. package/src/components/TimePicker.vue +36 -7
  287. package/src/components/TimeRangeInput.vue +0 -4
  288. package/src/components/Tooltip.story.vue +3 -3
  289. package/src/components/Tooltip.vue +0 -4
  290. package/src/components/UnitInput.vue +0 -4
  291. package/src/components/WellPlate.geometry.ts +60 -1
  292. package/src/components/WellPlate.interaction.ts +44 -0
  293. package/src/components/WellPlate.story.vue +8 -0
  294. package/src/components/WellPlate.vue +53 -7
  295. package/src/components/index.ts +9 -0
  296. package/src/components/internal/AppTopBarPageSelectorInternal.vue +2 -5
  297. package/src/components/internal/AppTopBarPillNavInternal.vue +0 -4
  298. package/src/components/internal/DataStateInternal.vue +74 -0
  299. package/src/components/internal/FormSectionRenderer.vue +0 -4
  300. package/src/components/internal/WellEditPopupInternal.vue +20 -5
  301. package/src/components/internal/WorkspaceControlsInternal.vue +20 -0
  302. package/src/components/internal/WorkspaceShellInternal.vue +125 -0
  303. package/src/components/internal/WorkspaceSidebarInternal.vue +82 -0
  304. package/src/composables/controlSchemaTypes.ts +34 -0
  305. package/src/composables/experimentDesignData.ts +1 -3
  306. package/src/composables/flattenWorkspaceBindings.ts +104 -0
  307. package/src/composables/formBuilderRegistry.ts +5 -0
  308. package/src/composables/index.ts +43 -0
  309. package/src/composables/pluginWorkspaceModel.ts +182 -0
  310. package/src/composables/useAsync.ts +5 -1
  311. package/src/composables/useAuth.ts +3 -0
  312. package/src/composables/useBioTemplatePackWorkspace.ts +15 -9
  313. package/src/composables/useBioTemplatePresetWorkspace.ts +14 -15
  314. package/src/composables/useBioTemplateWorkspace.ts +18 -43
  315. package/src/composables/useCommandHistory.ts +5 -1
  316. package/src/composables/useDropdownState.ts +35 -5
  317. package/src/composables/useEventStream.ts +14 -2
  318. package/src/composables/useFileImport.ts +2 -7
  319. package/src/composables/useFocusTrap.ts +91 -0
  320. package/src/composables/useGeneratedAnalysis.ts +22 -10
  321. package/src/composables/useJobsStatusTray.ts +184 -17
  322. package/src/composables/useListReorder.story.vue +143 -0
  323. package/src/composables/useListReorder.ts +242 -0
  324. package/src/composables/useMenuKeyboard.ts +90 -0
  325. package/src/composables/useOptimisticMutation.ts +6 -16
  326. package/src/composables/usePluginClient.ts +47 -4
  327. package/src/composables/usePluginConfig.ts +252 -0
  328. package/src/composables/usePluginWorkspace.ts +208 -0
  329. package/src/composables/useRackEditor.ts +2 -11
  330. package/src/composables/useRequestSyncState.ts +98 -28
  331. package/src/composables/useResourceCrud.ts +6 -16
  332. package/src/composables/useRovingFocus.ts +66 -0
  333. package/src/composables/useScheduleDrag.ts +37 -0
  334. package/src/composables/useWellPainting.ts +10 -30
  335. package/src/composables/useWellPlateAdapter.ts +5 -1
  336. package/src/composables/useWellPlateEditor.ts +1 -11
  337. package/src/composables/useWellPlateValidation.ts +5 -1
  338. package/src/composables/workspaceRecipes.ts +267 -0
  339. package/src/index.ts +16 -0
  340. package/src/permissions.ts +48 -9
  341. package/src/stores/auth.ts +1 -0
  342. package/src/stores/experiment.ts +2 -7
  343. package/src/stores/index.ts +9 -1
  344. package/src/stores/settings.ts +93 -1
  345. package/src/styles/components/audit-trail.css +5 -5
  346. package/src/styles/components/batch-progress-list.css +7 -0
  347. package/src/styles/components/color-slider.css +2 -2
  348. package/src/styles/components/data-state.css +30 -0
  349. package/src/styles/components/dataframe.css +29 -35
  350. package/src/styles/components/experiment-data-viewer.css +4 -4
  351. package/src/styles/components/experiment-timeline.css +3 -30
  352. package/src/styles/components/form-builder.css +5 -5
  353. package/src/styles/components/lcms-sequence-table.css +16 -1
  354. package/src/styles/components/multi-select.css +1 -1
  355. package/src/styles/components/reagent-list.css +38 -31
  356. package/src/styles/components/sample-hierarchy-tree.css +5 -19
  357. package/src/styles/components/sample-selector.css +9 -2
  358. package/src/styles/components/schedule-calendar.css +8 -0
  359. package/src/styles/components/scientific-number.css +1 -1
  360. package/src/styles/components/secret-input.css +60 -0
  361. package/src/styles/components/well-plate.css +8 -0
  362. package/src/styles/index.css +9 -0
  363. package/src/styles/variables.css +29 -0
  364. package/src/templates/builderPresetControls.ts +1 -1
  365. package/src/templates/builderReadUtils.ts +1 -3
  366. package/src/templates/componentPlateHelpers.ts +3 -1
  367. package/src/templates/componentTargetResolvers.ts +1 -3
  368. package/src/templates/controlSchemaTargets.ts +1 -3
  369. package/src/templates/doseResponseAdapters.ts +2 -13
  370. package/src/templates/elisaAssayCollectionBuilder.ts +2 -2
  371. package/src/templates/plateMapBuilder.ts +2 -2
  372. package/src/templates/qpcrPlateBuilder.ts +1 -1
  373. package/src/templates/templateValidators.ts +1 -1
  374. package/src/templates/timeCourseBuilder.ts +2 -2
  375. package/src/templates/wellPlateScreenCollectionBuilder.ts +2 -2
  376. package/src/types/auth.ts +1 -0
  377. package/src/types/form-builder.ts +1 -0
  378. package/src/utils/color.ts +51 -0
  379. package/src/utils/errors.ts +29 -0
  380. package/src/utils/formModelSync.ts +1 -3
  381. package/src/utils/pluginIcon.ts +1 -3
  382. package/src/utils/pluginSecrets.ts +102 -0
  383. package/src/utils/records.ts +9 -0
  384. package/dist/EmptyState-p90quq8Z.js.map +0 -1
  385. package/dist/ExperimentPopover-tLwJ7XF4.js.map +0 -1
  386. package/dist/ExperimentSelectorModal-DyPAUCLw.js.map +0 -1
  387. package/dist/SettingsModal-BgKY93zh.js.map +0 -1
  388. package/dist/components-DkHddRMl.js.map +0 -1
  389. package/dist/composables/autoGroupConstants.d.ts +0 -1
  390. package/dist/composables/autoGroupGrouping.d.ts +0 -3
  391. package/dist/composables/useAutoGroupInputSources.d.ts +0 -32
  392. package/dist/composables-C_i90sGS.js.map +0 -1
  393. package/dist/experiment-Cq145oEW.js.map +0 -1
  394. package/dist/experiment-utils-CLnzPPq5.js.map +0 -1
  395. package/dist/templates/builderDefaults.d.ts +0 -1
  396. package/dist/templates/plateGeometry.d.ts +0 -4
  397. package/dist/templates-DsP51i-S.js.map +0 -1
  398. package/dist/useApi-J6zFkHmn.js.map +0 -1
  399. package/dist/useControlSchema-BDx2Olha.js.map +0 -1
  400. package/dist/useDropdownState-DSb3BC3N.js.map +0 -1
  401. package/dist/useProtocolTemplates-CS_SQl6U.js.map +0 -1
  402. package/src/__tests__/composables/useAutoGroupInputSources.test.ts +0 -127
  403. package/src/composables/autoGroupConstants.ts +0 -4
  404. package/src/composables/autoGroupGrouping.ts +0 -148
  405. package/src/composables/useAutoGroupInputSources.ts +0 -147
  406. package/src/templates/builderDefaults.ts +0 -11
  407. package/src/templates/plateGeometry.ts +0 -62
  408. /package/dist/__tests__/{composables/useAutoGroupInputSources.test.d.ts → components/DataStates.test.d.ts} +0 -0
@@ -1,3 +1,11 @@
1
1
  export { useAuthStore } from './auth'
2
- export { useSettingsStore, colorPalettes, type SettingsState } from './settings'
2
+ export {
3
+ useSettingsStore,
4
+ tryUseSettingsStore,
5
+ colorPalettes,
6
+ paletteCssVariables,
7
+ tableDensityToSize,
8
+ PALETTE_CSS_VARIABLES,
9
+ type SettingsState,
10
+ } from './settings'
3
11
  export { useExperimentStore } from './experiment'
@@ -1,4 +1,4 @@
1
- import { defineStore } from 'pinia'
1
+ import { defineStore, getActivePinia } from 'pinia'
2
2
  import { ref, watch } from 'vue'
3
3
  import type { ThemeMode, ColorPalette, TableDensity } from '../types'
4
4
 
@@ -62,6 +62,46 @@ export const colorPalettes: Record<ColorPalette, { name: string; hues: [number,
62
62
  pastel: { name: 'Pastel', hues: [200, 340] },
63
63
  }
64
64
 
65
+ /**
66
+ * Custom properties a non-default palette overrides on `<html>`.
67
+ *
68
+ * The saturation/lightness pairs are lifted from the canonical indigo/orange
69
+ * tokens in `styles/variables.css` so only the hue moves; the `default`
70
+ * palette writes nothing at all and the stylesheet values stand.
71
+ */
72
+ export const PALETTE_CSS_VARIABLES = [
73
+ '--color-primary',
74
+ '--color-primary-hover',
75
+ '--color-primary-soft',
76
+ '--color-cta',
77
+ '--color-cta-hover',
78
+ ] as const
79
+
80
+ /** Build the `<html>` custom-property overrides for a palette. */
81
+ export function paletteCssVariables(palette: ColorPalette): Record<string, string> {
82
+ if (palette === 'default') return {}
83
+ const [primaryHue, accentHue] = colorPalettes[palette].hues
84
+ return {
85
+ '--color-primary': `hsl(${primaryHue} 84% 67%)`,
86
+ '--color-primary-hover': `hsl(${primaryHue} 75% 59%)`,
87
+ '--color-primary-soft': `hsl(${primaryHue} 84% 67% / 0.12)`,
88
+ '--color-cta': `hsl(${accentHue} 95% 53%)`,
89
+ '--color-cta-hover': `hsl(${accentHue} 90% 48%)`,
90
+ }
91
+ }
92
+
93
+ /** `DataFrame`-style size that each table density maps onto. */
94
+ const DENSITY_TABLE_SIZE: Record<TableDensity, 'sm' | 'md' | 'lg'> = {
95
+ compact: 'sm',
96
+ normal: 'md',
97
+ comfortable: 'lg',
98
+ }
99
+
100
+ /** Map a table density onto the `size` prop shared by the SDK table components. */
101
+ export function tableDensityToSize(density: TableDensity): 'sm' | 'md' | 'lg' {
102
+ return DENSITY_TABLE_SIZE[density]
103
+ }
104
+
65
105
  function loadSettings(): SettingsState {
66
106
  try {
67
107
  const stored = localStorage.getItem(STORAGE_KEY)
@@ -152,6 +192,8 @@ export const useSettingsStore = defineStore('mint-settings', () => {
152
192
  tableDensity.value = loaded.tableDensity
153
193
 
154
194
  applyTheme()
195
+ applyPalette()
196
+ applyDensity()
155
197
  }
156
198
 
157
199
  function applyTheme() {
@@ -160,11 +202,36 @@ export const useSettingsStore = defineStore('mint-settings', () => {
160
202
  document.documentElement.classList.toggle('dark', dark)
161
203
  }
162
204
 
205
+ /**
206
+ * Write the selected palette's hues onto `<html>` as custom-property
207
+ * overrides. The `default` palette clears them so `styles/variables.css`
208
+ * keeps ownership of the brand colors.
209
+ */
210
+ function applyPalette() {
211
+ if (typeof document === 'undefined') return
212
+ const style = document.documentElement.style
213
+ const overrides = paletteCssVariables(colorPalette.value)
214
+ for (const name of PALETTE_CSS_VARIABLES) {
215
+ const value = overrides[name]
216
+ if (value) style.setProperty(name, value)
217
+ else style.removeProperty(name)
218
+ }
219
+ }
220
+
221
+ /** Mirror the table density onto `<html data-density>` for CSS consumers. */
222
+ function applyDensity() {
223
+ if (typeof document === 'undefined') return
224
+ document.documentElement.dataset.density = tableDensity.value
225
+ }
226
+
163
227
  watch(theme, () => {
164
228
  applyTheme()
165
229
  persistSettings()
166
230
  })
167
231
 
232
+ watch(colorPalette, applyPalette)
233
+ watch(tableDensity, applyDensity)
234
+
168
235
  if (typeof window !== 'undefined' && typeof window.matchMedia === 'function') {
169
236
  window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (event) => {
170
237
  systemPrefersDark.value = event.matches
@@ -206,6 +273,11 @@ export const useSettingsStore = defineStore('mint-settings', () => {
206
273
  return colorPalettes[colorPalette.value].hues
207
274
  }
208
275
 
276
+ /** The `size` the SDK table components default to for the current density. */
277
+ function getTableSize(): 'sm' | 'md' | 'lg' {
278
+ return tableDensityToSize(tableDensity.value)
279
+ }
280
+
209
281
  function isDark(): boolean {
210
282
  return theme.value === 'system' ? systemPrefersDark.value : theme.value === 'dark'
211
283
  }
@@ -222,11 +294,31 @@ export const useSettingsStore = defineStore('mint-settings', () => {
222
294
  tableDensity,
223
295
  initialize,
224
296
  applyTheme,
297
+ applyPalette,
298
+ applyDensity,
225
299
  persistSettings,
226
300
  resetToDefaults,
227
301
  getPaletteHues,
302
+ getTableSize,
228
303
  isDark,
229
304
  getApiBaseUrl,
230
305
  getWsBaseUrl,
231
306
  }
232
307
  })
308
+
309
+ /**
310
+ * Read the settings store without requiring Pinia to be installed.
311
+ *
312
+ * SDK components are mounted standalone (unit tests, Histoire stories, plugin
313
+ * previews) where no Pinia instance exists. They use this to pick up a user's
314
+ * preferences when the platform is running and fall back to their own defaults
315
+ * otherwise, instead of throwing.
316
+ */
317
+ export function tryUseSettingsStore(): ReturnType<typeof useSettingsStore> | null {
318
+ if (!getActivePinia()) return null
319
+ try {
320
+ return useSettingsStore()
321
+ } catch {
322
+ return null
323
+ }
324
+ }
@@ -126,11 +126,11 @@
126
126
  margin-right: 0.125rem;
127
127
  }
128
128
 
129
- .mint-audit-trail__empty {
130
- text-align: center;
131
- padding: 2rem;
132
- color: var(--text-muted);
133
- font-size: 0.875rem;
129
+ /* Empty / loading / error placeholder host (content comes from EmptyState) */
130
+ .mint-audit-trail__state {
131
+ display: flex;
132
+ align-items: center;
133
+ justify-content: center;
134
134
  }
135
135
 
136
136
  /* Size variants */
@@ -194,3 +194,10 @@
194
194
  background-color: var(--bg-hover);
195
195
  color: var(--text-primary);
196
196
  }
197
+
198
+ /* Empty / loading / error placeholder host (content comes from EmptyState) */
199
+ .mint-batch-progress__state {
200
+ display: flex;
201
+ align-items: center;
202
+ justify-content: center;
203
+ }
@@ -61,7 +61,7 @@
61
61
  border-radius: 50%;
62
62
  background: white;
63
63
  cursor: pointer;
64
- border: 2px solid var(--mint-primary, #6366f1);
64
+ border: 2px solid var(--color-primary);
65
65
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
66
66
  transition: transform 0.15s ease;
67
67
  }
@@ -80,7 +80,7 @@
80
80
  border-radius: 50%;
81
81
  background: white;
82
82
  cursor: pointer;
83
- border: 2px solid var(--mint-primary, #6366f1);
83
+ border: 2px solid var(--color-primary);
84
84
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
85
85
  transition: transform 0.15s ease;
86
86
  }
@@ -0,0 +1,30 @@
1
+ /* DataStateInternal — shared loading / error / empty presentation for data components */
2
+
3
+ .mint-data-state {
4
+ display: flex;
5
+ flex-direction: column;
6
+ align-items: center;
7
+ justify-content: center;
8
+ background-color: var(--bg-primary);
9
+ }
10
+
11
+ .mint-data-state--loading {
12
+ gap: 0.75rem;
13
+ padding: 2.5rem 2rem;
14
+ color: var(--text-muted);
15
+ }
16
+
17
+ .mint-data-state--loading.mint-data-state--sm {
18
+ padding: 1.25rem 1rem;
19
+ }
20
+
21
+ .mint-data-state--loading.mint-data-state--lg {
22
+ padding: 3.5rem 2rem;
23
+ }
24
+
25
+ .mint-data-state__loading-text {
26
+ font-size: 0.875rem;
27
+ color: var(--text-muted);
28
+ margin: 0 !important;
29
+ padding: 0 !important;
30
+ }
@@ -187,6 +187,23 @@
187
187
  text-align: center;
188
188
  }
189
189
 
190
+ /* Sortable headers are real buttons; strip the native chrome so the cell keeps
191
+ its table-header appearance while staying keyboard-operable. */
192
+ .mint-dataframe__th-button {
193
+ display: block;
194
+ width: 100%;
195
+ margin: 0;
196
+ padding: 0;
197
+ border: 0;
198
+ background: none;
199
+ color: inherit;
200
+ font: inherit;
201
+ letter-spacing: inherit;
202
+ text-transform: inherit;
203
+ text-align: inherit;
204
+ cursor: inherit;
205
+ }
206
+
190
207
  .mint-dataframe__th-content {
191
208
  display: inline-flex;
192
209
  align-items: center;
@@ -308,7 +325,7 @@
308
325
  }
309
326
 
310
327
  .mint-dataframe__row--clickable:focus-visible {
311
- outline: 2px solid var(--focus-ring-color, var(--color-primary));
328
+ outline: 2px solid var(--color-primary);
312
329
  outline-offset: -2px;
313
330
  }
314
331
 
@@ -352,32 +369,15 @@ html.dark .mint-dataframe__row--selected > .mint-dataframe__td {
352
369
  border-bottom: none;
353
370
  }
354
371
 
355
- /* Empty state */
356
- .mint-dataframe__empty {
372
+ /* Empty / error placeholder host (content comes from EmptyState) */
373
+ .mint-dataframe__state {
357
374
  display: flex;
358
- flex-direction: column;
359
375
  align-items: center;
360
376
  justify-content: center;
361
377
  min-height: 12rem;
362
- padding: 2.5rem 2rem;
363
- color: var(--text-muted);
364
378
  background-color: var(--bg-primary);
365
379
  }
366
380
 
367
- .mint-dataframe__empty-icon {
368
- width: 2.5rem;
369
- height: 2.5rem;
370
- opacity: 0.5;
371
- margin-bottom: 0.5rem;
372
- }
373
-
374
- .mint-dataframe__empty-text {
375
- font-size: 0.875rem;
376
- margin-top: 0 !important;
377
- margin-bottom: 0 !important;
378
- padding: 0 !important;
379
- }
380
-
381
381
  /* Loading overlay */
382
382
  .mint-dataframe__loading {
383
383
  position: absolute;
@@ -395,18 +395,6 @@ html.dark .mint-dataframe__loading {
395
395
  background-color: rgba(0, 0, 0, 0.4);
396
396
  }
397
397
 
398
- .mint-dataframe__loading-spinner {
399
- width: 1.5rem;
400
- height: 1.5rem;
401
- color: var(--color-primary);
402
- animation: mint-dataframe-spin 1s linear infinite;
403
- }
404
-
405
- @keyframes mint-dataframe-spin {
406
- from { transform: rotate(0deg); }
407
- to { transform: rotate(360deg); }
408
- }
409
-
410
398
  /* Footer / Pagination */
411
399
  .mint-dataframe__footer {
412
400
  display: flex;
@@ -502,11 +490,17 @@ html.dark .mint-dataframe__loading {
502
490
  transition: background-color 0.15s ease;
503
491
  }
504
492
 
505
- .mint-dataframe__resize-handle:hover::after {
493
+ .mint-dataframe__resize-handle:hover::after,
494
+ .mint-dataframe__resize-handle:focus-visible::after {
506
495
  width: 2px;
507
496
  background-color: var(--color-primary);
508
497
  }
509
498
 
499
+ .mint-dataframe__resize-handle:focus-visible {
500
+ outline: none;
501
+ box-shadow: var(--focus-ring);
502
+ }
503
+
510
504
  /* Row delete action column */
511
505
  .mint-dataframe__th--actions,
512
506
  .mint-dataframe__td--actions {
@@ -539,8 +533,8 @@ html.dark .mint-dataframe__loading {
539
533
  }
540
534
 
541
535
  .mint-dataframe__delete-btn:hover {
542
- background-color: color-mix(in srgb, var(--color-error, #ef4444) 14%, transparent);
543
- color: var(--color-error, #ef4444);
536
+ background-color: color-mix(in srgb, var(--mint-error) 14%, transparent);
537
+ color: var(--mint-error);
544
538
  }
545
539
 
546
540
  .mint-dataframe__delete-btn:focus-visible {
@@ -27,10 +27,10 @@
27
27
  flex-direction: column;
28
28
  gap: 12px;
29
29
  }
30
- .mint-data-viewer__empty {
31
- text-align: center;
32
- padding: 32px;
33
- color: var(--text-muted);
30
+ .mint-data-viewer__state {
31
+ display: flex;
32
+ align-items: center;
33
+ justify-content: center;
34
34
  }
35
35
 
36
36
  /* Summary view */
@@ -291,7 +291,7 @@
291
291
  .mint-timeline__expanded {
292
292
  margin-top: 0.75rem;
293
293
  padding-top: 0.75rem;
294
- border-top: 1px solid rgba(var(--border-color-rgb, 0, 0, 0), 0.5);
294
+ border-top: 1px solid color-mix(in srgb, var(--border-color) 50%, transparent);
295
295
  }
296
296
 
297
297
  .mint-timeline__description {
@@ -434,42 +434,15 @@
434
434
  width: 2rem;
435
435
  }
436
436
 
437
- /* Empty state */
438
- .mint-timeline__empty {
437
+ /* Empty / loading / error placeholder host (content comes from EmptyState) */
438
+ .mint-timeline__state {
439
439
  display: flex;
440
440
  align-items: center;
441
441
  justify-content: center;
442
- padding: 2rem;
443
442
  border: 2px dashed var(--border-color);
444
443
  border-radius: var(--radius-md);
445
444
  }
446
445
 
447
- .mint-timeline__empty-content {
448
- text-align: center;
449
- }
450
-
451
- .mint-timeline__empty-text {
452
- color: var(--text-muted);
453
- margin-top: 0 !important;
454
- margin-bottom: 0.5rem !important;
455
- padding: 0 !important;
456
- }
457
-
458
- .mint-timeline__empty-btn {
459
- padding: 0.375rem 0.75rem;
460
- font-size: 0.875rem;
461
- background-color: var(--color-primary);
462
- color: white;
463
- border: none;
464
- border-radius: var(--radius-md);
465
- cursor: pointer;
466
- transition: background-color 0.15s ease;
467
- }
468
-
469
- .mint-timeline__empty-btn:hover {
470
- opacity: 0.9;
471
- }
472
-
473
446
  /* Add step button (end) */
474
447
  .mint-timeline__add-end {
475
448
  display: flex;
@@ -40,16 +40,16 @@
40
40
  }
41
41
 
42
42
  .mint-form-section__title {
43
- font-size: var(--font-size-base, 0.9375rem);
43
+ font-size: 0.9375rem;
44
44
  font-weight: 600;
45
- color: var(--color-text, #1a1a2e);
45
+ color: var(--text-primary);
46
46
  margin: 0;
47
47
  line-height: 1.4;
48
48
  }
49
49
 
50
50
  .mint-form-section__description {
51
- font-size: var(--font-size-sm, 0.8125rem);
52
- color: var(--color-text-secondary, #6b7280);
51
+ font-size: 0.8125rem;
52
+ color: var(--text-secondary);
53
53
  margin: 0;
54
54
  line-height: 1.5;
55
55
  }
@@ -65,5 +65,5 @@
65
65
  align-items: center;
66
66
  gap: 0.75rem;
67
67
  padding-top: 1rem;
68
- border-top: 1px solid var(--color-border, #e5e7eb);
68
+ border-top: 1px solid var(--border-color);
69
69
  }
@@ -64,7 +64,11 @@
64
64
  padding-right: 0.25rem;
65
65
  }
66
66
 
67
+ /* The handle is a button so it can also take Alt+Arrow keyboard reordering. */
67
68
  .mint-lcms-sequence-table__drag-handle {
69
+ padding: 0;
70
+ border: 0;
71
+ background: none;
68
72
  color: var(--text-muted, #64748b);
69
73
  cursor: grab;
70
74
  font-family: var(--font-mono, 'Fira Code', monospace);
@@ -72,6 +76,11 @@
72
76
  letter-spacing: -0.08em;
73
77
  }
74
78
 
79
+ .mint-lcms-sequence-table__drag-handle:focus-visible {
80
+ outline: none;
81
+ box-shadow: var(--focus-ring);
82
+ }
83
+
75
84
  .mint-lcms-sequence-table__td {
76
85
  min-width: 0;
77
86
  color: var(--text-primary, #0f172a);
@@ -168,7 +177,6 @@
168
177
  background: color-mix(in srgb, var(--mint-error, #ef4444) 10%, transparent);
169
178
  }
170
179
 
171
- .mint-lcms-sequence-table__empty,
172
180
  .mint-lcms-sequence-table__more {
173
181
  color: var(--text-muted, #64748b);
174
182
  font-size: 0.875rem;
@@ -176,6 +184,13 @@
176
184
  text-align: center;
177
185
  }
178
186
 
187
+ /* Empty / loading / error placeholder host (content comes from EmptyState) */
188
+ .mint-lcms-sequence-table__state {
189
+ display: flex;
190
+ align-items: center;
191
+ justify-content: center;
192
+ }
193
+
179
194
  .mint-lcms-sequence-table__more {
180
195
  border-top: 1px solid var(--border-color, #e2e8f0);
181
196
  padding: 0.625rem 1rem;
@@ -64,7 +64,7 @@
64
64
  }
65
65
 
66
66
  .mint-multi-select__chip--active:hover {
67
- background-color: var(--color-primary-dark, #4338ca);
67
+ background-color: var(--color-primary-hover);
68
68
  }
69
69
 
70
70
  .mint-multi-select__chip--disabled {
@@ -138,6 +138,24 @@
138
138
  color: var(--text-secondary);
139
139
  }
140
140
 
141
+ /* Sortable headers are real buttons; strip the native chrome so the cell keeps
142
+ its table-header look while staying keyboard-operable. */
143
+ .mint-reagent-list__sort-btn {
144
+ display: inline-flex;
145
+ align-items: center;
146
+ width: 100%;
147
+ margin: 0;
148
+ padding: 0;
149
+ border: 0;
150
+ background: none;
151
+ color: inherit;
152
+ font: inherit;
153
+ letter-spacing: inherit;
154
+ text-transform: inherit;
155
+ text-align: inherit;
156
+ cursor: inherit;
157
+ }
158
+
141
159
  .mint-reagent-list__sort-icon {
142
160
  display: inline-block;
143
161
  width: 0.75rem;
@@ -332,45 +350,34 @@
332
350
  height: 1rem;
333
351
  }
334
352
 
335
- /* Empty state */
336
- .mint-reagent-list__empty {
337
- padding: 2rem;
338
- text-align: center;
339
- }
340
-
341
- .mint-reagent-list__empty-icon {
342
- width: 2.5rem;
343
- height: 2.5rem;
344
- margin: 0 auto 0.75rem;
345
- color: var(--text-muted);
346
- opacity: 0.5;
353
+ /* Empty / loading / error placeholder host (content comes from EmptyState) */
354
+ .mint-reagent-list__state {
355
+ display: flex;
356
+ align-items: center;
357
+ justify-content: center;
347
358
  }
348
359
 
349
- .mint-reagent-list__empty-text {
350
- font-size: 0.875rem;
351
- color: var(--text-muted);
352
- margin-top: 0 !important;
353
- margin-bottom: 0.75rem !important;
354
- padding: 0 !important;
360
+ /* Drag handle */
361
+ /* The drag handle doubles as the keyboard reorder target (Alt+Arrow). */
362
+ .mint-reagent-list__drag-handle-btn {
363
+ display: inline-flex;
364
+ align-items: center;
365
+ padding: 0;
366
+ border: 0;
367
+ background: none;
368
+ color: inherit;
369
+ cursor: grab;
355
370
  }
356
371
 
357
- .mint-reagent-list__empty-btn {
358
- padding: 0.375rem 0.75rem;
359
- font-size: 0.875rem;
360
- font-weight: 500;
361
- color: white;
362
- background-color: var(--color-primary);
363
- border: none;
364
- border-radius: var(--radius);
365
- cursor: pointer;
366
- transition: background-color 0.15s ease;
372
+ .mint-reagent-list__drag-handle-btn:focus-visible {
373
+ outline: none;
374
+ box-shadow: var(--focus-ring);
367
375
  }
368
376
 
369
- .mint-reagent-list__empty-btn:hover {
370
- background-color: var(--color-primary-hover);
377
+ .mint-reagent-list__drag-handle-btn:focus-visible .mint-reagent-list__drag-handle {
378
+ opacity: 1;
371
379
  }
372
380
 
373
- /* Drag handle */
374
381
  .mint-reagent-list__drag-handle {
375
382
  width: 1rem;
376
383
  color: var(--text-muted);
@@ -288,23 +288,9 @@
288
288
  }
289
289
  }
290
290
 
291
- /* Empty state */
292
- .mint-sample-tree__empty {
293
- padding: 1rem;
294
- text-align: center;
295
- color: var(--text-muted);
296
- }
297
-
298
- .mint-sample-tree__empty-icon {
299
- width: 2rem;
300
- height: 2rem;
301
- margin: 0 auto 0.5rem;
302
- opacity: 0.5;
303
- }
304
-
305
- .mint-sample-tree__empty-text {
306
- font-size: 0.875rem;
307
- margin-top: 0 !important;
308
- margin-bottom: 0 !important;
309
- padding: 0 !important;
291
+ /* Empty / loading / error placeholder host (content comes from EmptyState) */
292
+ .mint-sample-tree__state {
293
+ display: flex;
294
+ align-items: center;
295
+ justify-content: center;
310
296
  }
@@ -468,14 +468,21 @@
468
468
  height: 0.625rem;
469
469
  }
470
470
 
471
- /* Empty State */
472
- .mint-sample-selector__empty {
471
+ /* Inline hint shown inside the grouped/flat sub-lists */
472
+ .mint-sample-selector__hint {
473
473
  text-align: center;
474
474
  padding: 1rem;
475
475
  font-size: 0.875rem;
476
476
  color: var(--text-muted);
477
477
  }
478
478
 
479
+ /* Empty / loading / error placeholder host (content comes from EmptyState) */
480
+ .mint-sample-selector__state {
481
+ display: flex;
482
+ align-items: center;
483
+ justify-content: center;
484
+ }
485
+
479
486
  /* Ungrouped Section */
480
487
  .mint-sample-selector__ungrouped {
481
488
  margin-top: 0.75rem;
@@ -470,3 +470,11 @@
470
470
  .mint-schedule__month-more:hover {
471
471
  text-decoration: underline;
472
472
  }
473
+
474
+ /* Empty / loading / error placeholder host (content comes from EmptyState) */
475
+ .mint-schedule__state {
476
+ display: flex;
477
+ align-items: center;
478
+ justify-content: center;
479
+ min-height: 12rem;
480
+ }
@@ -59,5 +59,5 @@
59
59
  }
60
60
 
61
61
  .mint-sci-number__copy-btn--copied {
62
- color: var(--color-success, #10b981);
62
+ color: var(--mint-success);
63
63
  }