@morscherlab/mint-sdk 1.2.10 → 1.3.0-beta.10

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 (841) hide show
  1. package/README.md +45 -137
  2. package/dist/ResourcePickerListInternal-CFAw4vTZ.js +605 -0
  3. package/dist/ResourcePickerListInternal-CFAw4vTZ.js.map +1 -0
  4. package/dist/__stories__/experiment-helpers.d.ts +12 -1
  5. package/dist/__tests__/components/ScientificNumber.test.d.ts +1 -0
  6. package/dist/__tests__/components/SequenceInput.test.d.ts +1 -0
  7. package/dist/__tests__/components/Skeleton.test.d.ts +1 -0
  8. package/dist/__tests__/components/SmartGroupFieldRecipe.test.d.ts +1 -0
  9. package/dist/__tests__/components/SmartGroupModal.test.d.ts +1 -0
  10. package/dist/__tests__/components/StepWizard.test.d.ts +1 -0
  11. package/dist/__tests__/components/TimeRangeInput.test.d.ts +1 -0
  12. package/dist/__tests__/components/UnitInput.test.d.ts +1 -0
  13. package/dist/__tests__/components/WellPlate.keyboard.test.d.ts +1 -0
  14. package/dist/__tests__/components/WellPlate.sampleTypeIndicator.test.d.ts +1 -0
  15. package/dist/__tests__/composables/useChemicalFormula.test.d.ts +1 -0
  16. package/dist/__tests__/composables/useRackEditor.test.d.ts +1 -0
  17. package/dist/__tests__/composables/useSequenceUtils.test.d.ts +1 -0
  18. package/dist/__tests__/styles/baseControlsRules.test.d.ts +1 -0
  19. package/dist/__tests__/styles/controlRefreshRules.test.d.ts +1 -0
  20. package/dist/__tests__/styles/darkModeRules.test.d.ts +1 -0
  21. package/dist/__tests__/styles/menusShellRefresh.test.d.ts +1 -0
  22. package/dist/__tests__/templates/templatesDeprecation.test.d.ts +1 -0
  23. package/dist/__tests__/utils/plotlyTemplate.test.d.ts +1 -0
  24. package/dist/__tests__/utils/sampleTypeMarker.test.d.ts +1 -0
  25. package/dist/{analysisArtifactTypes-DQ0MjwHZ.js → analysisArtifactTypes-Cy3D0Ipg.js} +1 -1
  26. package/dist/{analysisArtifactTypes-DQ0MjwHZ.js.map → analysisArtifactTypes-Cy3D0Ipg.js.map} +1 -1
  27. package/dist/components/ActionMenu.vue.d.ts +17 -5
  28. package/dist/components/AdductText.vue.d.ts +3 -2
  29. package/dist/components/AlertBox.vue.d.ts +11 -14
  30. package/dist/components/AppAvatarMenu.vue.d.ts +18 -28
  31. package/dist/components/AppContainer.vue.d.ts +7 -11
  32. package/dist/components/AppLayout.vue.d.ts +11 -13
  33. package/dist/components/AppSidebar.vue.d.ts +30 -28
  34. package/dist/components/AppToastContainer.vue.d.ts +2 -1
  35. package/dist/components/AppTopBar.vue.d.ts +45 -44
  36. package/dist/components/ArtifactSaveDialog.vue.d.ts +3 -2
  37. package/dist/components/ArtifactSelectorModal.vue.d.ts +5 -6
  38. package/dist/components/AuditTrail.vue.d.ts +17 -18
  39. package/dist/components/AutoGroupModal.vue.d.ts +4 -3
  40. package/dist/components/Avatar.vue.d.ts +2 -1
  41. package/dist/components/BaseButton.vue.d.ts +11 -13
  42. package/dist/components/BaseCheckbox.vue.d.ts +7 -1
  43. package/dist/components/BaseInput.vue.d.ts +15 -2
  44. package/dist/components/BaseModal.vue.d.ts +20 -23
  45. package/dist/components/BasePill.vue.d.ts +10 -13
  46. package/dist/components/BaseRadioGroup.vue.d.ts +2 -1
  47. package/dist/components/BaseSelect.vue.d.ts +3 -2
  48. package/dist/components/BaseSlider.vue.d.ts +18 -1
  49. package/dist/components/BaseTabs.vue.d.ts +2 -1
  50. package/dist/components/BaseTextarea.vue.d.ts +2 -1
  51. package/dist/components/BaseToggle.vue.d.ts +2 -1
  52. package/dist/components/BatchProgressList.vue.d.ts +22 -26
  53. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +7 -14
  54. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +6 -13
  55. package/dist/components/BioTemplatePresetWorkspaceView.vue.d.ts +7 -14
  56. package/dist/components/BioTemplateRenderer.vue.d.ts +2 -1
  57. package/dist/components/Breadcrumb.vue.d.ts +13 -16
  58. package/dist/components/Calendar.vue.d.ts +21 -23
  59. package/dist/components/ChartContainer.vue.d.ts +19 -25
  60. package/dist/components/ChemicalFormula.vue.d.ts +7 -11
  61. package/dist/components/CollapsibleCard.vue.d.ts +7 -11
  62. package/dist/components/ComponentBindingRenderer.vue.d.ts +2 -1
  63. package/dist/components/ConcentrationInput.vue.d.ts +2 -1
  64. package/dist/components/ConfirmDialog.vue.d.ts +10 -13
  65. package/dist/components/ControlWorkspaceView.vue.d.ts +9 -18
  66. package/dist/components/DataFrame.vue.d.ts +27 -24
  67. package/dist/components/DatePicker.vue.d.ts +3 -6
  68. package/dist/components/DateTimePicker.vue.d.ts +3 -6
  69. package/dist/components/Divider.vue.d.ts +3 -2
  70. package/dist/components/DoseCalculator.vue.d.ts +2 -1
  71. package/dist/components/DoseCalculatorVolumeField.vue.d.ts +2 -1
  72. package/dist/components/DoseDesignWorkspaceView.vue.d.ts +9 -18
  73. package/dist/components/EmptyState.vue.d.ts +9 -12
  74. package/dist/components/ExperimentCodeBadge.vue.d.ts +2 -1
  75. package/dist/components/ExperimentDataViewer.vue.d.ts +13 -15
  76. package/dist/components/ExperimentPopover.vue.d.ts +3 -5
  77. package/dist/components/ExperimentSelectorModal.vue.d.ts +3 -4
  78. package/dist/components/ExperimentTimeline.vue.d.ts +13 -15
  79. package/dist/components/FilePicker.vue.d.ts +10 -5
  80. package/dist/components/FileUploader.vue.d.ts +8 -16
  81. package/dist/components/FitPanel.vue.d.ts +26 -16
  82. package/dist/components/FormActions.vue.d.ts +2 -1
  83. package/dist/components/FormBuilder.vue.d.ts +54 -250
  84. package/dist/components/FormField.vue.d.ts +14 -16
  85. package/dist/components/FormulaInput.vue.d.ts +2 -1
  86. package/dist/components/GeneratedPathInput.vue.d.ts +6 -5
  87. package/dist/components/GeneratedPlotlyResult.vue.d.ts +2 -1
  88. package/dist/components/GeneratedPluginView.vue.d.ts +2 -1
  89. package/dist/components/GeneratedResultRenderer.vue.d.ts +2 -1
  90. package/dist/components/GroupAssigner.vue.d.ts +2 -1
  91. package/dist/components/IconButton.vue.d.ts +7 -11
  92. package/dist/components/InstrumentStateBadge.vue.d.ts +4 -3
  93. package/dist/components/JobsStatusTray.vue.d.ts +13 -29
  94. package/dist/components/LayoutResizeHandle.vue.d.ts +2 -1
  95. package/dist/components/LoadingSpinner.vue.d.ts +2 -1
  96. package/dist/components/MobileSupportGate.vue.d.ts +5 -13
  97. package/dist/components/MoleculeInput.vue.d.ts +3 -4
  98. package/dist/components/MultiSelect.vue.d.ts +2 -1
  99. package/dist/components/NumberInput.vue.d.ts +2 -1
  100. package/dist/components/PlateEditor.vue.d.ts +147 -0
  101. package/dist/components/PlotlyChart.vue.d.ts +21 -31
  102. package/dist/components/PluginIcon.vue.d.ts +2 -1
  103. package/dist/components/PluginWorkspaceView.props.d.ts +2 -6
  104. package/dist/components/PluginWorkspaceView.vue.d.ts +23 -51
  105. package/dist/components/ProgressBar.vue.d.ts +4 -9
  106. package/dist/components/ProtocolStepEditor.vue.d.ts +7 -5
  107. package/dist/components/ProtocolStepParameterField.vue.d.ts +2 -1
  108. package/dist/components/ReagentEditor.vue.d.ts +2 -1
  109. package/dist/components/ReagentList.presentation.d.ts +2 -1
  110. package/dist/components/ReagentList.vue.d.ts +15 -17
  111. package/dist/components/ResourceCard.vue.d.ts +18 -17
  112. package/dist/components/RuntimeUpdateNotice.vue.d.ts +3 -2
  113. package/dist/components/SampleHierarchyTree.vue.d.ts +21 -15
  114. package/dist/components/SampleLegend.vue.d.ts +2 -1
  115. package/dist/components/SampleSelector.vue.d.ts +15 -21
  116. package/dist/components/SampleSelectorGroupNode.vue.d.ts +2 -1
  117. package/dist/components/SampleSelectorSampleRow.vue.d.ts +2 -5
  118. package/dist/components/ScheduleCalendar.vue.d.ts +34 -36
  119. package/dist/components/ScientificNumber.vue.d.ts +3 -2
  120. package/dist/components/SearchableSelect.vue.d.ts +14 -32
  121. package/dist/components/SecretInput.vue.d.ts +2 -1
  122. package/dist/components/SectionCard.vue.d.ts +13 -14
  123. package/dist/components/SegmentedControl.vue.d.ts +2 -1
  124. package/dist/components/SequenceInput.vue.d.ts +10 -21
  125. package/dist/components/SequenceProgressBar.vue.d.ts +2 -1
  126. package/dist/components/SettingsModal.schema.d.ts +1 -1
  127. package/dist/components/SettingsModal.vue.d.ts +28 -25
  128. package/dist/components/Skeleton.vue.d.ts +2 -1
  129. package/dist/components/SmartGroup.types.d.ts +2 -2
  130. package/dist/components/SmartGroupFieldRecipe.groups.d.ts +2 -0
  131. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +4 -7
  132. package/dist/components/SmartGroupManual.vue.d.ts +3 -2
  133. package/dist/components/SmartGroupModal.vue.d.ts +6 -4
  134. package/dist/components/StatusIndicator.vue.d.ts +2 -1
  135. package/dist/components/StepWizard.vue.d.ts +26 -27
  136. package/dist/components/TagsInput.vue.d.ts +3 -5
  137. package/dist/components/ThemeToggle.vue.d.ts +2 -1
  138. package/dist/components/TimePicker.vue.d.ts +6 -6
  139. package/dist/components/TimeRangeInput.vue.d.ts +9 -2
  140. package/dist/components/Tooltip.vue.d.ts +8 -18
  141. package/dist/components/UnitInput.vue.d.ts +2 -1
  142. package/dist/components/WellPlate.colors.d.ts +2 -4
  143. package/dist/components/WellPlate.rendering.d.ts +7 -1
  144. package/dist/components/WellPlate.sampleDrop.d.ts +2 -0
  145. package/dist/components/WellPlate.vue.d.ts +22 -39
  146. package/dist/components/index.d.ts +34 -31
  147. package/dist/components/index.js +5 -8
  148. package/dist/components/internal/ActionItemInternal.vue.d.ts +11 -13
  149. package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +14 -23
  150. package/dist/components/internal/AppTopBarPillNavInternal.vue.d.ts +2 -1
  151. package/dist/components/internal/CalendarGridPanelInternal.vue.d.ts +2 -1
  152. package/dist/components/internal/DataStateInternal.vue.d.ts +7 -11
  153. package/dist/components/internal/{FilePickerTreeInternal.vue.d.ts → FilePickerListInternal.vue.d.ts} +9 -6
  154. package/dist/components/internal/FilePickerPreviewInternal.vue.d.ts +4 -3
  155. package/dist/components/internal/FormFieldRendererInternal.vue.d.ts +16 -18
  156. package/dist/components/internal/FormSectionRenderer.vue.d.ts +36 -32
  157. package/dist/components/internal/PlateEditorBindingInternal.vue.d.ts +8 -0
  158. package/dist/components/internal/ResourcePickerListInternal.vue.d.ts +65 -0
  159. package/dist/components/internal/SettingsPaneHeadInternal.vue.d.ts +15 -0
  160. package/dist/components/internal/WellEditPopupInternal.vue.d.ts +12 -4
  161. package/dist/components/internal/WorkspaceControlsInternal.vue.d.ts +6 -13
  162. package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +19 -42
  163. package/dist/components/internal/WorkspaceSidebarInternal.vue.d.ts +9 -19
  164. package/dist/components/internal/filePickerPresentation.d.ts +8 -0
  165. package/dist/components/internal/generatedJobsApi.d.ts +9 -0
  166. package/dist/{components-Bbg_gtzF.js → components-GDDvof8D.js} +7088 -5955
  167. package/dist/components-GDDvof8D.js.map +1 -0
  168. package/dist/composables/controlSchemaTypes.d.ts +4 -43
  169. package/dist/composables/createFilePickerAdapter.d.ts +5 -1
  170. package/dist/composables/filePicker/usePickerNavigation.d.ts +7 -2
  171. package/dist/composables/index.d.ts +2 -13
  172. package/dist/composables/index.js +7 -11
  173. package/dist/composables/pluginWorkspaceModel.d.ts +1 -3
  174. package/dist/composables/useAutoGroup.d.ts +10 -0
  175. package/dist/composables/useBioTemplateComponents.d.ts +15 -3
  176. package/dist/composables/useBioTemplateControls.d.ts +5 -1
  177. package/dist/composables/useBioTemplatePackWorkspace.d.ts +2 -0
  178. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +5 -1
  179. package/dist/composables/useBioTemplateWorkspace.d.ts +5 -1
  180. package/dist/composables/useChemicalFormula.d.ts +2 -1
  181. package/dist/composables/useDropdownState.d.ts +5 -0
  182. package/dist/composables/useExperimentSave.d.ts +5 -1
  183. package/dist/composables/useFileBrowser.d.ts +3 -2
  184. package/dist/composables/useFilePicker.d.ts +25 -13
  185. package/dist/composables/useFocusTrap.d.ts +2 -1
  186. package/dist/composables/useGroupAssignment.d.ts +5 -1
  187. package/dist/composables/useJobsStatusTray.d.ts +5 -5
  188. package/dist/composables/useMenuKeyboard.d.ts +3 -3
  189. package/dist/composables/usePlatformContext.d.ts +3 -0
  190. package/dist/composables/usePluginClient.d.ts +1 -1
  191. package/dist/composables/useRackEditor.d.ts +36 -1
  192. package/dist/composables/useSequenceUtils.d.ts +8 -0
  193. package/dist/composables/useTemplateCollection.d.ts +5 -1
  194. package/dist/composables/workspaceRecipes.d.ts +1 -0
  195. package/dist/composables-D6uqp0UF.js +591 -0
  196. package/dist/composables-D6uqp0UF.js.map +1 -0
  197. package/dist/{errors-BLuqMee5.js → experiment-DgllIc3I.js} +89 -333
  198. package/dist/experiment-DgllIc3I.js.map +1 -0
  199. package/dist/{experiment-utils-CV2Wza3z.js → experiment-utils-DTANyVKV.js} +68 -37
  200. package/dist/experiment-utils-DTANyVKV.js.map +1 -0
  201. package/dist/index.d.ts +2 -0
  202. package/dist/index.js +122 -17
  203. package/dist/index.js.map +1 -1
  204. package/dist/install.js +1 -2
  205. package/dist/install.js.map +1 -1
  206. package/dist/instrument.d.ts +6 -0
  207. package/dist/lcms.d.ts +11 -0
  208. package/dist/permissions.d.ts +2 -47
  209. package/dist/permissions.js +2 -26
  210. package/dist/permissions.js.map +1 -1
  211. package/dist/settings-BLr8lzw6.js +341 -0
  212. package/dist/settings-BLr8lzw6.js.map +1 -0
  213. package/dist/stores/auth.d.ts +2 -150
  214. package/dist/stores/experiment.d.ts +2 -106
  215. package/dist/stores/index.js +2 -2
  216. package/dist/stores/settings.d.ts +2 -44
  217. package/dist/styles.css +8608 -6950
  218. package/dist/tailwind.preset.js.map +1 -1
  219. package/dist/templates/adapters.d.ts +3 -0
  220. package/dist/templates/assayMatrixAdapters.d.ts +8 -1
  221. package/dist/templates/assayMatrixBuilder.d.ts +1 -0
  222. package/dist/templates/builderPresetControls.d.ts +1 -0
  223. package/dist/templates/calibrationCurveAdapters.d.ts +3 -0
  224. package/dist/templates/calibrationCurveBuilder.d.ts +1 -0
  225. package/dist/templates/catalog.d.ts +6 -2
  226. package/dist/templates/componentBindings.d.ts +31 -5
  227. package/dist/templates/componentPlateHelpers.d.ts +7 -1
  228. package/dist/templates/controlSchemas.d.ts +9 -0
  229. package/dist/templates/defaultBioTemplateBuilder.d.ts +1 -0
  230. package/dist/templates/doseResponseAdapters.d.ts +2 -0
  231. package/dist/templates/doseResponseBuilder.d.ts +1 -0
  232. package/dist/templates/elisaAssayCollectionBuilder.d.ts +1 -0
  233. package/dist/templates/flowCytometryAssayCollectionBuilder.d.ts +1 -0
  234. package/dist/templates/flowCytometryPanelBuilder.d.ts +1 -0
  235. package/dist/templates/flowPanelAdapters.d.ts +3 -0
  236. package/dist/templates/index.d.ts +1 -1
  237. package/dist/templates/index.js +2 -3
  238. package/dist/templates/instrumentRunAdapters.d.ts +13 -2
  239. package/dist/templates/instrumentRunBuilder.d.ts +1 -0
  240. package/dist/templates/lcmsBatchCollectionBuilder.d.ts +1 -0
  241. package/dist/templates/packs.d.ts +4 -0
  242. package/dist/templates/plateMapAdapters.d.ts +2 -0
  243. package/dist/templates/plateMapBuilder.d.ts +1 -0
  244. package/dist/templates/presets.d.ts +6 -2
  245. package/dist/templates/protocolAdapters.d.ts +4 -0
  246. package/dist/templates/protocolStepsBuilder.d.ts +1 -0
  247. package/dist/templates/qpcrAdapters.d.ts +4 -0
  248. package/dist/templates/qpcrExpressionCollectionBuilder.d.ts +1 -0
  249. package/dist/templates/qpcrPlateBuilder.d.ts +1 -0
  250. package/dist/templates/reagentAdapters.d.ts +4 -0
  251. package/dist/templates/reagentListBuilder.d.ts +1 -0
  252. package/dist/templates/samplePrepAdapters.d.ts +3 -0
  253. package/dist/templates/samplePrepBuilder.d.ts +1 -0
  254. package/dist/templates/sampleSheetAdapters.d.ts +4 -0
  255. package/dist/templates/sampleSheetBuilder.d.ts +1 -0
  256. package/dist/templates/targetedMetabolomicsCollectionBuilder.d.ts +1 -0
  257. package/dist/templates/templateEnvelopes.d.ts +8 -0
  258. package/dist/templates/templatePackCollectionBuilder.d.ts +1 -0
  259. package/dist/templates/templatePresetCollectionBuilder.d.ts +2 -0
  260. package/dist/templates/templateValidators.d.ts +12 -0
  261. package/dist/templates/timeCourseAdapters.d.ts +4 -0
  262. package/dist/templates/timeCourseBuilder.d.ts +1 -0
  263. package/dist/templates/wellPlateScreenCollectionBuilder.d.ts +1 -0
  264. package/dist/templates/westernBlotAssayCollectionBuilder.d.ts +1 -0
  265. package/dist/templates-BU1pet28.js +12304 -0
  266. package/dist/templates-BU1pet28.js.map +1 -0
  267. package/dist/types/auth.d.ts +0 -27
  268. package/dist/types/componentLabTypes.d.ts +14 -7
  269. package/dist/types/componentWorkflowTypes.d.ts +26 -0
  270. package/dist/types/components.d.ts +40 -17
  271. package/dist/types/fileBrowserTypes.d.ts +13 -0
  272. package/dist/types/filePicker.d.ts +19 -1
  273. package/dist/types/generated-ui.d.ts +13 -0
  274. package/dist/types/index.d.ts +4 -4
  275. package/dist/types/index.js +1 -1
  276. package/dist/types/instrument.d.ts +43 -15
  277. package/dist/types/platform.d.ts +2 -0
  278. package/dist/utils/color.d.ts +6 -1
  279. package/dist/utils/formModelSync.d.ts +1 -0
  280. package/dist/utils/plotlyTemplate.d.ts +3 -0
  281. package/dist/utils/rack.d.ts +16 -0
  282. package/dist/utils/sampleTypeMarker.d.ts +23 -0
  283. package/dist/{validation-ChMyixAf.js → validation-Dmp9Q5W0.js} +3032 -838
  284. package/dist/validation-Dmp9Q5W0.js.map +1 -0
  285. package/package.json +17 -23
  286. package/src/__stories__/experiment-helpers.ts +8 -4
  287. package/src/__tests__/components/ActionMenu.test.ts +66 -0
  288. package/src/__tests__/components/AlertBox.test.ts +21 -0
  289. package/src/__tests__/components/AppAvatarMenu.test.ts +25 -0
  290. package/src/__tests__/components/AppTopBar.test.ts +79 -0
  291. package/src/__tests__/components/AppTopBarPageSelector.test.ts +20 -0
  292. package/src/__tests__/components/AppTopBarPillNav.test.ts +74 -0
  293. package/src/__tests__/components/ArtifactSelectorModal.test.ts +20 -6
  294. package/src/__tests__/components/AuditTrail.test.ts +38 -0
  295. package/src/__tests__/components/BaseCheckbox.test.ts +43 -0
  296. package/src/__tests__/components/BaseInput.test.ts +43 -0
  297. package/src/__tests__/components/BaseModal.test.ts +90 -0
  298. package/src/__tests__/components/BaseRadioGroup.test.ts +8 -0
  299. package/src/__tests__/components/BaseSlider.test.ts +116 -0
  300. package/src/__tests__/components/BaseToggle.test.ts +7 -0
  301. package/src/__tests__/components/BatchProgressList.test.ts +22 -14
  302. package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +4 -4
  303. package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +1 -1
  304. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +8 -8
  305. package/src/__tests__/components/BioTemplateRenderer.test.ts +2 -2
  306. package/src/__tests__/components/Breadcrumb.test.ts +45 -0
  307. package/src/__tests__/components/CalendarGridPanel.test.ts +14 -0
  308. package/src/__tests__/components/ChartContainer.test.ts +23 -0
  309. package/src/__tests__/components/ChemicalFormula.test.ts +15 -0
  310. package/src/__tests__/components/CollapsibleCard.test.ts +12 -9
  311. package/src/__tests__/components/ComponentBindingRenderer.test.ts +45 -17
  312. package/src/__tests__/components/ConcentrationInput.test.ts +17 -2
  313. package/src/__tests__/components/DataFrame.test.ts +107 -4
  314. package/src/__tests__/components/DataStates.test.ts +0 -16
  315. package/src/__tests__/components/DatePicker.test.ts +10 -0
  316. package/src/__tests__/components/DoseCalculator.test.ts +47 -0
  317. package/src/__tests__/components/DoseCalculatorVolumeField.test.ts +37 -34
  318. package/src/__tests__/components/EmptyState.test.ts +16 -1
  319. package/src/__tests__/components/ExperimentSelectorModal.test.ts +31 -3
  320. package/src/__tests__/components/ExperimentTimeline.test.ts +45 -0
  321. package/src/__tests__/components/FilePicker.state.test.ts +2 -2
  322. package/src/__tests__/components/FilePicker.test.ts +360 -13
  323. package/src/__tests__/components/FileUploader.test.ts +15 -0
  324. package/src/__tests__/components/FitPanel.test.ts +96 -0
  325. package/src/__tests__/components/FormulaInput.test.ts +97 -0
  326. package/src/__tests__/components/GeneratedPathInput.test.ts +168 -41
  327. package/src/__tests__/components/GeneratedPlotlyResult.test.ts +1 -1
  328. package/src/__tests__/components/GeneratedResultRenderer.test.ts +47 -2
  329. package/src/__tests__/components/InstrumentStateBadge.test.ts +50 -0
  330. package/src/__tests__/components/JobsStatusTray.test.ts +27 -0
  331. package/src/__tests__/components/MoleculeInput.test.ts +78 -0
  332. package/src/__tests__/components/MultiSelect.test.ts +6 -0
  333. package/src/__tests__/components/PlateEditor.test.ts +1134 -0
  334. package/src/__tests__/components/PlateEditorBindingInternal.test.ts +64 -0
  335. package/src/__tests__/components/PlotlyChart.test.ts +147 -1
  336. package/src/__tests__/components/ProgressBar.test.ts +18 -0
  337. package/src/__tests__/components/ProtocolStepEditor.test.ts +106 -18
  338. package/src/__tests__/components/ProtocolStepParameterField.test.ts +74 -29
  339. package/src/__tests__/components/ReagentList.presentation.test.ts +10 -5
  340. package/src/__tests__/components/ReagentList.test.ts +23 -0
  341. package/src/__tests__/components/ResourcePickerListInternal.test.ts +141 -0
  342. package/src/__tests__/components/RetiredStyles.test.ts +0 -6
  343. package/src/__tests__/components/SampleHierarchyTree.test.ts +102 -0
  344. package/src/__tests__/components/SampleLegend.test.ts +18 -0
  345. package/src/__tests__/components/SampleSelector.test.ts +92 -1
  346. package/src/__tests__/components/SampleSelectorSampleRow.test.ts +5 -2
  347. package/src/__tests__/components/ScheduleCalendar.test.ts +32 -0
  348. package/src/__tests__/components/ScientificNumber.test.ts +113 -0
  349. package/src/__tests__/components/SearchableSelect.test.ts +21 -0
  350. package/src/__tests__/components/SecretInput.test.ts +6 -0
  351. package/src/__tests__/components/SegmentedControl.test.ts +14 -0
  352. package/src/__tests__/components/SequenceInput.test.ts +81 -0
  353. package/src/__tests__/components/SettingsModal.schema.test.ts +5 -5
  354. package/src/__tests__/components/SettingsModal.test.ts +371 -23
  355. package/src/__tests__/components/Skeleton.test.ts +23 -0
  356. package/src/__tests__/components/SmartGroupFieldRecipe.test.ts +12 -0
  357. package/src/__tests__/components/SmartGroupModal.test.ts +69 -0
  358. package/src/__tests__/components/StepWizard.test.ts +75 -0
  359. package/src/__tests__/components/TagsInput.test.ts +16 -0
  360. package/src/__tests__/components/TimePicker.test.ts +66 -0
  361. package/src/__tests__/components/TimeRangeInput.test.ts +83 -0
  362. package/src/__tests__/components/UnitInput.test.ts +147 -0
  363. package/src/__tests__/components/WellEditPopupInternal.test.ts +434 -2
  364. package/src/__tests__/components/WellPlate.decoration.test.ts +18 -0
  365. package/src/__tests__/components/WellPlate.geometry.test.ts +13 -0
  366. package/src/__tests__/components/WellPlate.interaction.test.ts +213 -0
  367. package/src/__tests__/components/WellPlate.keyboard.test.ts +24 -0
  368. package/src/__tests__/components/WellPlate.rendering.test.ts +38 -19
  369. package/src/__tests__/components/WellPlate.sampleDrop.test.ts +19 -0
  370. package/src/__tests__/components/WellPlate.sampleTypeIndicator.test.ts +58 -0
  371. package/src/__tests__/composables/createFilePickerAdapter.test.ts +114 -1
  372. package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +1 -1
  373. package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +1 -1
  374. package/src/__tests__/composables/useChemicalFormula.test.ts +60 -0
  375. package/src/__tests__/composables/useControlSchema.test.ts +15 -5
  376. package/src/__tests__/composables/useDropdownState.test.ts +20 -1
  377. package/src/__tests__/composables/useGeneratedAnalysis.test.ts +52 -0
  378. package/src/__tests__/composables/usePickerNavigation.test.ts +61 -1
  379. package/src/__tests__/composables/usePlatformFilePickerAdapter.test.ts +18 -6
  380. package/src/__tests__/composables/useRackEditor.test.ts +270 -0
  381. package/src/__tests__/composables/useSequenceUtils.test.ts +28 -0
  382. package/src/__tests__/docs/frontendDocsCatalog.test.ts +44 -9
  383. package/src/__tests__/styles/baseControlsRules.test.ts +115 -0
  384. package/src/__tests__/styles/controlRefreshRules.test.ts +218 -0
  385. package/src/__tests__/styles/cssTokens.test.ts +7 -5
  386. package/src/__tests__/styles/darkModeRules.test.ts +47 -0
  387. package/src/__tests__/styles/menusShellRefresh.test.ts +75 -0
  388. package/src/__tests__/templates/templates.test.ts +65 -15
  389. package/src/__tests__/templates/templatesDeprecation.test.ts +78 -0
  390. package/src/__tests__/utils/permissions.test.ts +0 -68
  391. package/src/__tests__/utils/plotlyTemplate.test.ts +69 -0
  392. package/src/__tests__/utils/sampleTypeMarker.test.ts +54 -0
  393. package/src/components/ActionMenu.vue +44 -23
  394. package/src/components/AdductText.story.vue +18 -0
  395. package/src/components/AdductText.vue +7 -1
  396. package/src/components/AlertBox.vue +3 -7
  397. package/src/components/AppAvatarMenu.vue +12 -10
  398. package/src/components/AppSidebar.vue +1 -1
  399. package/src/components/AppTopBar.story.vue +47 -4
  400. package/src/components/AppTopBar.vue +16 -22
  401. package/src/components/ArtifactSelectorModal.story.vue +1 -1
  402. package/src/components/ArtifactSelectorModal.vue +48 -160
  403. package/src/components/AuditTrail.vue +26 -12
  404. package/src/components/AutoGroupModal.vue +1 -1
  405. package/src/components/BaseCheckbox.story.vue +58 -2
  406. package/src/components/BaseCheckbox.vue +21 -3
  407. package/src/components/BaseInput.story.vue +51 -0
  408. package/src/components/BaseInput.vue +62 -1
  409. package/src/components/BaseModal.story.vue +55 -0
  410. package/src/components/BaseModal.vue +83 -50
  411. package/src/components/BaseRadioGroup.vue +1 -1
  412. package/src/components/BaseSlider.story.vue +36 -0
  413. package/src/components/BaseSlider.vue +56 -8
  414. package/src/components/BaseToggle.vue +1 -7
  415. package/src/components/BatchProgressList.vue +50 -52
  416. package/src/components/BioTemplatePresetWorkspaceView.vue +1 -1
  417. package/src/components/Breadcrumb.story.vue +1 -1
  418. package/src/components/Breadcrumb.vue +50 -15
  419. package/src/components/ChartContainer.story.vue +42 -0
  420. package/src/components/ChartContainer.vue +22 -1
  421. package/src/components/ChemicalFormula.story.vue +11 -11
  422. package/src/components/ChemicalFormula.vue +1 -0
  423. package/src/components/CollapsibleCard.vue +12 -32
  424. package/src/components/ComponentBindingRenderer.vue +6 -8
  425. package/src/components/ConcentrationInput.story.vue +1 -1
  426. package/src/components/ConcentrationInput.vue +8 -14
  427. package/src/components/ControlWorkspaceView.vue +1 -1
  428. package/src/components/DataFrame.story.vue +45 -2
  429. package/src/components/DataFrame.vue +28 -13
  430. package/src/components/DatePicker.story.vue +11 -0
  431. package/src/components/DatePicker.vue +5 -5
  432. package/src/components/DateTimePicker.story.vue +1 -1
  433. package/src/components/DateTimePicker.vue +8 -5
  434. package/src/components/Divider.story.vue +1 -1
  435. package/src/components/DoseCalculator.vue +44 -51
  436. package/src/components/DoseCalculatorVolumeField.vue +22 -35
  437. package/src/components/DoseDesignWorkspaceView.vue +1 -1
  438. package/src/components/EmptyState.story.vue +4 -4
  439. package/src/components/EmptyState.vue +4 -2
  440. package/src/components/ExperimentPopover.story.vue +2 -2
  441. package/src/components/ExperimentPopover.vue +6 -4
  442. package/src/components/ExperimentSelectorModal.story.vue +2 -1
  443. package/src/components/ExperimentSelectorModal.vue +91 -261
  444. package/src/components/ExperimentTimeline.story.vue +29 -0
  445. package/src/components/ExperimentTimeline.vue +20 -0
  446. package/src/components/FilePicker.story.vue +65 -10
  447. package/src/components/FilePicker.vue +203 -121
  448. package/src/components/FitPanel.story.vue +72 -6
  449. package/src/components/FitPanel.vue +70 -18
  450. package/src/components/FormField.vue +2 -0
  451. package/src/components/FormulaInput.story.vue +6 -0
  452. package/src/components/FormulaInput.vue +49 -70
  453. package/src/components/GeneratedPathInput.story.vue +121 -8
  454. package/src/components/GeneratedPathInput.vue +155 -86
  455. package/src/components/GeneratedPlotlyResult.vue +1 -1
  456. package/src/components/GeneratedPluginView.vue +4 -4
  457. package/src/components/GeneratedResultRenderer.vue +19 -0
  458. package/src/components/InstrumentStateBadge.story.vue +41 -0
  459. package/src/components/InstrumentStateBadge.vue +24 -14
  460. package/src/components/JobsStatusTray.vue +30 -8
  461. package/src/components/MoleculeInput.vue +12 -7
  462. package/src/components/MultiSelect.vue +3 -3
  463. package/src/components/PlateEditor.story.vue +333 -0
  464. package/src/components/PlateEditor.vue +793 -0
  465. package/src/components/PlotlyChart.story.vue +37 -1
  466. package/src/components/PlotlyChart.vue +86 -16
  467. package/src/components/PluginWorkspaceView.props.ts +1 -7
  468. package/src/components/PluginWorkspaceView.vue +0 -4
  469. package/src/components/ProgressBar.story.vue +0 -30
  470. package/src/components/ProgressBar.vue +3 -53
  471. package/src/components/ProtocolStepEditor.story.vue +8 -0
  472. package/src/components/ProtocolStepEditor.vue +55 -145
  473. package/src/components/ProtocolStepParameterField.vue +55 -93
  474. package/src/components/ReagentList.presentation.ts +7 -6
  475. package/src/components/ReagentList.vue +18 -17
  476. package/src/components/SampleHierarchyTree.story.vue +19 -0
  477. package/src/components/SampleHierarchyTree.vue +47 -14
  478. package/src/components/SampleLegend.vue +12 -4
  479. package/src/components/SampleSelector.story.vue +5 -1
  480. package/src/components/SampleSelector.vue +25 -15
  481. package/src/components/SampleSelectorGroupNode.vue +10 -20
  482. package/src/components/SampleSelectorSampleRow.vue +7 -18
  483. package/src/components/ScheduleCalendar.story.vue +14 -0
  484. package/src/components/ScheduleCalendar.vue +13 -1
  485. package/src/components/ScientificNumber.story.vue +15 -2
  486. package/src/components/ScientificNumber.vue +22 -26
  487. package/src/components/SearchableSelect.vue +14 -9
  488. package/src/components/SecretInput.vue +1 -1
  489. package/src/components/SegmentedControl.story.vue +23 -0
  490. package/src/components/SegmentedControl.vue +6 -1
  491. package/src/components/SequenceInput.story.vue +27 -5
  492. package/src/components/SequenceInput.vue +74 -29
  493. package/src/components/SequenceProgressBar.vue +0 -1
  494. package/src/components/SettingsModal.schema.ts +4 -2
  495. package/src/components/SettingsModal.story.vue +83 -22
  496. package/src/components/SettingsModal.vue +338 -79
  497. package/src/components/Skeleton.vue +6 -35
  498. package/src/components/SmartGroup.types.ts +2 -2
  499. package/src/components/SmartGroupFieldRecipe.groups.ts +4 -1
  500. package/src/components/SmartGroupFieldRecipe.vue +14 -8
  501. package/src/components/SmartGroupManual.vue +14 -11
  502. package/src/components/StepWizard.vue +16 -19
  503. package/src/components/TagsInput.story.vue +16 -11
  504. package/src/components/TagsInput.vue +20 -3
  505. package/src/components/TimePicker.story.vue +38 -3
  506. package/src/components/TimePicker.vue +26 -11
  507. package/src/components/TimeRangeInput.story.vue +50 -1
  508. package/src/components/TimeRangeInput.vue +36 -17
  509. package/src/components/UnitInput.story.vue +1 -1
  510. package/src/components/UnitInput.vue +173 -107
  511. package/src/components/WellPlate.colors.ts +7 -6
  512. package/src/components/WellPlate.geometry.ts +3 -0
  513. package/src/components/WellPlate.interaction.ts +39 -5
  514. package/src/components/WellPlate.rendering.ts +21 -27
  515. package/src/components/WellPlate.sampleDrop.ts +20 -12
  516. package/src/components/WellPlate.story.vue +18 -7
  517. package/src/components/WellPlate.vue +28 -22
  518. package/src/components/index.ts +34 -31
  519. package/src/components/internal/AppTopBarPageSelectorInternal.vue +13 -7
  520. package/src/components/internal/AppTopBarPillNavInternal.vue +12 -7
  521. package/src/components/internal/CalendarGridPanelInternal.vue +1 -1
  522. package/src/components/internal/FilePickerListInternal.vue +318 -0
  523. package/src/components/internal/FilePickerPreviewInternal.vue +54 -52
  524. package/src/components/internal/PlateEditorBindingInternal.vue +37 -0
  525. package/src/components/internal/ResourcePickerListInternal.vue +237 -0
  526. package/src/components/internal/SettingsPaneHeadInternal.vue +41 -0
  527. package/src/components/internal/WellEditPopupInternal.vue +219 -146
  528. package/src/components/internal/WorkspaceShellInternal.vue +0 -6
  529. package/src/components/internal/filePickerPresentation.ts +30 -0
  530. package/src/components/internal/generatedJobsApi.ts +12 -0
  531. package/src/composables/autoGroup/index.ts +3 -0
  532. package/src/composables/controlSchemaAdapters.ts +0 -4
  533. package/src/composables/controlSchemaFormFields.ts +0 -4
  534. package/src/composables/controlSchemaTypes.ts +4 -43
  535. package/src/composables/createFilePickerAdapter.ts +90 -22
  536. package/src/composables/filePicker/localFiles.ts +1 -0
  537. package/src/composables/filePicker/usePickerNavigation.ts +29 -2
  538. package/src/composables/index.ts +2 -71
  539. package/src/composables/pluginWorkspaceModel.ts +0 -3
  540. package/src/composables/useAutoGroup.ts +10 -0
  541. package/src/composables/useBioTemplateComponents.ts +15 -3
  542. package/src/composables/useBioTemplateControls.ts +5 -1
  543. package/src/composables/useBioTemplatePackWorkspace.ts +2 -0
  544. package/src/composables/useBioTemplatePresetWorkspace.ts +5 -1
  545. package/src/composables/useBioTemplateWorkspace.ts +5 -1
  546. package/src/composables/useChemicalFormula.ts +39 -13
  547. package/src/composables/useDropdownState.ts +6 -1
  548. package/src/composables/useExperimentSave.ts +5 -1
  549. package/src/composables/useFileBrowser.ts +3 -2
  550. package/src/composables/useFilePicker.ts +98 -13
  551. package/src/composables/useFocusTrap.ts +9 -6
  552. package/src/composables/useGeneratedAnalysis.ts +38 -0
  553. package/src/composables/useGroupAssignment.ts +5 -1
  554. package/src/composables/useJobsStatusTray.ts +5 -5
  555. package/src/composables/useMenuKeyboard.ts +5 -3
  556. package/src/composables/usePlatformFilePickerAdapter.ts +26 -4
  557. package/src/composables/usePluginClient.ts +1 -1
  558. package/src/composables/usePluginWorkspace.ts +0 -1
  559. package/src/composables/useRackEditor.ts +202 -12
  560. package/src/composables/useSequenceUtils.ts +20 -2
  561. package/src/composables/useTemplateCollection.ts +5 -1
  562. package/src/composables/workspaceRecipes.ts +1 -0
  563. package/src/index.ts +9 -3
  564. package/src/instrument.ts +6 -0
  565. package/src/lcms.ts +11 -0
  566. package/src/permissions.ts +2 -59
  567. package/src/styles/components/action-menu.css +9 -38
  568. package/src/styles/components/adduct-text.css +15 -3
  569. package/src/styles/components/alert-box.css +19 -70
  570. package/src/styles/components/app-avatar-menu.css +22 -57
  571. package/src/styles/components/app-container.css +4 -4
  572. package/src/styles/components/app-layout.css +18 -18
  573. package/src/styles/components/app-page-selector.css +50 -105
  574. package/src/styles/components/app-pill-nav.css +24 -42
  575. package/src/styles/components/app-sidebar.css +2 -2
  576. package/src/styles/components/app-top-bar.css +78 -55
  577. package/src/styles/components/artifact-selector-modal.css +1 -211
  578. package/src/styles/components/audit-trail.css +45 -38
  579. package/src/styles/components/avatar.css +1 -1
  580. package/src/styles/components/batch-progress-list.css +179 -95
  581. package/src/styles/components/breadcrumb.css +34 -15
  582. package/src/styles/components/calendar.css +2 -8
  583. package/src/styles/components/chart-container.css +81 -38
  584. package/src/styles/components/checkbox.css +8 -6
  585. package/src/styles/components/chemical-formula.css +8 -6
  586. package/src/styles/components/collapsible-card.css +6 -46
  587. package/src/styles/components/concentration-input.css +1 -10
  588. package/src/styles/components/dataframe.css +48 -67
  589. package/src/styles/components/date-picker.css +124 -62
  590. package/src/styles/components/datetime-picker.css +81 -47
  591. package/src/styles/components/divider.css +2 -4
  592. package/src/styles/components/dose-calculator.css +9 -135
  593. package/src/styles/components/empty-state.css +26 -35
  594. package/src/styles/components/experiment-code-badge.css +1 -1
  595. package/src/styles/components/experiment-popover.css +16 -83
  596. package/src/styles/components/experiment-selector-modal.css +9 -226
  597. package/src/styles/components/experiment-timeline.css +120 -50
  598. package/src/styles/components/file-picker.css +323 -299
  599. package/src/styles/components/file-uploader.css +4 -6
  600. package/src/styles/components/fit-panel.css +108 -22
  601. package/src/styles/components/form-field.css +6 -4
  602. package/src/styles/components/formula-input.css +121 -48
  603. package/src/styles/components/group-assigner.css +1 -3
  604. package/src/styles/components/icon-button.css +15 -37
  605. package/src/styles/components/input.css +91 -2
  606. package/src/styles/components/instrument-monitor.css +37 -447
  607. package/src/styles/components/jobs-status-tray.css +82 -61
  608. package/src/styles/components/loading-spinner.css +18 -0
  609. package/src/styles/components/mobile-support-gate.css +15 -17
  610. package/src/styles/components/modal.css +44 -33
  611. package/src/styles/components/molecule-input.css +31 -16
  612. package/src/styles/components/multi-select.css +33 -29
  613. package/src/styles/components/number-input.css +1 -1
  614. package/src/styles/components/plate-editor.css +497 -0
  615. package/src/styles/components/popover.css +162 -0
  616. package/src/styles/components/progress-bar.css +1 -70
  617. package/src/styles/components/protocol-step-editor.css +21 -333
  618. package/src/styles/components/radio-group.css +9 -18
  619. package/src/styles/components/reagent-editor.css +3 -7
  620. package/src/styles/components/reagent-list.css +63 -69
  621. package/src/styles/components/resource-card.css +4 -6
  622. package/src/styles/components/resource-picker-list.css +212 -0
  623. package/src/styles/components/sample-hierarchy-tree.css +83 -65
  624. package/src/styles/components/sample-legend.css +18 -7
  625. package/src/styles/components/sample-selector.css +41 -68
  626. package/src/styles/components/schedule-calendar.css +59 -54
  627. package/src/styles/components/scientific-number.css +72 -18
  628. package/src/styles/components/searchable-select.css +17 -26
  629. package/src/styles/components/secret-input.css +20 -23
  630. package/src/styles/components/section-card.css +3 -5
  631. package/src/styles/components/segmented-control.css +14 -1
  632. package/src/styles/components/select.css +19 -8
  633. package/src/styles/components/sequence-input.css +85 -37
  634. package/src/styles/components/sequence-progress-bar.css +18 -37
  635. package/src/styles/components/settings-modal.css +683 -34
  636. package/src/styles/components/skeleton.css +24 -23
  637. package/src/styles/components/slider.css +74 -8
  638. package/src/styles/components/smart-group.css +27 -39
  639. package/src/styles/components/status-indicator.css +1 -1
  640. package/src/styles/components/step-wizard.css +62 -99
  641. package/src/styles/components/tabs.css +2 -6
  642. package/src/styles/components/tags-input.css +64 -54
  643. package/src/styles/components/textarea.css +2 -2
  644. package/src/styles/components/time-picker.css +67 -38
  645. package/src/styles/components/time-range-input.css +16 -18
  646. package/src/styles/components/toast.css +1 -1
  647. package/src/styles/components/toggle.css +21 -31
  648. package/src/styles/components/tooltip.css +13 -15
  649. package/src/styles/components/unit-input.css +86 -36
  650. package/src/styles/components/well-edit-popup.css +111 -189
  651. package/src/styles/components/well-plate.css +7 -7
  652. package/src/styles/index.css +5 -7
  653. package/src/styles/variables.css +35 -7
  654. package/src/templates/adapters.ts +4 -0
  655. package/src/templates/assayMatrixAdapters.ts +8 -1
  656. package/src/templates/assayMatrixBuilder.ts +1 -0
  657. package/src/templates/builderPresetControls.ts +1 -0
  658. package/src/templates/calibrationCurveAdapters.ts +3 -0
  659. package/src/templates/calibrationCurveBuilder.ts +1 -0
  660. package/src/templates/catalog.ts +6 -2
  661. package/src/templates/componentBindingCatalog.ts +1 -1
  662. package/src/templates/componentBindings.ts +31 -5
  663. package/src/templates/componentDoseResponseProps.ts +0 -1
  664. package/src/templates/componentPlateHelpers.ts +22 -1
  665. package/src/templates/componentPlateMapProps.ts +7 -5
  666. package/src/templates/componentQpcrPlateProps.ts +0 -1
  667. package/src/templates/controlSchemas.ts +9 -0
  668. package/src/templates/defaultBioTemplateBuilder.ts +1 -0
  669. package/src/templates/doseResponseAdapters.ts +2 -0
  670. package/src/templates/doseResponseBuilder.ts +1 -0
  671. package/src/templates/elisaAssayCollectionBuilder.ts +1 -0
  672. package/src/templates/flowCytometryAssayCollectionBuilder.ts +1 -0
  673. package/src/templates/flowCytometryPanelBuilder.ts +1 -0
  674. package/src/templates/flowPanelAdapters.ts +3 -0
  675. package/src/templates/index.ts +4 -0
  676. package/src/templates/instrumentRunAdapters.ts +13 -2
  677. package/src/templates/instrumentRunBuilder.ts +1 -0
  678. package/src/templates/lcmsBatchCollectionBuilder.ts +1 -0
  679. package/src/templates/packs.ts +4 -0
  680. package/src/templates/plateMapAdapters.ts +2 -0
  681. package/src/templates/plateMapBuilder.ts +1 -0
  682. package/src/templates/presets.ts +6 -2
  683. package/src/templates/protocolAdapters.ts +4 -0
  684. package/src/templates/protocolStepsBuilder.ts +1 -0
  685. package/src/templates/qpcrAdapters.ts +4 -0
  686. package/src/templates/qpcrExpressionCollectionBuilder.ts +1 -0
  687. package/src/templates/qpcrPlateBuilder.ts +1 -0
  688. package/src/templates/reagentAdapters.ts +4 -0
  689. package/src/templates/reagentListBuilder.ts +1 -0
  690. package/src/templates/samplePrepAdapters.ts +3 -0
  691. package/src/templates/samplePrepBuilder.ts +1 -0
  692. package/src/templates/sampleSheetAdapters.ts +4 -0
  693. package/src/templates/sampleSheetBuilder.ts +1 -0
  694. package/src/templates/targetedMetabolomicsCollectionBuilder.ts +1 -0
  695. package/src/templates/templateEnvelopes.ts +8 -0
  696. package/src/templates/templatePackCollectionBuilder.ts +1 -0
  697. package/src/templates/templatePresetCollectionBuilder.ts +2 -0
  698. package/src/templates/templateValidators.ts +12 -0
  699. package/src/templates/timeCourseAdapters.ts +4 -0
  700. package/src/templates/timeCourseBuilder.ts +1 -0
  701. package/src/templates/wellPlateScreenCollectionBuilder.ts +1 -0
  702. package/src/templates/westernBlotAssayCollectionBuilder.ts +1 -0
  703. package/src/types/auth.ts +0 -37
  704. package/src/types/componentLabTypes.ts +16 -13
  705. package/src/types/componentWorkflowTypes.ts +29 -0
  706. package/src/types/components.ts +43 -20
  707. package/src/types/fileBrowserTypes.ts +15 -0
  708. package/src/types/filePicker.ts +19 -1
  709. package/src/types/generated-ui.ts +15 -0
  710. package/src/types/index.ts +12 -11
  711. package/src/types/instrument.ts +47 -15
  712. package/src/types/platform.ts +2 -0
  713. package/src/utils/color.ts +16 -1
  714. package/src/utils/formModelSync.ts +1 -1
  715. package/src/utils/plotlyTemplate.ts +39 -0
  716. package/src/utils/rack.ts +16 -0
  717. package/src/utils/sampleTypeMarker.ts +44 -0
  718. package/dist/ExperimentPopover-CJdNlCZb.js +0 -451
  719. package/dist/ExperimentPopover-CJdNlCZb.js.map +0 -1
  720. package/dist/ExperimentSelectorModal-DHE9k8TP.js +0 -507
  721. package/dist/ExperimentSelectorModal-DHE9k8TP.js.map +0 -1
  722. package/dist/SettingsModal-DELMkUFR.js +0 -492
  723. package/dist/SettingsModal-DELMkUFR.js.map +0 -1
  724. package/dist/Skeleton-jhF9wUkU.js +0 -485
  725. package/dist/Skeleton-jhF9wUkU.js.map +0 -1
  726. package/dist/__tests__/composables/usePluginConfig.test.d.ts +0 -15
  727. package/dist/chunk-BoAXSpZd.js +0 -33
  728. package/dist/components/AppPluginSwitcher.vue.d.ts +0 -40
  729. package/dist/components/ColorSlider.vue.d.ts +0 -34
  730. package/dist/components/DropdownButton.vue.d.ts +0 -49
  731. package/dist/components/FileBrowserModal.vue.d.ts +0 -99
  732. package/dist/components/InstrumentAlertLog.vue.d.ts +0 -22
  733. package/dist/components/InstrumentStatusCard.vue.d.ts +0 -13
  734. package/dist/components/LcmsSequenceTable.vue.d.ts +0 -54
  735. package/dist/components/PlateMapEditor.vue.d.ts +0 -50
  736. package/dist/components/RackEditor.vue.d.ts +0 -78
  737. package/dist/components/fileBrowserPresentation.d.ts +0 -10
  738. package/dist/components/internal/FileBrowserDialogInternal.vue.d.ts +0 -34
  739. package/dist/components/internal/FileBrowserListingInternal.vue.d.ts +0 -25
  740. package/dist/components/internal/FileBrowserToolbarInternal.vue.d.ts +0 -26
  741. package/dist/components/internal/PlateMapEditorToolbarInternal.vue.d.ts +0 -28
  742. package/dist/components-Bbg_gtzF.js.map +0 -1
  743. package/dist/composables/useAsync.d.ts +0 -132
  744. package/dist/composables/useAuth.d.ts +0 -47
  745. package/dist/composables/useCommandHistory.d.ts +0 -33
  746. package/dist/composables/useOptimisticMutation.d.ts +0 -32
  747. package/dist/composables/usePasskey.d.ts +0 -10
  748. package/dist/composables/usePluginConfig.d.ts +0 -27
  749. package/dist/composables/useResourceCrud.d.ts +0 -44
  750. package/dist/composables/useWellPainting.d.ts +0 -39
  751. package/dist/composables/useWellPlateAdapter.d.ts +0 -40
  752. package/dist/composables/useWellPlateEditor.d.ts +0 -33
  753. package/dist/composables/useWellPlateValidation.d.ts +0 -31
  754. package/dist/composables-BCbYb2lA.js +0 -2356
  755. package/dist/composables-BCbYb2lA.js.map +0 -1
  756. package/dist/errors-BLuqMee5.js.map +0 -1
  757. package/dist/experiment-CVDRAnqp.js +0 -90
  758. package/dist/experiment-CVDRAnqp.js.map +0 -1
  759. package/dist/experiment-utils-CV2Wza3z.js.map +0 -1
  760. package/dist/plotly.min-c2Sez60c.js +0 -180634
  761. package/dist/plotly.min-c2Sez60c.js.map +0 -1
  762. package/dist/templates-NuaNHohp.js +0 -5260
  763. package/dist/templates-NuaNHohp.js.map +0 -1
  764. package/dist/useControlSchema-vLiRPUmj.js +0 -7301
  765. package/dist/useControlSchema-vLiRPUmj.js.map +0 -1
  766. package/dist/useDropdownState-C7hRiVQf.js +0 -63
  767. package/dist/useDropdownState-C7hRiVQf.js.map +0 -1
  768. package/dist/useExperimentSelector-G_CAOFTX.js +0 -328
  769. package/dist/useExperimentSelector-G_CAOFTX.js.map +0 -1
  770. package/dist/useFormBuilder-D37ajgS8.js +0 -729
  771. package/dist/useFormBuilder-D37ajgS8.js.map +0 -1
  772. package/dist/validation-ChMyixAf.js.map +0 -1
  773. package/src/__tests__/components/AppPluginSwitcher.test.ts +0 -44
  774. package/src/__tests__/components/DropdownButton.test.ts +0 -628
  775. package/src/__tests__/components/FileBrowserModal.test.ts +0 -460
  776. package/src/__tests__/components/InstrumentAlertLog.test.ts +0 -59
  777. package/src/__tests__/components/LcmsSequenceTable.test.ts +0 -79
  778. package/src/__tests__/components/PlateMapEditorToolbarInternal.test.ts +0 -54
  779. package/src/__tests__/components/RackEditor.test.ts +0 -169
  780. package/src/__tests__/composables/useAuth.test.ts +0 -233
  781. package/src/__tests__/composables/useCommandHistory.test.ts +0 -43
  782. package/src/__tests__/composables/useOptimisticMutation.test.ts +0 -40
  783. package/src/__tests__/composables/usePluginConfig.test.ts +0 -497
  784. package/src/__tests__/composables/useResourceCrud.test.ts +0 -56
  785. package/src/__tests__/composables/useWellPainting.test.ts +0 -52
  786. package/src/__tests__/composables/useWellPlateAdapter.test.ts +0 -50
  787. package/src/__tests__/composables/useWellPlateValidation.test.ts +0 -42
  788. package/src/components/AppPluginSwitcher.story.vue +0 -87
  789. package/src/components/AppPluginSwitcher.vue +0 -134
  790. package/src/components/ColorSlider.story.vue +0 -120
  791. package/src/components/ColorSlider.vue +0 -160
  792. package/src/components/DropdownButton.story.vue +0 -102
  793. package/src/components/DropdownButton.vue +0 -181
  794. package/src/components/FileBrowserModal.story.vue +0 -203
  795. package/src/components/FileBrowserModal.vue +0 -384
  796. package/src/components/InstrumentAlertLog.vue +0 -187
  797. package/src/components/InstrumentStatusCard.vue +0 -184
  798. package/src/components/LcmsSequenceTable.vue +0 -222
  799. package/src/components/PlateMapEditor.story.vue +0 -92
  800. package/src/components/PlateMapEditor.vue +0 -423
  801. package/src/components/RackEditor.story.vue +0 -100
  802. package/src/components/RackEditor.vue +0 -429
  803. package/src/components/fileBrowserPresentation.ts +0 -39
  804. package/src/components/internal/FileBrowserDialogInternal.vue +0 -75
  805. package/src/components/internal/FileBrowserListingInternal.vue +0 -197
  806. package/src/components/internal/FileBrowserToolbarInternal.vue +0 -136
  807. package/src/components/internal/FilePickerTreeInternal.vue +0 -238
  808. package/src/components/internal/PlateMapEditorToolbarInternal.vue +0 -128
  809. package/src/composables/useAsync.ts +0 -327
  810. package/src/composables/useAuth.ts +0 -458
  811. package/src/composables/useCommandHistory.ts +0 -117
  812. package/src/composables/useOptimisticMutation.ts +0 -97
  813. package/src/composables/usePasskey.ts +0 -216
  814. package/src/composables/usePluginConfig.ts +0 -252
  815. package/src/composables/useResourceCrud.ts +0 -235
  816. package/src/composables/useWellPainting.ts +0 -167
  817. package/src/composables/useWellPlateAdapter.ts +0 -151
  818. package/src/composables/useWellPlateEditor.ts +0 -415
  819. package/src/composables/useWellPlateValidation.ts +0 -89
  820. package/src/plotly-dist.d.ts +0 -3
  821. package/src/styles/components/app-plugin-switcher.css +0 -196
  822. package/src/styles/components/color-slider.css +0 -110
  823. package/src/styles/components/dropdown-button.css +0 -280
  824. package/src/styles/components/file-browser-modal.css +0 -489
  825. package/src/styles/components/lcms-sequence-table.css +0 -204
  826. package/src/styles/components/plate-map-editor.css +0 -464
  827. package/src/styles/components/rack-editor.css +0 -287
  828. /package/dist/__tests__/components/{AppPluginSwitcher.test.d.ts → AlertBox.test.d.ts} +0 -0
  829. /package/dist/__tests__/components/{DropdownButton.test.d.ts → AuditTrail.test.d.ts} +0 -0
  830. /package/dist/__tests__/components/{FileBrowserModal.test.d.ts → BaseCheckbox.test.d.ts} +0 -0
  831. /package/dist/__tests__/components/{InstrumentAlertLog.test.d.ts → BaseSlider.test.d.ts} +0 -0
  832. /package/dist/__tests__/components/{LcmsSequenceTable.test.d.ts → DoseCalculator.test.d.ts} +0 -0
  833. /package/dist/__tests__/components/{PlateMapEditorToolbarInternal.test.d.ts → FileUploader.test.d.ts} +0 -0
  834. /package/dist/__tests__/components/{RackEditor.test.d.ts → FitPanel.test.d.ts} +0 -0
  835. /package/dist/__tests__/{composables/useAuth.test.d.ts → components/FormulaInput.test.d.ts} +0 -0
  836. /package/dist/__tests__/{composables/useCommandHistory.test.d.ts → components/InstrumentStateBadge.test.d.ts} +0 -0
  837. /package/dist/__tests__/{composables/useOptimisticMutation.test.d.ts → components/MoleculeInput.test.d.ts} +0 -0
  838. /package/dist/__tests__/{composables/useResourceCrud.test.d.ts → components/PlateEditor.test.d.ts} +0 -0
  839. /package/dist/__tests__/{composables/useWellPainting.test.d.ts → components/PlateEditorBindingInternal.test.d.ts} +0 -0
  840. /package/dist/__tests__/{composables/useWellPlateAdapter.test.d.ts → components/ResourcePickerListInternal.test.d.ts} +0 -0
  841. /package/dist/__tests__/{composables/useWellPlateValidation.test.d.ts → components/SampleLegend.test.d.ts} +0 -0
@@ -1,6 +1,6 @@
1
1
  <script setup lang="ts">
2
2
  /** Collapsible tree visualizing the biological sample hierarchy (study → experiment → plate → sample → cell line → passage → clone → treatment). */
3
- import { h, Transition, type VNode } from 'vue'
3
+ import { h, Transition, useId, type VNode } from 'vue'
4
4
  import type { TreeNodeType, BadgeVariant, TreeNode } from '../types'
5
5
  import { useExpansionSet } from '../composables/useExpansionSet'
6
6
  import DataStateInternal from './internal/DataStateInternal.vue'
@@ -24,6 +24,12 @@ interface Props {
24
24
  * `null`/`undefined` renders normally.
25
25
  */
26
26
  error?: string | null
27
+ /**
28
+ * Selected node id; bind it with v-model on selected-id. Binding it, even to
29
+ * `null`, turns on selection. The matching row is highlighted, rows take
30
+ * keyboard focus and Enter or Space selects. Left unbound, rows are not selectable.
31
+ */
32
+ selectedId?: string | null
27
33
  }
28
34
 
29
35
  const props = withDefaults(defineProps<Props>(), {
@@ -40,6 +46,7 @@ const emit = defineEmits<{
40
46
  'node-click': [node: TreeNode]
41
47
  'expand': [nodeId: string]
42
48
  'collapse': [nodeId: string]
49
+ 'update:selectedId': [nodeId: string]
43
50
  }>()
44
51
 
45
52
  // Default icons by type (Lucide SVG paths - arrays to support multi-path icons)
@@ -64,13 +71,13 @@ const typeIcons: Record<TreeNodeType, IconElement[]> = {
64
71
  { tag: 'rect', attrs: { width: '7', height: '7', x: '3', y: '14', rx: '1' } },
65
72
  ],
66
73
  sample: [
67
- { tag: 'circle', attrs: { cx: '12', cy: '12', r: '10' } },
68
- { tag: 'path', attrs: { d: 'M12 6v6l4 2' } },
74
+ { tag: 'path', attrs: { d: 'M14.5 2v17.5c0 1.4-1.1 2.5-2.5 2.5c-1.4 0-2.5-1.1-2.5-2.5V2' } },
75
+ { tag: 'path', attrs: { d: 'M8.5 2h7' } },
76
+ { tag: 'path', attrs: { d: 'M14.5 16h-5' } },
69
77
  ],
70
78
  cell_line: [
71
- { tag: 'path', attrs: { d: 'M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5' } },
72
- { tag: 'path', attrs: { d: 'M9 18h6' } },
73
- { tag: 'path', attrs: { d: 'M10 22h4' } },
79
+ { tag: 'circle', attrs: { cx: '12', cy: '12', r: '10' } },
80
+ { tag: 'circle', attrs: { cx: '12', cy: '12', r: '3' } },
74
81
  ],
75
82
  passage: [
76
83
  { tag: 'path', attrs: { d: 'M3 5h.01' } },
@@ -85,9 +92,12 @@ const typeIcons: Record<TreeNodeType, IconElement[]> = {
85
92
  { tag: 'path', attrs: { d: 'M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2' } },
86
93
  ],
87
94
  treatment: [
88
- { tag: 'path', attrs: { d: 'M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2' } },
89
- { tag: 'path', attrs: { d: 'M6.453 15h11.094' } },
90
- { tag: 'path', attrs: { d: 'M8.5 2h7' } },
95
+ { tag: 'path', attrs: { d: 'm18 2 4 4' } },
96
+ { tag: 'path', attrs: { d: 'm17 7 3-3' } },
97
+ { tag: 'path', attrs: { d: 'M19 9 8.7 19.3c-1 1-2.5 1-3.4 0l-.6-.6c-1-1-1-2.5 0-3.4L15 5' } },
98
+ { tag: 'path', attrs: { d: 'm9 11 4 4' } },
99
+ { tag: 'path', attrs: { d: 'm5 19-3 3' } },
100
+ { tag: 'path', attrs: { d: 'm14 4 6 6' } },
91
101
  ],
92
102
  folder: [
93
103
  { tag: 'path', attrs: { d: 'M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z' } },
@@ -132,6 +142,15 @@ function toggleExpand(node: TreeNode) {
132
142
 
133
143
  function handleNodeClick(node: TreeNode) {
134
144
  emit('node-click', node)
145
+ emit('update:selectedId', node.id)
146
+ }
147
+
148
+ function handleHeaderKeydown(event: KeyboardEvent, node: TreeNode) {
149
+ // Keys pressed on the nested expand toggle belong to the toggle.
150
+ if (props.selectedId === undefined || event.target !== event.currentTarget) return
151
+ if (event.key !== 'Enter' && event.key !== ' ') return
152
+ event.preventDefault()
153
+ handleNodeClick(node)
135
154
  }
136
155
 
137
156
  function getIconElements(node: TreeNode): IconElement[] {
@@ -161,6 +180,8 @@ function canShowChildren(node: TreeNode, depth: number): boolean {
161
180
  return isExpanded(node.id)
162
181
  }
163
182
 
183
+ const treeId = useId()
184
+
164
185
  // Render tree node recursively
165
186
  function renderNode(node: TreeNode, depth: number): VNode {
166
187
  const children = node.children
@@ -170,12 +191,23 @@ function renderNode(node: TreeNode, depth: number): VNode {
170
191
  const badge = getBadgeContent(node)
171
192
  const badgeVar = getBadgeVariant(node)
172
193
  const iconElements = getIconElements(node)
194
+ const selectable = props.selectedId !== undefined
195
+ const selected = selectable && props.selectedId === node.id
196
+ // The child group sits beside the header, so the header treeitem claims it with aria-owns.
197
+ const groupId = `${treeId}-group-${encodeURIComponent(node.id)}`
173
198
 
174
199
  const header = h(
175
200
  'div',
176
201
  {
177
- class: 'mint-sample-tree__node-header',
202
+ class: ['mint-sample-tree__node-header', selected ? 'mint-sample-tree__node-header--selected' : ''],
203
+ // The focusable header is the treeitem, so its selected state is announced on focus.
204
+ role: 'treeitem',
205
+ 'aria-expanded': canExpand ? expanded : undefined,
206
+ 'aria-selected': selectable ? selected : undefined,
207
+ 'aria-owns': showChildNodes ? groupId : undefined,
208
+ tabindex: selectable ? 0 : undefined,
178
209
  onClick: () => handleNodeClick(node),
210
+ onKeydown: (e: KeyboardEvent) => handleHeaderKeydown(e, node),
179
211
  },
180
212
  [
181
213
  canExpand
@@ -204,7 +236,7 @@ function renderNode(node: TreeNode, depth: number): VNode {
204
236
  ),
205
237
  ])
206
238
  : null,
207
- h('span', { class: 'mint-sample-tree__label' }, node.label),
239
+ h('span', { class: ['mint-sample-tree__label', `mint-sample-tree__label--${node.type || 'custom'}`] }, node.label),
208
240
  badge !== undefined
209
241
  ? h('span', { class: ['mint-sample-tree__badge', `mint-sample-tree__badge--${badgeVar}`] }, String(badge))
210
242
  : null,
@@ -216,7 +248,10 @@ function renderNode(node: TreeNode, depth: number): VNode {
216
248
  ? h(
217
249
  Transition,
218
250
  { enterActiveClass: 'mint-sample-tree__children--entering', leaveActiveClass: 'mint-sample-tree__children--leaving' },
219
- () => h('div', { class: 'mint-sample-tree__children' }, children.map((child) => renderNode(child, depth + 1)))
251
+ // The inner wrapper is the single grid row the 0fr → 1fr expand animates (4c).
252
+ () => h('div', { id: groupId, class: 'mint-sample-tree__children', role: 'group' }, [
253
+ h('div', { class: 'mint-sample-tree__children-inner' }, children.map((child) => renderNode(child, depth + 1))),
254
+ ])
220
255
  )
221
256
  : null
222
257
 
@@ -225,8 +260,6 @@ function renderNode(node: TreeNode, depth: number): VNode {
225
260
  {
226
261
  key: node.id,
227
262
  class: ['mint-sample-tree__node', expanded ? 'mint-sample-tree__node--expanded' : '', !canExpand ? 'mint-sample-tree__node--leaf' : ''],
228
- role: 'treeitem',
229
- 'aria-expanded': canExpand ? expanded : undefined,
230
263
  },
231
264
  [header, childNodes]
232
265
  )
@@ -1,7 +1,8 @@
1
1
  <script setup lang="ts">
2
2
  /** Clickable color-swatch legend for plate sample types, supporting selection, count display, add/remove, and custom color assignment. */
3
3
  import type { SampleType } from '../types'
4
- import { SAMPLE_COLOR_SCALE } from '../utils/color'
4
+ import { SAMPLE_GROUP_TOKENS } from '../utils/color'
5
+ import { sampleTypeMarker } from '../utils/sampleTypeMarker'
5
6
 
6
7
  interface Props {
7
8
  modelValue?: string
@@ -18,7 +19,7 @@ const props = withDefaults(defineProps<Props>(), {
18
19
  samples: () => [],
19
20
  showCounts: true,
20
21
  editable: false,
21
- colorPalette: () => [...SAMPLE_COLOR_SCALE],
22
+ colorPalette: () => [...SAMPLE_GROUP_TOKENS],
22
23
  size: 'md',
23
24
  orientation: 'vertical',
24
25
  })
@@ -36,6 +37,11 @@ function getSampleColor(sample: SampleType, index: number): string {
36
37
  return sample.color || props.colorPalette[index % props.colorPalette.length]
37
38
  }
38
39
 
40
+ /** Same marker as the well: the id doubles as the sample type, as in WellPlate. */
41
+ function getSampleMarker(sample: SampleType, index: number) {
42
+ return sampleTypeMarker(sample.id, getSampleColor(sample, index))
43
+ }
44
+
39
45
  function handleSampleClick(sample: SampleType) {
40
46
  const newValue = props.modelValue === sample.id ? undefined : sample.id
41
47
  emit('sample-click', sample)
@@ -68,10 +74,12 @@ function handleAdd() {
68
74
  @click="handleSampleClick(sample)"
69
75
  >
70
76
  <span
77
+ v-for="marker in [getSampleMarker(sample, index)]"
78
+ :key="sample.id"
71
79
  :class="['mint-sample-legend__swatch', `mint-sample-legend__swatch--${size}`]"
72
- :style="{ backgroundColor: getSampleColor(sample, index) }"
80
+ :style="marker.style"
73
81
  :aria-hidden="true"
74
- />
82
+ >{{ marker.glyph }}</span>
75
83
 
76
84
  <span :class="['mint-sample-legend__name', `mint-sample-legend__name--${size}`]">
77
85
  {{ sample.name }}
@@ -1,4 +1,5 @@
1
1
  <script setup lang="ts">
2
+ import { ref } from 'vue'
2
3
  import SampleSelector from './SampleSelector.vue'
3
4
  import type { SampleGroup } from '../types'
4
5
  import type { AutoGroupResult } from '../types/auto-group'
@@ -10,6 +11,9 @@ const mockSamples = [
10
11
  'Vehicle_Rep1', 'Vehicle_Rep2', 'Vehicle_Rep3',
11
12
  ]
12
13
 
14
+ /** Selection for the pre-defined groups variant, so tri-state propagation is clickable. */
15
+ const groupedSelection = ref(['Control_Rep1', 'Treatment_Low_Rep1'])
16
+
13
17
  const mockGroups: SampleGroup[] = [
14
18
  { name: 'Control', color: '#3B82F6', samples: ['Control_Rep1', 'Control_Rep2', 'Control_Rep3'] },
15
19
  { name: 'Treatment_Low', color: '#10B981', samples: ['Treatment_Low_Rep1', 'Treatment_Low_Rep2', 'Treatment_Low_Rep3'] },
@@ -124,7 +128,7 @@ function handleSmartGroup(result: AutoGroupResult, state: { groups: SampleGroup[
124
128
  <Variant title="With Pre-defined Groups">
125
129
  <div style="padding: 2rem; max-width: 400px;">
126
130
  <SampleSelector
127
- :model-value="['Control_Rep1', 'Treatment_Low_Rep1']"
131
+ v-model="groupedSelection"
128
132
  :samples="mockSamples"
129
133
  :groups="mockGroups"
130
134
  />
@@ -2,6 +2,7 @@
2
2
  /** Interactive sample list with drag-and-drop group assignment, color labeling, and smart-group support. */
3
3
  import { ref, computed } from 'vue'
4
4
  import BaseButton from './BaseButton.vue'
5
+ import BaseCheckbox from './BaseCheckbox.vue'
5
6
  import BaseInput from './BaseInput.vue'
6
7
  import AutoGroupModal from './AutoGroupModal.vue'
7
8
  import SampleSelectorSampleRow from './SampleSelectorSampleRow.vue'
@@ -254,6 +255,9 @@ function addNewGroup() {
254
255
  newGroupName.value = ''
255
256
  }
256
257
 
258
+ /** Selected samples among the resolved list, for the select-all header. */
259
+ const selectedCount = computed(() => resolvedSamples.value.filter(s => props.modelValue.includes(s)).length)
260
+
257
261
  /** True while a loading, error or empty placeholder stands in for the body. */
258
262
  const isPlaceholderState = computed(() =>
259
263
  props.loading || Boolean(props.error) || resolvedSamples.value.length === 0,
@@ -282,17 +286,24 @@ defineExpose({ handleSmartGroupApply })
282
286
  </slot>
283
287
  </div>
284
288
 
285
- <!-- Select All Row -->
286
- <label v-if="!isPlaceholderState" class="mint-sample-selector__select-all">
287
- <input
288
- type="checkbox"
289
- :checked="isAllSelected"
290
- @change="toggleSelectAll"
289
+ <!-- Select-all header row -->
290
+ <div
291
+ v-if="!isPlaceholderState"
292
+ :class="['mint-sample-selector__select-all', { 'mint-sample-selector__select-all--grouped': groupingEnabled }]"
293
+ @click="toggleSelectAll"
294
+ >
295
+ <BaseCheckbox
296
+ :model-value="isAllSelected"
297
+ :indeterminate="selectedCount > 0 && !isAllSelected"
298
+ size="sm"
299
+ aria-label="Select all samples"
291
300
  class="mint-sample-selector__checkbox"
301
+ @click.stop
302
+ @update:model-value="toggleSelectAll"
292
303
  />
293
- <span class="mint-sample-selector__select-all-label">Select All</span>
294
- <span class="mint-sample-selector__select-all-count">{{ resolvedSamples.length }} samples</span>
295
- </label>
304
+ <span class="mint-sample-selector__select-all-label">All samples</span>
305
+ <span class="mint-sample-selector__select-all-count">{{ selectedCount }} / {{ resolvedSamples.length }}</span>
306
+ </div>
296
307
 
297
308
  <!-- Action Buttons Row -->
298
309
  <div v-if="!isPlaceholderState && enableGrouping" class="mint-sample-selector__actions">
@@ -395,7 +406,6 @@ defineExpose({ handleSmartGroupApply })
395
406
  :sample="sample"
396
407
  :selected="modelValue.includes(sample)"
397
408
  :dragging="draggingSample === sample"
398
- checkbox-size="small"
399
409
  @dragstart="handleDragStart(sample, null, $event)"
400
410
  @dragend="handleDragEnd"
401
411
  @toggle="toggleSample(sample)"
@@ -457,12 +467,12 @@ defineExpose({ handleSmartGroupApply })
457
467
  :title="sample"
458
468
  :aria-label="`Sample: ${sample}`"
459
469
  >
460
- <input
461
- type="checkbox"
462
- :checked="modelValue.includes(sample)"
463
- class="mint-sample-selector__checkbox"
470
+ <BaseCheckbox
471
+ :model-value="modelValue.includes(sample)"
472
+ size="sm"
464
473
  :aria-label="`Select ${sample}`"
465
- @change="toggleSample(sample)"
474
+ class="mint-sample-selector__checkbox"
475
+ @update:model-value="toggleSample(sample)"
466
476
  />
467
477
  <span class="mint-sample-selector__flat-name">{{ sample }}</span>
468
478
  </div>
@@ -8,6 +8,7 @@
8
8
  * levels in between are pure path nodes that aggregate their descendants.
9
9
  */
10
10
  import { computed } from 'vue'
11
+ import BaseCheckbox from './BaseCheckbox.vue'
11
12
  import SampleSelectorSampleRow from './SampleSelectorSampleRow.vue'
12
13
  import type { SampleGroupNode } from '../composables/useSampleGroups'
13
14
  import { collectLeafGroupNames, type SampleGroupTreeContext } from './SampleSelector.tree'
@@ -24,6 +25,7 @@ const isRoot = computed(() => props.depth === 0)
24
25
  const isLeaf = computed(() => props.node.children.length === 0)
25
26
  const expanded = computed(() => props.ctx.isExpanded(props.node.key))
26
27
  const leafGroupNames = computed(() => collectLeafGroupNames(props.node))
28
+ const selectedCount = computed(() => props.node.allSamples.filter(props.ctx.isSampleSelected).length)
27
29
  /** Roots reorder as a family, leaves as individual groups; path nodes stay put. */
28
30
  const dragKind = computed(() => (isRoot.value ? 'major' : isLeaf.value ? 'sub' : null))
29
31
  /** Reorder drags address a family by its label but a group by its full name. */
@@ -62,6 +64,8 @@ function onHeaderKeydown(event: KeyboardEvent) {
62
64
  props.ctx.onGroupReorderKeydown(dragName.value, dragKind.value, event)
63
65
  return
64
66
  }
67
+ // Keys from the checkbox or colour button inside the header are theirs, not the header's.
68
+ if (event.target !== event.currentTarget) return
65
69
  if (event.key !== 'Enter' && event.key !== ' ') return
66
70
  event.preventDefault()
67
71
  props.ctx.toggleExpanded(props.node.key)
@@ -118,18 +122,14 @@ function onHeaderKeydown(event: KeyboardEvent) {
118
122
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
119
123
  </svg>
120
124
 
121
- <input
122
- type="checkbox"
123
- :checked="ctx.isFullySelected(node.allSamples)"
125
+ <BaseCheckbox
126
+ :model-value="ctx.isFullySelected(node.allSamples)"
124
127
  :indeterminate="ctx.isPartiallySelected(node.allSamples)"
125
- :class="[
126
- 'mint-sample-selector__checkbox',
127
- isRoot ? '' : 'mint-sample-selector__checkbox--small',
128
- ]"
129
- :style="{ accentColor: node.color }"
128
+ size="sm"
130
129
  :aria-label="`Select ${node.label}`"
130
+ class="mint-sample-selector__checkbox"
131
131
  @click.stop
132
- @change="ctx.toggleSamples(node.allSamples)"
132
+ @update:model-value="ctx.toggleSamples(node.allSamples)"
133
133
  />
134
134
 
135
135
  <button
@@ -153,15 +153,7 @@ function onHeaderKeydown(event: KeyboardEvent) {
153
153
  :title="node.group?.name ?? node.label"
154
154
  >{{ node.label }}</span>
155
155
 
156
- <span
157
- :class="[
158
- 'mint-sample-selector__count-badge',
159
- isRoot ? '' : 'mint-sample-selector__count-badge--small',
160
- ]"
161
- :style="{ backgroundColor: node.displayBg, color: node.color }"
162
- >
163
- {{ node.allSamples.length }}
164
- </span>
156
+ <span class="mint-sample-selector__count-badge">{{ selectedCount }} / {{ node.allSamples.length }}</span>
165
157
 
166
158
  <button
167
159
  type="button"
@@ -202,8 +194,6 @@ function onHeaderKeydown(event: KeyboardEvent) {
202
194
  :sample="sample"
203
195
  :selected="ctx.isSampleSelected(sample)"
204
196
  :dragging="ctx.draggingSample() === sample"
205
- :accent-color="node.color"
206
- checkbox-size="tiny"
207
197
  removable
208
198
  @dragstart="(e: DragEvent) => ctx.onSampleDragStart(sample, node.group!.name, e)"
209
199
  @dragend="ctx.onSampleDragEnd"
@@ -1,21 +1,16 @@
1
1
  <script setup lang="ts">
2
2
  /** Single draggable sample row used by grouped and ungrouped SampleSelector lists. */
3
- import { computed } from 'vue'
4
-
5
- type CheckboxSize = 'small' | 'tiny'
3
+ import BaseCheckbox from './BaseCheckbox.vue'
6
4
 
7
5
  interface Props {
8
6
  sample: string
9
7
  selected: boolean
10
8
  dragging?: boolean
11
- accentColor?: string
12
- checkboxSize?: CheckboxSize
13
9
  removable?: boolean
14
10
  }
15
11
 
16
- const props = withDefaults(defineProps<Props>(), {
12
+ withDefaults(defineProps<Props>(), {
17
13
  dragging: false,
18
- checkboxSize: 'tiny',
19
14
  removable: false,
20
15
  })
21
16
 
@@ -23,11 +18,6 @@ const emit = defineEmits<{
23
18
  toggle: []
24
19
  remove: []
25
20
  }>()
26
-
27
- const checkboxClasses = computed(() => [
28
- 'mint-sample-selector__checkbox',
29
- `mint-sample-selector__checkbox--${props.checkboxSize}`,
30
- ])
31
21
  </script>
32
22
 
33
23
  <template>
@@ -43,13 +33,12 @@ const checkboxClasses = computed(() => [
43
33
  <svg class="mint-sample-selector__drag-handle" aria-hidden="true" fill="none" stroke="currentColor" viewBox="0 0 24 24">
44
34
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 8h16M4 16h16" />
45
35
  </svg>
46
- <input
47
- type="checkbox"
48
- :checked="selected"
49
- :class="checkboxClasses"
50
- :style="accentColor ? { accentColor } : undefined"
36
+ <BaseCheckbox
37
+ :model-value="selected"
38
+ size="sm"
51
39
  :aria-label="`Select sample ${sample}`"
52
- @change="emit('toggle')"
40
+ class="mint-sample-selector__checkbox"
41
+ @update:model-value="emit('toggle')"
53
42
  />
54
43
  <span class="mint-sample-selector__sample-name">{{ sample }}</span>
55
44
  <button
@@ -197,5 +197,19 @@ function initState() {
197
197
  />
198
198
  </div>
199
199
  </Variant>
200
+
201
+ <Variant title="Event Statuses">
202
+ <div style="padding: 1rem; height: 600px;">
203
+ <ScheduleCalendar
204
+ :model-value="today"
205
+ view="week"
206
+ :events="mockEvents"
207
+ :day-start-hour="8"
208
+ :day-end-hour="17"
209
+ :show-now-indicator="false"
210
+ readonly
211
+ />
212
+ </div>
213
+ </Variant>
200
214
  </Story>
201
215
  </template>
@@ -226,6 +226,18 @@ function onEventKeydown(event: ScheduleEvent, e: KeyboardEvent) {
226
226
  : `${event.title} cannot move further.`)
227
227
  }
228
228
 
229
+ /** Status written next to the time so it never rests on color alone (3c). Confirmed is the default and stays unlabeled. */
230
+ const STATUS_TEXT: Partial<Record<NonNullable<ScheduleEvent['status']>, string>> = {
231
+ pending: 'Pending',
232
+ 'in-progress': 'In progress',
233
+ cancelled: 'Cancelled',
234
+ }
235
+
236
+ function eventTimeText(event: ScheduleEvent): string {
237
+ const status = event.status && STATUS_TEXT[event.status]
238
+ return status ? `${formatEventTime(event)} · ${status}` : formatEventTime(event)
239
+ }
240
+
229
241
  /** Instructions announced with each event. */
230
242
  function eventLabel(event: ScheduleEvent): string {
231
243
  const base = `${event.title}, ${formatEventTime(event)}`
@@ -398,7 +410,7 @@ onUnmounted(() => {
398
410
  @pointerdown="onResizePointerDown(event, 'top', dayIdx, $event)"
399
411
  />
400
412
  <div class="mint-schedule__event-title">{{ event.title }}</div>
401
- <div class="mint-schedule__event-time">{{ formatEventTime(event) }}</div>
413
+ <div class="mint-schedule__event-time">{{ eventTimeText(event) }}</div>
402
414
  <div
403
415
  v-if="!readonly && event.resizable !== false"
404
416
  class="mint-schedule__event-resize-handle mint-schedule__event-resize-handle--bottom"
@@ -78,7 +78,7 @@ const notations: NumberNotation[] = ['auto', 'scientific', 'engineering', 'compa
78
78
  <div style="padding: 2rem; display: flex; flex-direction: column; gap: 1rem; align-items: center; font-size: 1.125rem;">
79
79
  <div style="display: flex; gap: 0.5rem; align-items: baseline;">
80
80
  <span style="min-width: 140px; text-align: right; color: var(--text-muted, #94a3b8); font-size: 0.875rem;">Avogadro:</span>
81
- <ScientificNumber :value="6.022e23" unit="mol-1" notation="scientific" />
81
+ <ScientificNumber :value="6.022e23" unit="mol⁻¹" notation="scientific" />
82
82
  </div>
83
83
  <div style="display: flex; gap: 0.5rem; align-items: baseline;">
84
84
  <span style="min-width: 140px; text-align: right; color: var(--text-muted, #94a3b8); font-size: 0.875rem;">Boltzmann:</span>
@@ -97,12 +97,25 @@ const notations: NumberNotation[] = ['auto', 'scientific', 'engineering', 'compa
97
97
 
98
98
  <Variant title="Copyable">
99
99
  <div style="padding: 2rem; display: flex; flex-direction: column; gap: 1rem; align-items: center; font-size: 1.125rem;">
100
- <ScientificNumber :value="6.022e23" unit="mol-1" copyable />
100
+ <ScientificNumber :value="6.022e23" unit="mol⁻¹" copyable />
101
101
  <ScientificNumber :value="0.00042" unit="M" copyable />
102
102
  <ScientificNumber :value="1234567" copyable />
103
103
  </div>
104
104
  </Variant>
105
105
 
106
+ <Variant title="Selection Copy">
107
+ <div style="padding: 2rem; max-width: 600px; margin: 0 auto; font-size: 1rem; line-height: 1.6; color: var(--text-primary, #1e293b);">
108
+ <p style="margin: 0;">
109
+ Avogadro's constant is <ScientificNumber :value="6.022e23" unit="mol⁻¹" /> and the IC50 is
110
+ <ScientificNumber :value="4.2e-4" unit="M" />.
111
+ </p>
112
+ <p style="margin: 0.75rem 0 0; font-size: 0.875rem; color: var(--text-secondary, #64748b);">
113
+ Selecting one number copies <code>6.022e23 mol⁻¹</code>; copying the whole sentence keeps
114
+ the exponents as <code>10^23</code> and <code>10^−4</code>, never <code>1023</code>.
115
+ </p>
116
+ </div>
117
+ </Variant>
118
+
106
119
  <Variant title="Special Values">
107
120
  <div style="padding: 2rem; display: flex; gap: 2rem; align-items: center; justify-content: center; font-size: 1.125rem;">
108
121
  <div style="display: flex; flex-direction: column; align-items: center; gap: 0.25rem;">
@@ -18,20 +18,7 @@ const props = withDefaults(defineProps<Props>(), {
18
18
  })
19
19
 
20
20
  const copied = ref(false)
21
-
22
- const SUPERSCRIPT_DIGITS: Record<string, string> = {
23
- '0': '\u2070',
24
- '1': '\u00B9',
25
- '2': '\u00B2',
26
- '3': '\u00B3',
27
- '4': '\u2074',
28
- '5': '\u2075',
29
- '6': '\u2076',
30
- '7': '\u2077',
31
- '8': '\u2078',
32
- '9': '\u2079',
33
- '-': '\u207B',
34
- }
21
+ let copiedTimer: ReturnType<typeof setTimeout> | undefined
35
22
 
36
23
  const SI_SUFFIXES: [number, string][] = [
37
24
  [1e12, 'T'],
@@ -44,13 +31,6 @@ const SI_SUFFIXES: [number, string][] = [
44
31
  [1e-12, 'p'],
45
32
  ]
46
33
 
47
- function toSuperscript(exp: number): string {
48
- return String(exp)
49
- .split('')
50
- .map(ch => SUPERSCRIPT_DIGITS[ch] ?? ch)
51
- .join('')
52
- }
53
-
54
34
  function roundToPrecision(n: number, digits: number): string {
55
35
  return n.toFixed(digits).replace(/\.?0+$/, '') || '0'
56
36
  }
@@ -107,7 +87,7 @@ const formatted = computed<FormattedNumber>(() => {
107
87
  type: 'scientific',
108
88
  mantissa: mantissaStr,
109
89
  exponent: exp,
110
- exponentStr: toSuperscript(exp),
90
+ exponentStr: String(exp).replace('-', '\u2212'), // raised by CSS; true minus sign
111
91
  }
112
92
  })
113
93
 
@@ -133,11 +113,23 @@ const plainTextValue = computed(() => {
133
113
  return text
134
114
  })
135
115
 
116
+ const rootEl = ref<HTMLElement>()
117
+
118
+ /** A selection inside the number copies the same canonical string as the button; a wider one is left to the browser. */
119
+ function onSelectionCopy(event: ClipboardEvent) {
120
+ const selection = document.getSelection()
121
+ const root = rootEl.value
122
+ if (!selection || selection.isCollapsed || !root?.contains(selection.anchorNode) || !root.contains(selection.focusNode)) return
123
+ event.clipboardData?.setData('text/plain', plainTextValue.value)
124
+ event.preventDefault()
125
+ }
126
+
136
127
  async function copyToClipboard() {
137
128
  try {
138
129
  await navigator.clipboard.writeText(plainTextValue.value)
139
130
  copied.value = true
140
- setTimeout(() => { copied.value = false }, 1500)
131
+ clearTimeout(copiedTimer)
132
+ copiedTimer = setTimeout(() => { copied.value = false }, 1500)
141
133
  } catch {
142
134
  // clipboard not available
143
135
  }
@@ -145,7 +137,7 @@ async function copyToClipboard() {
145
137
  </script>
146
138
 
147
139
  <template>
148
- <span class="mint-sci-number">
140
+ <span ref="rootEl" class="mint-sci-number" @copy="onSelectionCopy">
149
141
  <!-- Special values: NaN, Infinity -->
150
142
  <template v-if="specialDisplay">
151
143
  <span class="mint-sci-number__plain">{{ specialDisplay }}</span>
@@ -156,7 +148,9 @@ async function copyToClipboard() {
156
148
  <span class="mint-sci-number__mantissa">{{ formatted.mantissa }}</span>
157
149
  <span class="mint-sci-number__times">&times;</span>
158
150
  <span class="mint-sci-number__base">10</span>
159
- <span class="mint-sci-number__exponent">{{ formatted.exponentStr }}</span>
151
+ <!-- The raised digits are CSS-generated so no selection copies "1023"; the hidden "^n" carries the value with an ASCII minus. -->
152
+ <span class="mint-sci-number__sr">^{{ formatted.exponent }}</span>
153
+ <span class="mint-sci-number__exponent" :data-exponent="formatted.exponentStr" aria-hidden="true" />
160
154
  </template>
161
155
 
162
156
  <!-- Compact notation with SI suffix -->
@@ -178,7 +172,8 @@ async function copyToClipboard() {
178
172
  v-if="copyable"
179
173
  :class="['mint-sci-number__copy-btn', { 'mint-sci-number__copy-btn--copied': copied }]"
180
174
  type="button"
181
- :title="copied ? 'Copied!' : 'Copy value'"
175
+ title="Copy value"
176
+ aria-label="Copy value"
182
177
  @click.stop="copyToClipboard"
183
178
  >
184
179
  <svg v-if="!copied" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
@@ -189,5 +184,6 @@ async function copyToClipboard() {
189
184
  <polyline points="20 6 9 17 4 12" />
190
185
  </svg>
191
186
  </button>
187
+ <span v-if="copied" class="mint-sci-number__copied" role="status">Copied {{ plainTextValue }}</span>
192
188
  </span>
193
189
  </template>