@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
package/dist/index.js CHANGED
@@ -1,22 +1,117 @@
1
- import { a as useAuthStore, c as paletteCssVariables, d as useSettingsStore, f as MintApiError, i as useApi, l as tableDensityToSize, n as AuthenticationRequiredError, o as PALETTE_CSS_VARIABLES, p as mintApiErrorFromResponse, s as colorPalettes, u as tryUseSettingsStore } from "./errors-BLuqMee5.js";
2
- import { a as SORT_OPTIONS, c as formatExperimentDate, d as resolveExperimentCode, f as BaseModal_default, h as BaseButton_default, i as EXPERIMENT_STATUS_VARIANT_MAP, l as formatExperimentStatus, m as useEventListener, n as EXPERIMENT_STATUS_LABELS, o as datePresetToISO, p as useFocusTrap, r as EXPERIMENT_STATUS_OPTIONS, s as experimentIdFromRoute, t as DATE_PRESET_OPTIONS, u as getExperimentStatusVariant } from "./experiment-utils-CV2Wza3z.js";
3
- import { a as BaseSelect_default, i as BasePill_default, n as useRequestSyncState, r as EmptyState_default, s as BaseInput_default, t as Skeleton_default } from "./Skeleton-jhF9wUkU.js";
4
- import { $ as resolveJobCapabilities, A as useConcentrationUnits, At as formatTimeSlot, Bt as MultiSelect_default, C as controlsToViewIds, Ct as addMinutes, D as getTypeDefault, Dt as findNearestTimeSlotIndex, E as getFieldRegistryEntry, Et as findAvailableSlots, F as ATOMIC_WEIGHTS, Ft as rangesOverlap, G as createGeneratedAnalysisTransport, Gt as BaseToggle_default, Ht as useSelectionLimit, I as useChemicalFormula, It as snapToSlot, J as isActiveJobStatus, Jt as BaseTextarea_default, K as useGeneratedAnalysis, Kt as BaseCheckbox_default, L as GeneratedPathInput_default, Lt as toMinutes, M as SequenceInput_default, Mt as generateTimeSlots, N as useSequenceUtils, Nt as isTimeInRange, O as ConcentrationInput_default, Ot as formatDuration, P as FormulaInput_default, Pt as parseTime, Q as normalizeJobState, R as ArtifactSelectorModal_default, Rt as useTimeUtils, S as controlsToTopBarSettingsConfig, St as TimePicker_default, T as getDefaultControlView, Tt as durationMinutes, Ut as BaseSlider_default, Vt as useListSelection, W as resolveCurrentPluginId, Wt as BaseRadioGroup_default, X as jobStatusLabel, Y as isTerminalJobStatus, Z as normalizeJobPercent, _ as controlsToFormSchema, _t as pluginSecretLabel, a as defineDoseCalculatorControlProps, at as AlertBox_default, b as controlsToSettingsSchema, bt as usesPluginSecretReferences, c as defineWellPlateDoseComponentBindings, ct as SecretInput_default, d as defineControlModel, dt as PLUGIN_SECRET_REF_KEY, ft as clearPluginSecret, gt as pluginSecretId, h as controlValuesToComponentProps, ht as keepPluginSecret, i as useControlSchema, j as MoleculeInput_default, jt as fromMinutes, k as UnitInput_default, kt as formatTime, l as defineWellPlateDoseControlProps, lt as PLUGIN_SECRET_FORMAT_KEY, m as controlValuesToComponentBindingsById, mt as isPluginSecretRef, n as defineControls, o as defineDoseDesignControlModel, ot as FileUploader_default, p as controlValuesToComponentBindings, pt as isPluginSecretLocked, q as usePluginJobs, qt as Tooltip_default, r as getControlDefaults, s as defineWellPlateControlProps, st as NumberInput_default, t as defineControlComponentBindings, tt as DateTimePicker_default, u as useControlWorkspace, ut as PLUGIN_SECRET_FORMAT_REF, v as controlsToSectionFormSchema, vt as pluginSecretState, w as controlsToViewItems, wt as compareTime, x as controlsToSidebarPanels, xt as TagsInput_default, y as controlsToSectionFormSchemas, yt as setPluginSecret, z as useAnalysisArtifacts, zt as DatePicker_default } from "./useControlSchema-vLiRPUmj.js";
5
- import { $ as ScheduleCalendar_default, A as ChemicalFormula_default, At as CollapsibleCard_default, B as BioTemplateExperimentWorkspaceView_default, Bt as SegmentedControl_default, C as SequenceProgressBar_default, Ct as FormBuilder_default, D as formatSequenceRemaining, Dt as AppPluginSwitcher_default, E as formatSequenceEta, Et as AppTopBar_default, F as SmartGroupModal_default, Ft as AppToastContainer_default, G as ProgressBar_default, H as AdductText_default, Ht as ColorSlider_default, I as GroupAssigner_default, It as DataFrame_default, J as LayoutResizeHandle_default, K as StatusIndicator_default, L as RackEditor_default, Lt as LoadingSpinner_default, M as ProtocolStepEditor_default, Mt as ActionMenu_default, N as SampleHierarchyTree_default, Nt as IconButton_default, O as sequenceProgressPercent, Ot as AppAvatarMenu_default, P as ReagentEditor_default, Pt as RuntimeUpdateNotice_default, Q as ComponentBindingRenderer_default, R as BioTemplatePresetWorkspaceView_default, Rt as Calendar_default, S as InstrumentAlertLog_default, St as AppSidebar_default, T as estimateSequenceRemainingSeconds, Tt as StepWizard_default, U as Breadcrumb_default, Ut as SearchableSelect_default, V as BioTemplateRenderer_default, Vt as BaseTabs_default, W as Avatar_default, X as DoseDesignWorkspaceView_default, Y as AppContainer_default, Z as ControlWorkspaceView_default, _ as inferLcmsPlateTypeFromWellIds, _t as generatedJobFormSchema, a as FileBrowserModal_default, at as PlateMapEditor_default, b as InstrumentStatusCard_default, bt as MobileSupportGate_default, c as TimeRangeInput_default, ct as ExperimentTimeline_default, d as AuditTrail_default, dt as JobsStatusTray_default, et as SampleSelector_default, f as LcmsSequenceTable_default, ft as GeneratedResultRenderer_default, g as extractLcmsSampleName, gt as generatedJobDefaults, h as extractLcmsCommonPrefix, ht as ChartContainer_default, i as ArtifactSaveDialog_default, it as ReagentList_default, j as ScientificNumber_default, jt as ThemeToggle_default, k as sequenceSamplesRemaining, kt as PluginIcon_default, l as ExperimentDataViewer_default, lt as DoseCalculator_default, m as basenameFromWindowsPath, mt as PlotlyChart_default, n as FilePicker_default, nt as SmartGroupManual_default, o as SectionCard_default, ot as SampleLegend_default, p as DEFAULT_LCMS_SEQUENCE_COLUMNS, pt as GeneratedPlotlyResult_default, q as Divider_default, r as FitPanel_default, rt as SmartGroupFieldRecipe_default, s as ResourceCard_default, st as WellPlate_default, tt as AutoGroupModal_default, u as BatchProgressList_default, ut as GeneratedPluginView_default, v as lcmsWellIdFromPosition, vt as normalizeGeneratedJobInput, w as estimateSequenceFinishDate, wt as FormActions_default, x as InstrumentStateBadge_default, xt as AppLayout_default, y as reconstructLcmsPlateCellsFromSequenceItems, yt as PluginWorkspaceView_default, z as BioTemplatePackWorkspaceView_default, zt as DropdownButton_default } from "./components-Bbg_gtzF.js";
6
- import { s as FormField_default, t as SettingsModal_default } from "./SettingsModal-DELMkUFR.js";
7
- import { $ as getInjectedFrontendRevision, A as useFileImport, B as REORDER_ANNOUNCER_STYLE, C as useExpansionSet, D as detectDelimiter, F as extractSampleNamesFromDesignData, G as combinePluginJobSources, H as useListReorder, I as extractSampleOptionsFromDesignData, J as usePluginWorkspace, K as useJobsStatusTray, L as unwrapExperimentDesignData, M as extractSamplesFromDesignData, N as useAutoGroup, O as parseDelimitedText, Q as useAppExperiment, R as DEFAULT_COLORS, S as useExperimentData, U as useReorderAnnouncer, V as reorderList, W as useDoseCalculator, X as useMobileSupportGate, Y as DEFAULT_MOBILE_VIEWPORT_QUERY, Z as APP_EXPERIMENT_KEY, _ as useBioTemplateControls, a as DEFAULT_PRESETS, at as candidateMatchesSearch, b as useScheduleDrag, c as useReagentSeries, ct as compareSortValues, d as useBioTemplatePresetWorkspace, dt as useRovingFocus, et as useRuntimeAlignment, f as useBioTemplatePackWorkspace, g as useBioTemplateComponents, h as toBioTemplateComponentPropsByComponent, i as useProtocolTemplates, it as useToast, j as validateImportFile, k as readFileAsText, l as useGroupAssignment, lt as useSortedItems, m as getBioTemplateComponentProps, nt as usePresenceHeartbeat, o as DEFAULT_UNITS, ot as normalizeSearchQuery, p as useBioTemplateWorkspace, q as usePluginJobCenter, rt as useTheme, s as generateDilutionSeries, st as useTextSearch, tt as getPresenceClientId, u as useRackEditor, ut as useMenuKeyboard, v as useTemplateCollection, w as useSampleGroups, x as useExperimentSamples, y as useExperimentSave, z as useWellPlateEditor } from "./validation-ChMyixAf.js";
8
- import { i as usePlatformContext, n as evaluateCondition, r as useForm, t as useFormBuilder } from "./useFormBuilder-D37ajgS8.js";
9
- import { ADMIN_PANEL_PERMISSIONS, ADMIN_ROLE, canAccessAdmin, canAccessByPolicy, canAccessPlugin, getAccessAudience, getRoleInfo, getUserPermissions, hasAllPermissions, hasAnyPermission, isAdminRole, isAdminUser, normalizeAccessPolicy } from "./permissions.js";
10
- import { t as useExperimentStore } from "./experiment-CVDRAnqp.js";
11
- import { t as ANALYSIS_FILE_ARTIFACT_SCHEMA } from "./analysisArtifactTypes-DQ0MjwHZ.js";
12
- import { $ as toTimeCourseRows, $t as listBioTemplatePacks, A as createSamplePrepTemplate, At as toCalibrationCurveRows, B as toBioTemplateComponentProps, Bt as validatePlateMapData, C as createFlowCytometryPanelTemplate, Ct as toInstrumentRunScheduleEvents, D as createTimeCourseTemplate, Dt as toFlowPanelRows, E as createProtocolStepsTemplate, En as hslToHex, Et as toFlowPanelDataFrame, Ft as validateAssayMatrixData, G as toTemplateDataFrame, Gt as validateSampleSheetData, H as toBioTemplateComponentPropsById, Ht as validateQpcrPlateData, I as listBioTemplateComponentBindings, It as validateCalibrationCurveData, J as toDoseLayoutState, Jt as getBioTemplatePresetInfo, K as toWellMapArray, Kt as validateTimeCourseData, L as toBioTemplateComponentBindings, Lt as validateDoseResponseData, M as createPlateMapTemplate, Mt as toAssayMatrixDataFrame, N as bioTemplatePresetControlValuesToOptions, Nt as toAssayMatrixRows, O as createCalibrationCurveTemplate, Ot as toCalibrationCurveColumns, P as getBioTemplateComponentBindings, Pt as toAssayMatrixSampleOptions, Q as toTimeCourseDataFrame, Qt as getBioTemplatePackInfo, R as toBioTemplateComponentBindingsById, Rt as validateFlowCytometryPanelData, S as createInstrumentRunTemplate, St as toInstrumentRunRows, T as createAssayMatrixTemplate, Tn as hexToHsl, Tt as toFlowPanelColumns, U as toBioTemplateComponentSnippets, Ut as validateReagentListData, Vt as validateProtocolStepsData, W as toBioTemplateComponentUsage, Wt as validateSamplePrepData, X as toWellPlateWells, Xt as searchBioTemplatePresets, Y as toPlateMapEditorState, Yt as listBioTemplatePresets, Z as toTimeCourseColumns, Zt as bioTemplatePacks, _ as createElisaAssayCollection, _t as toProtocolDataFrame, a as getBioTemplateControlDefaults, an as TEMPLATE_COLLECTION_KEY, at as toSamplePrepColumns, b as createQpcrExpressionCollection, bt as toInstrumentRunColumns, c as listBioTemplatePresetControlSchemas, cn as createTemplateEnvelope, ct as toReagentColumns, d as createBioTemplatePresetCollectionFromControls, dn as extractTemplateCollection, dt as toReagentRows, en as searchBioTemplatePacks, et as toTimeCourseSteps, f as createWellPlateScreenCollection, fn as getTemplateData, ft as toQpcrColumns, g as createFlowCytometryAssayCollection, gt as toProtocolColumns, h as createWesternBlotAssayCollection, ht as toQpcrWellPlateWells, i as createBioTemplateControlToolkit, in as searchBioTemplateCatalog, it as toSampleRows, j as createSampleSheetTemplate, jt as toAssayMatrixColumns, k as createDoseResponseTemplate, kt as toCalibrationCurveDataFrame, l as requireBioTemplateControlSchema, ln as ensureTemplateEnvelope, lt as toReagentDataFrame, m as createDefaultBioTemplate, mt as toQpcrRows, n as bioTemplateControlsToSectionFormSchemas, nn as getBioTemplateInfo, nt as toSampleDataFrame, o as getBioTemplateControlSchema, on as assertTemplateEnvelope, ot as toSamplePrepDataFrame, p as createBioTemplatePackCollection, pt as toQpcrDataFrame, q as toDoseConditions, qt as bioTemplatePresets, r as bioTemplateControlsToSidebarPanels, rn as listBioTemplateCatalog, rt as toSampleOptions, s as listBioTemplateControlSchemas, sn as createTemplateCollection, st as toSamplePrepRows, t as bioTemplateControlsToFormSchema, tn as bioTemplateCatalog, tt as toSampleColumns, u as createBioTemplatePresetCollection, un as ensureTemplateFromCollection, ut as toReagentListItems, v as createTargetedMetabolomicsCollection, vt as toProtocolRows, w as createReagentListTemplate, wn as deriveShade, wt as toInstrumentRunSteps, x as createQpcrPlateTemplate, xt as toInstrumentRunDataFrame, y as createLcmsBatchCollection, yt as toProtocolSteps, z as toBioTemplateComponentImports, zt as validateInstrumentRunData } from "./templates-NuaNHohp.js";
13
- import { r as ConfirmDialog_default, t as ExperimentPopover_default } from "./ExperimentPopover-CJdNlCZb.js";
14
- import { r as ExperimentCodeBadge_default, t as ExperimentSelectorModal_default } from "./ExperimentSelectorModal-DHE9k8TP.js";
15
- import { n as useDebouncedWatch, t as useExperimentSelector } from "./useExperimentSelector-G_CAOFTX.js";
1
+ import { $ as PlateEditor_default, A as SampleLegend_default, At as AppToastContainer_default, B as StatusIndicator_default, C as ChemicalFormula_default, Ct as AppAvatarMenu_default, D as ReagentEditor_default, Dt as ActionMenu_default, E as SampleHierarchyTree_default, Et as ThemeToggle_default, F as SettingsModal_default, Ft as Calendar_default, G as ControlWorkspaceView_default, H as LayoutResizeHandle_default, I as AdductText_default, It as BasePill_default, J as SampleSelector_default, K as ComponentBindingRenderer_default, L as Breadcrumb_default, Lt as SegmentedControl_default, M as BioTemplatePackWorkspaceView_default, Mt as FormField_default, N as BioTemplateExperimentWorkspaceView_default, Nt as DataFrame_default, O as SmartGroupModal_default, Ot as IconButton_default, P as BioTemplateRenderer_default, Pt as LoadingSpinner_default, Q as ReagentList_default, R as Avatar_default, Rt as BaseTabs_default, S as sequenceSamplesRemaining, St as AppTopBar_default, T as ProtocolStepEditor_default, Tt as CollapsibleCard_default, U as AppContainer_default, V as Divider_default, W as DoseDesignWorkspaceView_default, X as SmartGroupManual_default, Y as AutoGroupModal_default, Z as SmartGroupFieldRecipe_default, _ as estimateSequenceFinishDate, _t as AppLayout_default, a as ArtifactSaveDialog_default, at as GeneratedPluginView_default, b as formatSequenceRemaining, bt as FormActions_default, c as SectionCard_default, ct as GeneratedPlotlyResult_default, d as ExperimentCodeBadge_default, dt as ChartContainer_default, et as ConfirmDialog_default, f as ExperimentDataViewer_default, ft as generatedJobDefaults, g as SequenceProgressBar_default, gt as MobileSupportGate_default, h as InstrumentStateBadge_default, ht as PluginWorkspaceView_default, i as ExperimentPopover_default, it as DoseCalculator_default, j as BioTemplatePresetWorkspaceView_default, jt as AlertBox_default, k as GroupAssigner_default, kt as RuntimeUpdateNotice_default, l as ResourceCard_default, lt as PlotlyChart_default, m as AuditTrail_default, mt as normalizeGeneratedJobInput, n as FilePicker_default, nt as sampleTypeMarker, o as ArtifactSelectorModal_default, ot as JobsStatusTray_default, p as BatchProgressList_default, pt as generatedJobFormSchema, q as ScheduleCalendar_default, r as FitPanel_default, rt as ExperimentTimeline_default, s as ExperimentSelectorModal_default, st as GeneratedResultRenderer_default, tt as WellPlate_default, u as TimeRangeInput_default, ut as mintPlotlyTemplate, v as estimateSequenceRemainingSeconds, vt as AppSidebar_default, w as ScientificNumber_default, wt as PluginIcon_default, x as sequenceProgressPercent, xt as StepWizard_default, y as formatSequenceEta, yt as FormBuilder_default, z as ProgressBar_default, zt as SearchableSelect_default } from "./components-GDDvof8D.js";
2
+ import { a as tryUseSettingsStore, c as mintApiErrorFromResponse, i as tableDensityToSize, n as colorPalettes, o as useSettingsStore, r as paletteCssVariables, s as MintApiError, t as PALETTE_CSS_VARIABLES } from "./settings-BLr8lzw6.js";
3
+ import { a as SORT_OPTIONS, c as formatExperimentDate, d as resolveExperimentCode, f as BaseModal_default, h as BaseButton_default, i as EXPERIMENT_STATUS_VARIANT_MAP, l as formatExperimentStatus, m as useEventListener, n as EXPERIMENT_STATUS_LABELS, o as datePresetToISO, p as useFocusTrap, r as EXPERIMENT_STATUS_OPTIONS, s as experimentIdFromRoute, t as DATE_PRESET_OPTIONS, u as getExperimentStatusVariant } from "./experiment-utils-DTANyVKV.js";
4
+ import { i as BaseSelect_default, n as Skeleton_default, o as BaseInput_default, r as EmptyState_default } from "./ResourcePickerListInternal-CFAw4vTZ.js";
5
+ import { $ as toTimeCourseDataFrame, $n as FormulaInput_default, $r as snapToSlot, $t as getBioTemplatePackInfo, A as createSamplePrepTemplate, An as getControlDefaults, Ar as isPluginSecretLocked, At as toCalibrationCurveDataFrame, B as toBioTemplateComponentProps, Bn as getDefaultControlView, Br as addMinutes, Bt as validateInstrumentRunData, C as createFlowCytometryPanelTemplate, Cr as FileUploader_default, Ct as toInstrumentRunRows, D as createTimeCourseTemplate, Dn as hslToHex, Dr as PLUGIN_SECRET_FORMAT_REF, Dt as toFlowPanelDataFrame, E as createProtocolStepsTemplate, En as hexToHsl, Er as PLUGIN_SECRET_FORMAT_KEY, Et as toFlowPanelColumns, Fn as controlsToSettingsSchema, Fr as pluginSecretState, Ft as toAssayMatrixSampleOptions, G as toTemplateDataFrame, Gn as getFieldRegistryEntry, Gr as formatDuration, Gt as validateSamplePrepData, H as toBioTemplateComponentPropsById, Hr as durationMinutes, Ht as validateProtocolStepsData, I as listBioTemplateComponentBindings, In as controlsToSidebarPanels, Ir as setPluginSecret, It as validateAssayMatrixData, J as toDoseConditions, Jn as UnitInput_default, Jr as fromMinutes, Jt as bioTemplatePresets, K as toWellMapArray, Kn as getTypeDefault, Kr as formatTime, Kt as validateSampleSheetData, L as toBioTemplateComponentBindings, Ln as controlsToTopBarSettingsConfig, Lr as usesPluginSecretReferences, Lt as validateCalibrationCurveData, M as createPlateMapTemplate, Mn as controlsToFormSchema, Mr as keepPluginSecret, Mt as toAssayMatrixColumns, N as bioTemplatePresetControlValuesToOptions, Nn as controlsToSectionFormSchema, Nr as pluginSecretId, Nt as toAssayMatrixDataFrame, O as createCalibrationCurveTemplate, On as defineControlComponentBindings, Or as PLUGIN_SECRET_REF_KEY, Ot as toFlowPanelRows, P as getBioTemplateComponentBindings, Pn as controlsToSectionFormSchemas, Pr as pluginSecretLabel, Pt as toAssayMatrixRows, Q as toTimeCourseColumns, Qn as useSequenceUtils, Qr as rangesOverlap, Qt as bioTemplatePacks, R as toBioTemplateComponentBindingsById, Rn as controlsToViewIds, Rr as TagsInput_default, Rt as validateDoseResponseData, S as createInstrumentRunTemplate, St as toInstrumentRunDataFrame, T as createAssayMatrixTemplate, Tn as deriveShade, Tr as SecretInput_default, Tt as toInstrumentRunSteps, U as toBioTemplateComponentSnippets, Ur as findAvailableSlots, Ut as validateQpcrPlateData, Vr as compareTime, Vt as validatePlateMapData, W as toBioTemplateComponentUsage, Wr as findNearestTimeSlotIndex, Wt as validateReagentListData, X as toPlateMapEditorState, Xn as MoleculeInput_default, Xr as isTimeInRange, Xt as listBioTemplatePresets, Y as toDoseLayoutState, Yn as useConcentrationUnits, Yr as generateTimeSlots, Yt as getBioTemplatePresetInfo, Z as toWellPlateWells, Zn as SequenceInput_default, Zr as parseTime, Zt as searchBioTemplatePresets, _ as createElisaAssayCollection, _r as resolveJobCapabilities, _t as toProtocolColumns, a as getBioTemplateControlDefaults, ai as useListSelection, an as searchBioTemplateCatalog, at as toSampleRows, b as createQpcrExpressionCollection, bt as toProtocolSteps, c as listBioTemplatePresetControlSchemas, ci as BaseRadioGroup_default, cn as createTemplateCollection, cr as resolveCurrentPluginId, ct as toSamplePrepRows, d as createBioTemplatePresetCollectionFromControls, di as Tooltip_default, dn as ensureTemplateFromCollection, dr as usePluginJobs, dt as toReagentListItems, ei as toMinutes, en as listBioTemplatePacks, er as ATOMIC_WEIGHTS, et as toTimeCourseRows, f as createWellPlateScreenCollection, fi as BaseTextarea_default, fn as extractTemplateCollection, fr as isActiveJobStatus, ft as toReagentRows, g as createFlowCytometryAssayCollection, gr as normalizeJobState, gt as toQpcrWellPlateWells, h as createWesternBlotAssayCollection, hr as normalizeJobPercent, ht as toQpcrRows, i as createBioTemplateControlToolkit, ii as MultiSelect_default, in as listBioTemplateCatalog, it as toSampleOptions, j as createSampleSheetTemplate, jn as useControlSchema, jr as isPluginSecretRef, jt as toCalibrationCurveRows, k as createDoseResponseTemplate, kn as defineControls, kr as clearPluginSecret, kt as toCalibrationCurveColumns, l as requireBioTemplateControlSchema, li as BaseToggle_default, ln as createTemplateEnvelope, lr as createGeneratedAnalysisTransport, lt as toReagentColumns, m as createDefaultBioTemplate, mr as jobStatusLabel, mt as toQpcrDataFrame, n as bioTemplateControlsToSectionFormSchemas, ni as DatePicker_default, nn as bioTemplateCatalog, nr as GeneratedPathInput_default, nt as toSampleColumns, o as getBioTemplateControlSchema, oi as useSelectionLimit, on as TEMPLATE_COLLECTION_KEY, ot as toSamplePrepColumns, p as createBioTemplatePackCollection, pn as getTemplateData, pr as isTerminalJobStatus, pt as toQpcrColumns, q as racksFromPlateState, qn as ConcentrationInput_default, qr as formatTimeSlot, qt as validateTimeCourseData, r as bioTemplateControlsToSidebarPanels, rn as getBioTemplateInfo, rt as toSampleDataFrame, s as listBioTemplateControlSchemas, si as BaseSlider_default, sn as assertTemplateEnvelope, st as toSamplePrepDataFrame, t as bioTemplateControlsToFormSchema, ti as useTimeUtils, tn as searchBioTemplatePacks, tr as useChemicalFormula, tt as toTimeCourseSteps, u as createBioTemplatePresetCollection, ui as BaseCheckbox_default, un as ensureTemplateEnvelope, ur as useGeneratedAnalysis, ut as toReagentDataFrame, v as createTargetedMetabolomicsCollection, vt as toProtocolDataFrame, w as createReagentListTemplate, wr as NumberInput_default, wt as toInstrumentRunScheduleEvents, x as createQpcrPlateTemplate, xr as useMenuKeyboard, xt as toInstrumentRunColumns, y as createLcmsBatchCollection, yr as DateTimePicker_default, yt as toProtocolRows, z as toBioTemplateComponentImports, zn as controlsToViewItems, zr as TimePicker_default, zt as validateFlowCytometryPanelData } from "./templates-BU1pet28.js";
6
+ import { $ as pluginFormDataFromPayload, A as parseDelimitedText, At as getPresenceClientId, B as useRackEditor, Bt as useRovingFocus, C as useExperimentSamples, Ct as controlValuesToComponentBindingsById, Dt as useAppExperiment, E as useSampleGroups, Et as APP_EXPERIMENT_KEY, F as useAutoGroup, Ft as candidateMatchesSearch, G as useDoseCalculator, H as reorderList, I as extractSampleNamesFromDesignData, It as normalizeSearchQuery, J as usePluginJobCenter, K as combinePluginJobSources, L as extractSampleOptionsFromDesignData, Lt as useTextSearch, M as useFileImport, Mt as usePlatformContext, N as validateImportFile, Nt as useTheme, Ot as getInjectedFrontendRevision, P as extractSamplesFromDesignData, Pt as useToast, Q as getPluginPageSelectorItems, R as unwrapExperimentDesignData, Rt as compareSortValues, S as useScheduleDrag, St as controlValuesToComponentBindings, T as useExpansionSet, U as useListReorder, V as REORDER_ANNOUNCER_STYLE, W as useReorderAnnouncer, X as downloadBlob, Y as createPluginClient, Z as downloadPluginEndpoint, _ as toBioTemplateComponentPropsByComponent, _t as defineWellPlateDoseComponentBindings, a as useExperimentSelector, at as buildPluginEndpointUrl, b as useTemplateCollection, bt as defineControlModel, c as DEFAULT_PRESETS, ct as usePluginWorkspace, d as useReagentSeries, dt as useFormBuilder, et as uploadPluginEndpoint, f as useGroupAssignment, ft as evaluateCondition, g as getBioTemplateComponentProps, gt as defineWellPlateControlProps, h as useBioTemplateWorkspace, ht as defineDoseDesignControlModel, i as useAnalysisArtifacts, it as usePluginSettings, j as readFileAsText, jt as usePresenceHeartbeat, k as detectDelimiter, kt as useRuntimeAlignment, l as DEFAULT_UNITS, lt as DEFAULT_MOBILE_VIEWPORT_QUERY, m as useBioTemplatePackWorkspace, mt as defineDoseCalculatorControlProps, nt as usePluginClient, o as useDebouncedWatch, ot as resolvePluginBaseUrl, p as useBioTemplatePresetWorkspace, pt as useForm, q as useJobsStatusTray, rt as usePluginEventStream, s as useProtocolTemplates, st as useRequestSyncState, tt as useCurrentExperiment, u as generateDilutionSeries, ut as useMobileSupportGate, v as useBioTemplateComponents, vt as defineWellPlateDoseControlProps, w as useExperimentData, wt as controlValuesToComponentProps, x as useExperimentSave, y as useBioTemplateControls, yt as useControlWorkspace, z as DEFAULT_COLORS, zt as useSortedItems } from "./validation-Dmp9Q5W0.js";
7
+ import { ADMIN_PANEL_PERMISSIONS, ADMIN_ROLE, canAccessAdmin, canAccessByPolicy, canAccessPlugin, getAccessAudience, getRoleInfo, getUserPermissions, hasAllPermissions, hasAnyPermission, isAdminRole, isAdminUser } from "./permissions.js";
8
+ import { a as useApi, o as useAuthStore, r as AuthenticationRequiredError, t as useExperimentStore } from "./experiment-DgllIc3I.js";
9
+ import { t as ANALYSIS_FILE_ARTIFACT_SCHEMA } from "./analysisArtifactTypes-Cy3D0Ipg.js";
16
10
  import { MINTSdk } from "./install.js";
17
- import { A as useCommandHistory, B as useAsyncBatch, C as coordinateToWellId, D as createPluginResourceClient, E as wellIdsInRectangle, F as resizedLeadingPanelWidth, H as usePasskey, I as resizedTrailingPanelWidth, L as resizedVerticalSplitPercent, M as parseAnalysisArtifactTarget, N as useFileBrowser, O as useResourceCrud, P as usePluginConfig, R as useManualLayoutResize, S as useWellPlateAdapter, T as wellIdToCoordinate, U as useAuth, V as resolvePluginFrontendBase, _ as runWellPlateValidation, a as createPluginClient, b as createRowConditions, c as getPluginPageSelectorItems, d as useCurrentExperiment, f as usePluginClient, g as resolvePluginBaseUrl, h as buildPluginEndpointUrl, i as encodePlatformPickerPath, j as buildAnalysisArtifactTargetQuery, k as useOptimisticMutation, l as pluginFormDataFromPayload, m as usePluginSettings, n as createFilePickerAdapter, o as downloadBlob, p as usePluginEventStream, r as decodePlatformPickerPath, s as downloadPluginEndpoint, t as usePlatformFilePickerAdapter, u as uploadPluginEndpoint, v as useWellPlateValidation, w as useWellPainting, x as createWellPlateWells, y as createColumnConditions, z as useAsync } from "./composables-BCbYb2lA.js";
11
+ import { a as buildAnalysisArtifactTargetQuery, c as resizedLeadingPanelWidth, d as useManualLayoutResize, f as resolvePluginFrontendBase, i as encodePlatformPickerPath, l as resizedTrailingPanelWidth, n as createFilePickerAdapter, o as parseAnalysisArtifactTarget, r as decodePlatformPickerPath, s as useFileBrowser, t as usePlatformFilePickerAdapter, u as resizedVerticalSplitPercent } from "./composables-D6uqp0UF.js";
18
12
  import "./stores/index.js";
13
+ //#region src/lcms.ts
14
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
15
+ var DEFAULT_LCMS_SEQUENCE_COLUMNS = [
16
+ {
17
+ key: "index",
18
+ label: "#"
19
+ },
20
+ {
21
+ key: "sample_type",
22
+ label: "Type"
23
+ },
24
+ {
25
+ key: "file_name",
26
+ label: "File Name"
27
+ },
28
+ {
29
+ key: "position",
30
+ label: "Position"
31
+ },
32
+ {
33
+ key: "instrument_method",
34
+ label: "Method"
35
+ },
36
+ {
37
+ key: "injection_volume",
38
+ label: "Inj Vol",
39
+ align: "right"
40
+ }
41
+ ];
42
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
43
+ function extractLcmsCommonPrefix(fileNames) {
44
+ if (fileNames.length === 0) return "";
45
+ const prefixes = fileNames.map((fileName) => fileName.replace(/_\d{3}$/, "")).map((fileName) => {
46
+ const match = fileName.match(/^(.+?)_(POS|NEG)_/i);
47
+ return match ? match[1] : fileName.replace(/_[^_]+$/, "");
48
+ });
49
+ let common = prefixes[0] ?? "";
50
+ for (const prefix of prefixes.slice(1)) while (common && !prefix.startsWith(common)) {
51
+ const index = common.lastIndexOf("_");
52
+ common = index > 0 ? common.substring(0, index) : common.substring(0, common.length - 1);
53
+ }
54
+ return common;
55
+ }
56
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
57
+ function extractLcmsSampleName(fileName, prefix = "") {
58
+ let name = fileName.replace(/_\d{3}$/, "");
59
+ if (prefix && name.startsWith(prefix)) name = name.substring(prefix.length).replace(/^_+/, "");
60
+ name = name.replace(/^(POS|NEG)_/i, "");
61
+ return name || fileName;
62
+ }
63
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
64
+ function lcmsWellIdFromPosition(position) {
65
+ return position.includes(":") ? position.split(":").pop() ?? position : position;
66
+ }
67
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
68
+ function inferLcmsPlateTypeFromWellIds(wellIds) {
69
+ let maxCol = 0;
70
+ let maxRow = 0;
71
+ for (const wellId of wellIds) {
72
+ const match = wellId.match(/^([A-Z])(\d+)$/i);
73
+ if (!match) continue;
74
+ maxRow = Math.max(maxRow, match[1].toUpperCase().charCodeAt(0) - 64);
75
+ maxCol = Math.max(maxCol, Number(match[2]));
76
+ }
77
+ if (maxCol === 0 && maxRow === 0) return null;
78
+ return maxCol <= 9 && maxRow <= 6 ? "54vial" : "96well";
79
+ }
80
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
81
+ function reconstructLcmsPlateCellsFromSequenceItems(items) {
82
+ const unknownItems = items.filter((item) => item.sample_type === "Unknown");
83
+ if (unknownItems.length === 0) return null;
84
+ const prefix = extractLcmsCommonPrefix(unknownItems.map((item) => item.file_name));
85
+ const seen = /* @__PURE__ */ new Set();
86
+ const cells = [];
87
+ for (const item of unknownItems) {
88
+ const wellId = lcmsWellIdFromPosition(item.position);
89
+ if (seen.has(wellId)) continue;
90
+ seen.add(wellId);
91
+ const match = wellId.match(/^([A-Z])(\d+)$/i);
92
+ if (!match) continue;
93
+ cells.push({
94
+ row: match[1].toUpperCase(),
95
+ column: Number(match[2]),
96
+ sample_name: extractLcmsSampleName(item.file_name, prefix)
97
+ });
98
+ }
99
+ if (cells.length === 0) return null;
100
+ const plateType = inferLcmsPlateTypeFromWellIds(cells.map((cell) => `${cell.row}${cell.column}`));
101
+ if (!plateType) return null;
102
+ return {
103
+ cells,
104
+ plateType
105
+ };
106
+ }
107
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
108
+ function basenameFromWindowsPath(path) {
109
+ if (!path) return "";
110
+ return path.split(/[\\/]/).pop() ?? path;
111
+ }
112
+ //#endregion
19
113
  //#region src/utils/rack.ts
114
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
20
115
  var LCMS_DEFAULT_CONTROL_POSITIONS = {
21
116
  "96well": {
22
117
  blank: {
@@ -53,17 +148,21 @@ var SLOT_ORDER = [
53
148
  "B",
54
149
  "Y"
55
150
  ];
151
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
56
152
  function lcmsPlateTypeToRackFormat(plateType) {
57
153
  return plateType === "96well" ? 96 : 54;
58
154
  }
155
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
59
156
  function rackFormatToLcmsPlateType(format) {
60
157
  if (format === 96) return "96well";
61
158
  if (format === 54) return "54vial";
62
159
  throw new Error(`LCMS plate cells support only 54-vial racks and 96-well plates; received format ${format}.`);
63
160
  }
161
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
64
162
  function lcmsWellId(row, column) {
65
163
  return `${row.toUpperCase()}${column}`;
66
164
  }
165
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
67
166
  function parseLcmsWellId(wellId) {
68
167
  const match = /^([A-Za-z]+)(\d+)$/.exec(wellId.trim());
69
168
  if (!match) throw new Error(`Invalid well id "${wellId}". Expected a row letter followed by a column number, e.g. A1.`);
@@ -72,6 +171,7 @@ function parseLcmsWellId(wellId) {
72
171
  column: Number(match[2])
73
172
  };
74
173
  }
174
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
75
175
  function lcmsPlateCellsToRack(cells, options = {}) {
76
176
  const format = options.format ?? (options.plateType ? lcmsPlateTypeToRackFormat(options.plateType) : inferRackFormat(cells));
77
177
  const slot = options.slot ?? cells.find((cell) => cell.slot)?.slot ?? "R";
@@ -100,6 +200,7 @@ function lcmsPlateCellsToRack(cells, options = {}) {
100
200
  }))
101
201
  };
102
202
  }
203
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
103
204
  function lcmsPlateCellsToRacks(cells, options = {}) {
104
205
  const bySlot = /* @__PURE__ */ new Map();
105
206
  const defaultSlot = options.defaultSlot ?? "R";
@@ -116,16 +217,20 @@ function lcmsPlateCellsToRacks(cells, options = {}) {
116
217
  rackName: options.rackName?.(slot, index) ?? `Rack ${slot}`
117
218
  }));
118
219
  }
220
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
119
221
  function rackToLcmsPlateCells(rack) {
120
222
  return Object.entries(rack.wells).map(([wellId, well]) => wellToLcmsPlateCell(rack, wellId, well)).filter((cell) => cell !== null).sort(comparePlateCells);
121
223
  }
224
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
122
225
  function racksToLcmsPlateCells(racks) {
123
226
  return racks.flatMap(rackToLcmsPlateCells);
124
227
  }
228
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
125
229
  function getLcmsDefaultControlWellId(plateType, sampleType) {
126
230
  const position = LCMS_DEFAULT_CONTROL_POSITIONS[plateType][sampleType];
127
231
  return lcmsWellId(position.row, position.column);
128
232
  }
233
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
129
234
  function createLcmsControlWellEditData(sampleType, options = {}) {
130
235
  const plateType = options.plateType ?? "54vial";
131
236
  return {
@@ -176,6 +281,6 @@ function comparePlateCells(a, b) {
176
281
  return rowDiff === 0 ? a.column - b.column : rowDiff;
177
282
  }
178
283
  //#endregion
179
- export { ADMIN_PANEL_PERMISSIONS, ADMIN_ROLE, ANALYSIS_FILE_ARTIFACT_SCHEMA, APP_EXPERIMENT_KEY, ATOMIC_WEIGHTS, ActionMenu_default as ActionMenu, AdductText_default as AdductText, AlertBox_default as AlertBox, AppAvatarMenu_default as AppAvatarMenu, AppContainer_default as AppContainer, AppLayout_default as AppLayout, AppPluginSwitcher_default as AppPluginSwitcher, AppSidebar_default as AppSidebar, AppToastContainer_default as AppToastContainer, AppTopBar_default as AppTopBar, ArtifactSaveDialog_default as ArtifactSaveDialog, ArtifactSelectorModal_default as ArtifactSelectorModal, AuditTrail_default as AuditTrail, AuthenticationRequiredError, AutoGroupModal_default as AutoGroupModal, Avatar_default as Avatar, BaseButton_default as BaseButton, BaseCheckbox_default as BaseCheckbox, BaseInput_default as BaseInput, BaseModal_default as BaseModal, BasePill_default as BasePill, BaseRadioGroup_default as BaseRadioGroup, BaseSelect_default as BaseSelect, BaseSlider_default as BaseSlider, BaseTabs_default as BaseTabs, BaseTextarea_default as BaseTextarea, BaseToggle_default as BaseToggle, BatchProgressList_default as BatchProgressList, BioTemplateExperimentWorkspaceView_default as BioTemplateExperimentWorkspaceView, BioTemplatePackWorkspaceView_default as BioTemplatePackWorkspaceView, BioTemplatePresetWorkspaceView_default as BioTemplatePresetWorkspaceView, BioTemplateRenderer_default as BioTemplateRenderer, Breadcrumb_default as Breadcrumb, Calendar_default as Calendar, ChartContainer_default as ChartContainer, ChemicalFormula_default as ChemicalFormula, CollapsibleCard_default as CollapsibleCard, ColorSlider_default as ColorSlider, ComponentBindingRenderer_default as ComponentBindingRenderer, ConcentrationInput_default as ConcentrationInput, ConfirmDialog_default as ConfirmDialog, ControlWorkspaceView_default as ControlWorkspaceView, DATE_PRESET_OPTIONS, DEFAULT_COLORS, DEFAULT_LCMS_SEQUENCE_COLUMNS, DEFAULT_MOBILE_VIEWPORT_QUERY, DEFAULT_PRESETS, DEFAULT_UNITS, DataFrame_default as DataFrame, DatePicker_default as DatePicker, DateTimePicker_default as DateTimePicker, Divider_default as Divider, DoseCalculator_default as DoseCalculator, DoseDesignWorkspaceView_default as DoseDesignWorkspaceView, DropdownButton_default as DropdownButton, EXPERIMENT_STATUS_LABELS, EXPERIMENT_STATUS_OPTIONS, EXPERIMENT_STATUS_VARIANT_MAP, EmptyState_default as EmptyState, ExperimentCodeBadge_default as ExperimentCodeBadge, ExperimentDataViewer_default as ExperimentDataViewer, ExperimentPopover_default as ExperimentPopover, ExperimentSelectorModal_default as ExperimentSelectorModal, ExperimentTimeline_default as ExperimentTimeline, FileBrowserModal_default as FileBrowserModal, FilePicker_default as FilePicker, FileUploader_default as FileUploader, FitPanel_default as FitPanel, FormActions_default as FormActions, FormBuilder_default as FormBuilder, FormField_default as FormField, FormulaInput_default as FormulaInput, GeneratedPathInput_default as GeneratedPathInput, GeneratedPlotlyResult_default as GeneratedPlotlyResult, GeneratedPluginView_default as GeneratedPluginView, GeneratedResultRenderer_default as GeneratedResultRenderer, GroupAssigner_default as GroupAssigner, IconButton_default as IconButton, InstrumentAlertLog_default as InstrumentAlertLog, InstrumentStateBadge_default as InstrumentStateBadge, InstrumentStatusCard_default as InstrumentStatusCard, JobsStatusTray_default as JobsStatusTray, LCMS_DEFAULT_CONTROL_POSITIONS, LayoutResizeHandle_default as LayoutResizeHandle, LcmsSequenceTable_default as LcmsSequenceTable, LoadingSpinner_default as LoadingSpinner, MINTSdk, MINTSdk as default, MintApiError, MobileSupportGate_default as MobileSupportGate, MoleculeInput_default as MoleculeInput, MultiSelect_default as MultiSelect, NumberInput_default as NumberInput, PALETTE_CSS_VARIABLES, PLUGIN_SECRET_FORMAT_KEY, PLUGIN_SECRET_FORMAT_REF, PLUGIN_SECRET_REF_KEY, PlateMapEditor_default as PlateMapEditor, PlotlyChart_default as PlotlyChart, PluginIcon_default as PluginIcon, PluginWorkspaceView_default as PluginWorkspaceView, ProgressBar_default as ProgressBar, ProtocolStepEditor_default as ProtocolStepEditor, REORDER_ANNOUNCER_STYLE, RackEditor_default as RackEditor, ReagentEditor_default as ReagentEditor, ReagentList_default as ReagentList, ResourceCard_default as ResourceCard, RuntimeUpdateNotice_default as RuntimeUpdateNotice, SORT_OPTIONS, SampleHierarchyTree_default as SampleHierarchyTree, SampleLegend_default as SampleLegend, SampleSelector_default as SampleSelector, ScheduleCalendar_default as ScheduleCalendar, ScientificNumber_default as ScientificNumber, SearchableSelect_default as SearchableSelect, SecretInput_default as SecretInput, SectionCard_default as SectionCard, SegmentedControl_default as SegmentedControl, SequenceInput_default as SequenceInput, SequenceProgressBar_default as SequenceProgressBar, SettingsModal_default as SettingsModal, Skeleton_default as Skeleton, SmartGroupFieldRecipe_default as SmartGroupFieldRecipe, SmartGroupManual_default as SmartGroupManual, SmartGroupModal_default as SmartGroupModal, StatusIndicator_default as StatusIndicator, StepWizard_default as StepWizard, TEMPLATE_COLLECTION_KEY, TagsInput_default as TagsInput, ThemeToggle_default as ThemeToggle, TimePicker_default as TimePicker, TimeRangeInput_default as TimeRangeInput, Tooltip_default as Tooltip, UnitInput_default as UnitInput, WellPlate_default as WellPlate, addMinutes, assertTemplateEnvelope, basenameFromWindowsPath, bioTemplateCatalog, bioTemplateControlsToFormSchema, bioTemplateControlsToSectionFormSchemas, bioTemplateControlsToSidebarPanels, bioTemplatePacks, bioTemplatePresetControlValuesToOptions, bioTemplatePresets, buildAnalysisArtifactTargetQuery, buildPluginEndpointUrl, canAccessAdmin, canAccessByPolicy, canAccessPlugin, candidateMatchesSearch, clearPluginSecret, colorPalettes, combinePluginJobSources, compareSortValues, compareTime, controlValuesToComponentBindings, controlValuesToComponentBindingsById, controlValuesToComponentProps, controlsToFormSchema, controlsToSectionFormSchema, controlsToSectionFormSchemas, controlsToSettingsSchema, controlsToSidebarPanels, controlsToTopBarSettingsConfig, controlsToViewIds, controlsToViewItems, coordinateToWellId, createAssayMatrixTemplate, createBioTemplateControlToolkit, createBioTemplatePackCollection, createBioTemplatePresetCollection, createBioTemplatePresetCollectionFromControls, createCalibrationCurveTemplate, createColumnConditions, createDefaultBioTemplate, createDoseResponseTemplate, createElisaAssayCollection, createFilePickerAdapter, createFlowCytometryAssayCollection, createFlowCytometryPanelTemplate, createGeneratedAnalysisTransport, createInstrumentRunTemplate, createLcmsBatchCollection, createLcmsControlWellEditData, createPlateMapTemplate, createPluginClient, createPluginResourceClient, createProtocolStepsTemplate, createQpcrExpressionCollection, createQpcrPlateTemplate, createReagentListTemplate, createRowConditions, createSamplePrepTemplate, createSampleSheetTemplate, createTargetedMetabolomicsCollection, createTemplateCollection, createTemplateEnvelope, createTimeCourseTemplate, createWellPlateScreenCollection, createWellPlateWells, createWesternBlotAssayCollection, datePresetToISO, decodePlatformPickerPath, defineControlComponentBindings, defineControlModel, defineControls, defineDoseCalculatorControlProps, defineDoseDesignControlModel, defineWellPlateControlProps, defineWellPlateDoseComponentBindings, defineWellPlateDoseControlProps, deriveShade, detectDelimiter, downloadBlob, downloadPluginEndpoint, durationMinutes, encodePlatformPickerPath, ensureTemplateEnvelope, ensureTemplateFromCollection, estimateSequenceFinishDate, estimateSequenceRemainingSeconds, evaluateCondition, experimentIdFromRoute, extractLcmsCommonPrefix, extractLcmsSampleName, extractSampleNamesFromDesignData, extractSampleOptionsFromDesignData, extractSamplesFromDesignData, extractTemplateCollection, findAvailableSlots, findNearestTimeSlotIndex, formatDuration, formatExperimentDate, formatExperimentStatus, formatSequenceEta, formatSequenceRemaining, formatTime, formatTimeSlot, fromMinutes, generateDilutionSeries, generateTimeSlots, generatedJobDefaults, generatedJobFormSchema, getAccessAudience, getBioTemplateComponentBindings, getBioTemplateComponentProps, getBioTemplateControlDefaults, getBioTemplateControlSchema, getBioTemplateInfo, getBioTemplatePackInfo, getBioTemplatePresetInfo, getControlDefaults, getDefaultControlView, getExperimentStatusVariant, getFieldRegistryEntry, getInjectedFrontendRevision, getLcmsDefaultControlWellId, getPluginPageSelectorItems, getPresenceClientId, getRoleInfo, getTemplateData, getTypeDefault, getUserPermissions, hasAllPermissions, hasAnyPermission, hexToHsl, hslToHex, inferLcmsPlateTypeFromWellIds, isActiveJobStatus, isAdminRole, isAdminUser, isPluginSecretLocked, isPluginSecretRef, isTerminalJobStatus, isTimeInRange, jobStatusLabel, keepPluginSecret, lcmsPlateCellsToRack, lcmsPlateCellsToRacks, lcmsPlateTypeToRackFormat, lcmsWellId, lcmsWellIdFromPosition, listBioTemplateCatalog, listBioTemplateComponentBindings, listBioTemplateControlSchemas, listBioTemplatePacks, listBioTemplatePresetControlSchemas, listBioTemplatePresets, mintApiErrorFromResponse, normalizeAccessPolicy, normalizeGeneratedJobInput, normalizeJobPercent, normalizeJobState, normalizeSearchQuery, paletteCssVariables, parseAnalysisArtifactTarget, parseDelimitedText, parseLcmsWellId, parseTime, pluginFormDataFromPayload, pluginSecretId, pluginSecretLabel, pluginSecretState, rackFormatToLcmsPlateType, rackToLcmsPlateCells, racksToLcmsPlateCells, rangesOverlap, readFileAsText, reconstructLcmsPlateCellsFromSequenceItems, reorderList, requireBioTemplateControlSchema, resizedLeadingPanelWidth, resizedTrailingPanelWidth, resizedVerticalSplitPercent, resolveCurrentPluginId, resolveExperimentCode, resolveJobCapabilities, resolvePluginBaseUrl, resolvePluginFrontendBase, runWellPlateValidation, searchBioTemplateCatalog, searchBioTemplatePacks, searchBioTemplatePresets, sequenceProgressPercent, sequenceSamplesRemaining, setPluginSecret, snapToSlot, tableDensityToSize, toAssayMatrixColumns, toAssayMatrixDataFrame, toAssayMatrixRows, toAssayMatrixSampleOptions, toBioTemplateComponentBindings, toBioTemplateComponentBindingsById, toBioTemplateComponentImports, toBioTemplateComponentProps, toBioTemplateComponentPropsByComponent, toBioTemplateComponentPropsById, toBioTemplateComponentSnippets, toBioTemplateComponentUsage, toCalibrationCurveColumns, toCalibrationCurveDataFrame, toCalibrationCurveRows, toDoseConditions, toDoseLayoutState, toFlowPanelColumns, toFlowPanelDataFrame, toFlowPanelRows, toInstrumentRunColumns, toInstrumentRunDataFrame, toInstrumentRunRows, toInstrumentRunScheduleEvents, toInstrumentRunSteps, toMinutes, toPlateMapEditorState, toProtocolColumns, toProtocolDataFrame, toProtocolRows, toProtocolSteps, toQpcrColumns, toQpcrDataFrame, toQpcrRows, toQpcrWellPlateWells, toReagentColumns, toReagentDataFrame, toReagentListItems, toReagentRows, toSampleColumns, toSampleDataFrame, toSampleOptions, toSamplePrepColumns, toSamplePrepDataFrame, toSamplePrepRows, toSampleRows, toTemplateDataFrame, toTimeCourseColumns, toTimeCourseDataFrame, toTimeCourseRows, toTimeCourseSteps, toWellMapArray, toWellPlateWells, tryUseSettingsStore, unwrapExperimentDesignData, uploadPluginEndpoint, useAnalysisArtifacts, useApi, useAppExperiment, useAsync, useAsyncBatch, useAuth, useAuthStore, useAutoGroup, useBioTemplateComponents, useBioTemplateControls, useBioTemplatePackWorkspace, useBioTemplatePresetWorkspace, useBioTemplateWorkspace, useChemicalFormula, useCommandHistory, useConcentrationUnits, useControlSchema, useControlWorkspace, useCurrentExperiment, useDebouncedWatch, useDoseCalculator, useEventListener, useExpansionSet, useExperimentData, useExperimentSamples, useExperimentSave, useExperimentSelector, useExperimentStore, useFileBrowser, useFileImport, useFocusTrap, useForm, useFormBuilder, useGeneratedAnalysis, useGroupAssignment, useJobsStatusTray, useListReorder, useListSelection, useManualLayoutResize, useMenuKeyboard, useMobileSupportGate, useOptimisticMutation, usePasskey, usePlatformContext, usePlatformFilePickerAdapter, usePluginClient, usePluginConfig, usePluginEventStream, usePluginJobCenter, usePluginJobs, usePluginSettings, usePluginWorkspace, usePresenceHeartbeat, useProtocolTemplates, useRackEditor, useReagentSeries, useReorderAnnouncer, useRequestSyncState, useResourceCrud, useRovingFocus, useRuntimeAlignment, useSampleGroups, useScheduleDrag, useSelectionLimit, useSequenceUtils, useSettingsStore, useSortedItems, useTemplateCollection, useTextSearch, useTheme, useTimeUtils, useToast, useWellPainting, useWellPlateAdapter, useWellPlateEditor, useWellPlateValidation, usesPluginSecretReferences, validateAssayMatrixData, validateCalibrationCurveData, validateDoseResponseData, validateFlowCytometryPanelData, validateImportFile, validateInstrumentRunData, validatePlateMapData, validateProtocolStepsData, validateQpcrPlateData, validateReagentListData, validateSamplePrepData, validateSampleSheetData, validateTimeCourseData, wellIdToCoordinate, wellIdsInRectangle };
284
+ export { ADMIN_PANEL_PERMISSIONS, ADMIN_ROLE, ANALYSIS_FILE_ARTIFACT_SCHEMA, APP_EXPERIMENT_KEY, ATOMIC_WEIGHTS, ActionMenu_default as ActionMenu, AdductText_default as AdductText, AlertBox_default as AlertBox, AppAvatarMenu_default as AppAvatarMenu, AppContainer_default as AppContainer, AppLayout_default as AppLayout, AppSidebar_default as AppSidebar, AppToastContainer_default as AppToastContainer, AppTopBar_default as AppTopBar, ArtifactSaveDialog_default as ArtifactSaveDialog, ArtifactSelectorModal_default as ArtifactSelectorModal, AuditTrail_default as AuditTrail, AuthenticationRequiredError, AutoGroupModal_default as AutoGroupModal, Avatar_default as Avatar, BaseButton_default as BaseButton, BaseCheckbox_default as BaseCheckbox, BaseInput_default as BaseInput, BaseModal_default as BaseModal, BasePill_default as BasePill, BaseRadioGroup_default as BaseRadioGroup, BaseSelect_default as BaseSelect, BaseSlider_default as BaseSlider, BaseTabs_default as BaseTabs, BaseTextarea_default as BaseTextarea, BaseToggle_default as BaseToggle, BatchProgressList_default as BatchProgressList, BioTemplateExperimentWorkspaceView_default as BioTemplateExperimentWorkspaceView, BioTemplatePackWorkspaceView_default as BioTemplatePackWorkspaceView, BioTemplatePresetWorkspaceView_default as BioTemplatePresetWorkspaceView, BioTemplateRenderer_default as BioTemplateRenderer, Breadcrumb_default as Breadcrumb, Calendar_default as Calendar, ChartContainer_default as ChartContainer, ChemicalFormula_default as ChemicalFormula, CollapsibleCard_default as CollapsibleCard, ComponentBindingRenderer_default as ComponentBindingRenderer, ConcentrationInput_default as ConcentrationInput, ConfirmDialog_default as ConfirmDialog, ControlWorkspaceView_default as ControlWorkspaceView, DATE_PRESET_OPTIONS, DEFAULT_COLORS, DEFAULT_LCMS_SEQUENCE_COLUMNS, DEFAULT_MOBILE_VIEWPORT_QUERY, DEFAULT_PRESETS, DEFAULT_UNITS, DataFrame_default as DataFrame, DatePicker_default as DatePicker, DateTimePicker_default as DateTimePicker, Divider_default as Divider, DoseCalculator_default as DoseCalculator, DoseDesignWorkspaceView_default as DoseDesignWorkspaceView, EXPERIMENT_STATUS_LABELS, EXPERIMENT_STATUS_OPTIONS, EXPERIMENT_STATUS_VARIANT_MAP, EmptyState_default as EmptyState, ExperimentCodeBadge_default as ExperimentCodeBadge, ExperimentDataViewer_default as ExperimentDataViewer, ExperimentPopover_default as ExperimentPopover, ExperimentSelectorModal_default as ExperimentSelectorModal, ExperimentTimeline_default as ExperimentTimeline, FilePicker_default as FilePicker, FileUploader_default as FileUploader, FitPanel_default as FitPanel, FormActions_default as FormActions, FormBuilder_default as FormBuilder, FormField_default as FormField, FormulaInput_default as FormulaInput, GeneratedPathInput_default as GeneratedPathInput, GeneratedPlotlyResult_default as GeneratedPlotlyResult, GeneratedPluginView_default as GeneratedPluginView, GeneratedResultRenderer_default as GeneratedResultRenderer, GroupAssigner_default as GroupAssigner, IconButton_default as IconButton, InstrumentStateBadge_default as InstrumentStateBadge, JobsStatusTray_default as JobsStatusTray, LCMS_DEFAULT_CONTROL_POSITIONS, LayoutResizeHandle_default as LayoutResizeHandle, LoadingSpinner_default as LoadingSpinner, MINTSdk, MINTSdk as default, MintApiError, MobileSupportGate_default as MobileSupportGate, MoleculeInput_default as MoleculeInput, MultiSelect_default as MultiSelect, NumberInput_default as NumberInput, PALETTE_CSS_VARIABLES, PLUGIN_SECRET_FORMAT_KEY, PLUGIN_SECRET_FORMAT_REF, PLUGIN_SECRET_REF_KEY, PlateEditor_default as PlateEditor, PlotlyChart_default as PlotlyChart, PluginIcon_default as PluginIcon, PluginWorkspaceView_default as PluginWorkspaceView, ProgressBar_default as ProgressBar, ProtocolStepEditor_default as ProtocolStepEditor, REORDER_ANNOUNCER_STYLE, ReagentEditor_default as ReagentEditor, ReagentList_default as ReagentList, ResourceCard_default as ResourceCard, RuntimeUpdateNotice_default as RuntimeUpdateNotice, SORT_OPTIONS, SampleHierarchyTree_default as SampleHierarchyTree, SampleLegend_default as SampleLegend, SampleSelector_default as SampleSelector, ScheduleCalendar_default as ScheduleCalendar, ScientificNumber_default as ScientificNumber, SearchableSelect_default as SearchableSelect, SecretInput_default as SecretInput, SectionCard_default as SectionCard, SegmentedControl_default as SegmentedControl, SequenceInput_default as SequenceInput, SequenceProgressBar_default as SequenceProgressBar, SettingsModal_default as SettingsModal, Skeleton_default as Skeleton, SmartGroupFieldRecipe_default as SmartGroupFieldRecipe, SmartGroupManual_default as SmartGroupManual, SmartGroupModal_default as SmartGroupModal, StatusIndicator_default as StatusIndicator, StepWizard_default as StepWizard, TEMPLATE_COLLECTION_KEY, TagsInput_default as TagsInput, ThemeToggle_default as ThemeToggle, TimePicker_default as TimePicker, TimeRangeInput_default as TimeRangeInput, Tooltip_default as Tooltip, UnitInput_default as UnitInput, WellPlate_default as WellPlate, addMinutes, assertTemplateEnvelope, basenameFromWindowsPath, bioTemplateCatalog, bioTemplateControlsToFormSchema, bioTemplateControlsToSectionFormSchemas, bioTemplateControlsToSidebarPanels, bioTemplatePacks, bioTemplatePresetControlValuesToOptions, bioTemplatePresets, buildAnalysisArtifactTargetQuery, buildPluginEndpointUrl, canAccessAdmin, canAccessByPolicy, canAccessPlugin, candidateMatchesSearch, clearPluginSecret, colorPalettes, combinePluginJobSources, compareSortValues, compareTime, controlValuesToComponentBindings, controlValuesToComponentBindingsById, controlValuesToComponentProps, controlsToFormSchema, controlsToSectionFormSchema, controlsToSectionFormSchemas, controlsToSettingsSchema, controlsToSidebarPanels, controlsToTopBarSettingsConfig, controlsToViewIds, controlsToViewItems, createAssayMatrixTemplate, createBioTemplateControlToolkit, createBioTemplatePackCollection, createBioTemplatePresetCollection, createBioTemplatePresetCollectionFromControls, createCalibrationCurveTemplate, createDefaultBioTemplate, createDoseResponseTemplate, createElisaAssayCollection, createFilePickerAdapter, createFlowCytometryAssayCollection, createFlowCytometryPanelTemplate, createGeneratedAnalysisTransport, createInstrumentRunTemplate, createLcmsBatchCollection, createLcmsControlWellEditData, createPlateMapTemplate, createPluginClient, createProtocolStepsTemplate, createQpcrExpressionCollection, createQpcrPlateTemplate, createReagentListTemplate, createSamplePrepTemplate, createSampleSheetTemplate, createTargetedMetabolomicsCollection, createTemplateCollection, createTemplateEnvelope, createTimeCourseTemplate, createWellPlateScreenCollection, createWesternBlotAssayCollection, datePresetToISO, decodePlatformPickerPath, defineControlComponentBindings, defineControlModel, defineControls, defineDoseCalculatorControlProps, defineDoseDesignControlModel, defineWellPlateControlProps, defineWellPlateDoseComponentBindings, defineWellPlateDoseControlProps, deriveShade, detectDelimiter, downloadBlob, downloadPluginEndpoint, durationMinutes, encodePlatformPickerPath, ensureTemplateEnvelope, ensureTemplateFromCollection, estimateSequenceFinishDate, estimateSequenceRemainingSeconds, evaluateCondition, experimentIdFromRoute, extractLcmsCommonPrefix, extractLcmsSampleName, extractSampleNamesFromDesignData, extractSampleOptionsFromDesignData, extractSamplesFromDesignData, extractTemplateCollection, findAvailableSlots, findNearestTimeSlotIndex, formatDuration, formatExperimentDate, formatExperimentStatus, formatSequenceEta, formatSequenceRemaining, formatTime, formatTimeSlot, fromMinutes, generateDilutionSeries, generateTimeSlots, generatedJobDefaults, generatedJobFormSchema, getAccessAudience, getBioTemplateComponentBindings, getBioTemplateComponentProps, getBioTemplateControlDefaults, getBioTemplateControlSchema, getBioTemplateInfo, getBioTemplatePackInfo, getBioTemplatePresetInfo, getControlDefaults, getDefaultControlView, getExperimentStatusVariant, getFieldRegistryEntry, getInjectedFrontendRevision, getLcmsDefaultControlWellId, getPluginPageSelectorItems, getPresenceClientId, getRoleInfo, getTemplateData, getTypeDefault, getUserPermissions, hasAllPermissions, hasAnyPermission, hexToHsl, hslToHex, inferLcmsPlateTypeFromWellIds, isActiveJobStatus, isAdminRole, isAdminUser, isPluginSecretLocked, isPluginSecretRef, isTerminalJobStatus, isTimeInRange, jobStatusLabel, keepPluginSecret, lcmsPlateCellsToRack, lcmsPlateCellsToRacks, lcmsPlateTypeToRackFormat, lcmsWellId, lcmsWellIdFromPosition, listBioTemplateCatalog, listBioTemplateComponentBindings, listBioTemplateControlSchemas, listBioTemplatePacks, listBioTemplatePresetControlSchemas, listBioTemplatePresets, mintApiErrorFromResponse, mintPlotlyTemplate, normalizeGeneratedJobInput, normalizeJobPercent, normalizeJobState, normalizeSearchQuery, paletteCssVariables, parseAnalysisArtifactTarget, parseDelimitedText, parseLcmsWellId, parseTime, pluginFormDataFromPayload, pluginSecretId, pluginSecretLabel, pluginSecretState, rackFormatToLcmsPlateType, rackToLcmsPlateCells, racksFromPlateState, racksToLcmsPlateCells, rangesOverlap, readFileAsText, reconstructLcmsPlateCellsFromSequenceItems, reorderList, requireBioTemplateControlSchema, resizedLeadingPanelWidth, resizedTrailingPanelWidth, resizedVerticalSplitPercent, resolveCurrentPluginId, resolveExperimentCode, resolveJobCapabilities, resolvePluginBaseUrl, resolvePluginFrontendBase, sampleTypeMarker, searchBioTemplateCatalog, searchBioTemplatePacks, searchBioTemplatePresets, sequenceProgressPercent, sequenceSamplesRemaining, setPluginSecret, snapToSlot, tableDensityToSize, toAssayMatrixColumns, toAssayMatrixDataFrame, toAssayMatrixRows, toAssayMatrixSampleOptions, toBioTemplateComponentBindings, toBioTemplateComponentBindingsById, toBioTemplateComponentImports, toBioTemplateComponentProps, toBioTemplateComponentPropsByComponent, toBioTemplateComponentPropsById, toBioTemplateComponentSnippets, toBioTemplateComponentUsage, toCalibrationCurveColumns, toCalibrationCurveDataFrame, toCalibrationCurveRows, toDoseConditions, toDoseLayoutState, toFlowPanelColumns, toFlowPanelDataFrame, toFlowPanelRows, toInstrumentRunColumns, toInstrumentRunDataFrame, toInstrumentRunRows, toInstrumentRunScheduleEvents, toInstrumentRunSteps, toMinutes, toPlateMapEditorState, toProtocolColumns, toProtocolDataFrame, toProtocolRows, toProtocolSteps, toQpcrColumns, toQpcrDataFrame, toQpcrRows, toQpcrWellPlateWells, toReagentColumns, toReagentDataFrame, toReagentListItems, toReagentRows, toSampleColumns, toSampleDataFrame, toSampleOptions, toSamplePrepColumns, toSamplePrepDataFrame, toSamplePrepRows, toSampleRows, toTemplateDataFrame, toTimeCourseColumns, toTimeCourseDataFrame, toTimeCourseRows, toTimeCourseSteps, toWellMapArray, toWellPlateWells, tryUseSettingsStore, unwrapExperimentDesignData, uploadPluginEndpoint, useAnalysisArtifacts, useApi, useAppExperiment, useAuthStore, useAutoGroup, useBioTemplateComponents, useBioTemplateControls, useBioTemplatePackWorkspace, useBioTemplatePresetWorkspace, useBioTemplateWorkspace, useChemicalFormula, useConcentrationUnits, useControlSchema, useControlWorkspace, useCurrentExperiment, useDebouncedWatch, useDoseCalculator, useEventListener, useExpansionSet, useExperimentData, useExperimentSamples, useExperimentSave, useExperimentSelector, useExperimentStore, useFileBrowser, useFileImport, useFocusTrap, useForm, useFormBuilder, useGeneratedAnalysis, useGroupAssignment, useJobsStatusTray, useListReorder, useListSelection, useManualLayoutResize, useMenuKeyboard, useMobileSupportGate, usePlatformContext, usePlatformFilePickerAdapter, usePluginClient, usePluginEventStream, usePluginJobCenter, usePluginJobs, usePluginSettings, usePluginWorkspace, usePresenceHeartbeat, useProtocolTemplates, useRackEditor, useReagentSeries, useReorderAnnouncer, useRequestSyncState, useRovingFocus, useRuntimeAlignment, useSampleGroups, useScheduleDrag, useSelectionLimit, useSequenceUtils, useSettingsStore, useSortedItems, useTemplateCollection, useTextSearch, useTheme, useTimeUtils, useToast, usesPluginSecretReferences, validateAssayMatrixData, validateCalibrationCurveData, validateDoseResponseData, validateFlowCytometryPanelData, validateImportFile, validateInstrumentRunData, validatePlateMapData, validateProtocolStepsData, validateQpcrPlateData, validateReagentListData, validateSamplePrepData, validateSampleSheetData, validateTimeCourseData };
180
285
 
181
286
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/utils/rack.ts"],"sourcesContent":["import type { Rack, SlotPosition, Well, WellEditData, WellPlateFormat } from '../types'\n\nexport type LcmsPlateType = '96well' | '54vial'\nexport type LcmsControlSampleType = 'blank' | 'qc' | 'iqc'\n\nexport interface LcmsPlateCell {\n row: string\n column: number\n sample_name: string\n sample_type?: string | null\n injection_volume?: number | null\n injection_count?: number | null\n custom_method?: string | null\n slot?: SlotPosition | null\n}\n\nexport interface LcmsPlateCellsToRackOptions {\n rackId?: string\n rackName?: string\n format?: WellPlateFormat\n plateType?: LcmsPlateType\n slot?: SlotPosition\n injectionVolume?: number\n}\n\nexport interface LcmsPlateCellsToRacksOptions extends Omit<LcmsPlateCellsToRackOptions, 'rackId' | 'rackName' | 'slot'> {\n defaultSlot?: SlotPosition\n rackId?: (slot: SlotPosition, index: number) => string\n rackName?: (slot: SlotPosition, index: number) => string\n}\n\nexport const LCMS_DEFAULT_CONTROL_POSITIONS: Record<LcmsPlateType, Record<LcmsControlSampleType, { row: string; column: number }>> = {\n '96well': {\n blank: { row: 'H', column: 12 },\n qc: { row: 'H', column: 11 },\n iqc: { row: 'H', column: 10 },\n },\n '54vial': {\n blank: { row: 'F', column: 9 },\n qc: { row: 'F', column: 8 },\n iqc: { row: 'F', column: 7 },\n },\n}\n\nconst SLOT_ORDER: SlotPosition[] = ['R', 'G', 'B', 'Y']\n\nexport function lcmsPlateTypeToRackFormat(plateType: LcmsPlateType): WellPlateFormat {\n return plateType === '96well' ? 96 : 54\n}\n\nexport function rackFormatToLcmsPlateType(format: WellPlateFormat): LcmsPlateType {\n if (format === 96) return '96well'\n if (format === 54) return '54vial'\n throw new Error(`LCMS plate cells support only 54-vial racks and 96-well plates; received format ${format}.`)\n}\n\nexport function lcmsWellId(row: string, column: number): string {\n return `${row.toUpperCase()}${column}`\n}\n\nexport function parseLcmsWellId(wellId: string): { row: string; column: number } {\n const match = /^([A-Za-z]+)(\\d+)$/.exec(wellId.trim())\n if (!match) {\n throw new Error(`Invalid well id \"${wellId}\". Expected a row letter followed by a column number, e.g. A1.`)\n }\n\n return {\n row: match[1].toUpperCase(),\n column: Number(match[2]),\n }\n}\n\nexport function lcmsPlateCellsToRack(cells: LcmsPlateCell[], options: LcmsPlateCellsToRackOptions = {}): Rack {\n const format = options.format ?? (options.plateType ? lcmsPlateTypeToRackFormat(options.plateType) : inferRackFormat(cells))\n const slot = options.slot ?? cells.find(cell => cell.slot)?.slot ?? 'R'\n const injectionVolume = options.injectionVolume ?? inferInjectionVolume(cells) ?? 5\n\n return {\n id: options.rackId ?? `rack-${slot}`,\n name: options.rackName ?? `Rack ${slot}`,\n format,\n slot,\n injectionVolume,\n wells: Object.fromEntries(\n cells\n .filter(cell => cell.sample_name.trim())\n .map((cell) => {\n const wellId = lcmsWellId(cell.row, cell.column)\n const well: Partial<Well> = {\n id: wellId,\n row: rowIndex(cell.row),\n col: cell.column - 1,\n state: 'filled',\n sampleType: cell.sample_type ?? 'sample',\n metadata: {\n label: cell.sample_name.trim(),\n injectionVolume: cell.injection_volume ?? injectionVolume,\n injectionCount: cell.injection_count ?? 1,\n customMethod: cell.custom_method ?? null,\n },\n }\n return [wellId, well]\n }),\n ),\n }\n}\n\nexport function lcmsPlateCellsToRacks(cells: LcmsPlateCell[], options: LcmsPlateCellsToRacksOptions = {}): Rack[] {\n const bySlot = new Map<SlotPosition, LcmsPlateCell[]>()\n const defaultSlot = options.defaultSlot ?? 'R'\n\n for (const cell of cells) {\n const slot = cell.slot ?? defaultSlot\n const slotCells = bySlot.get(slot) ?? []\n slotCells.push(cell)\n bySlot.set(slot, slotCells)\n }\n\n return Array.from(bySlot.entries())\n .sort(([a], [b]) => SLOT_ORDER.indexOf(a) - SLOT_ORDER.indexOf(b))\n .map(([slot, slotCells], index) => lcmsPlateCellsToRack(slotCells, {\n ...options,\n slot,\n rackId: options.rackId?.(slot, index) ?? `rack-${slot}`,\n rackName: options.rackName?.(slot, index) ?? `Rack ${slot}`,\n }))\n}\n\nexport function rackToLcmsPlateCells(rack: Rack): LcmsPlateCell[] {\n return Object.entries(rack.wells)\n .map(([wellId, well]) => wellToLcmsPlateCell(rack, wellId, well))\n .filter((cell): cell is LcmsPlateCell => cell !== null)\n .sort(comparePlateCells)\n}\n\nexport function racksToLcmsPlateCells(racks: Rack[]): LcmsPlateCell[] {\n return racks.flatMap(rackToLcmsPlateCells)\n}\n\nexport function getLcmsDefaultControlWellId(plateType: LcmsPlateType, sampleType: LcmsControlSampleType): string {\n const position = LCMS_DEFAULT_CONTROL_POSITIONS[plateType][sampleType]\n return lcmsWellId(position.row, position.column)\n}\n\nexport function createLcmsControlWellEditData(\n sampleType: LcmsControlSampleType,\n options: {\n wellId?: string\n plateType?: LcmsPlateType\n injectionVolume?: number\n } = {},\n): WellEditData {\n const plateType = options.plateType ?? '54vial'\n return {\n wellId: options.wellId ?? getLcmsDefaultControlWellId(plateType, sampleType),\n label: sampleType === 'blank' ? 'Blank' : sampleType.toUpperCase(),\n sampleType,\n injectionVolume: options.injectionVolume ?? 5,\n injectionCount: 1,\n customMethod: '',\n }\n}\n\nfunction wellToLcmsPlateCell(rack: Rack, wellId: string, well: Partial<Well>): LcmsPlateCell | null {\n const metadata = well.metadata ?? {}\n const label = getString(metadata.label)\n if (!label) return null\n\n const parsed = parseLcmsWellId(well.id ?? wellId)\n return {\n row: parsed.row,\n column: parsed.column,\n sample_name: label,\n sample_type: well.sampleType ?? null,\n injection_volume: getNumber(metadata.injectionVolume) ?? rack.injectionVolume,\n injection_count: getNumber(metadata.injectionCount) ?? 1,\n custom_method: getNullableString(metadata.customMethod),\n slot: rack.slot,\n }\n}\n\nfunction inferRackFormat(cells: LcmsPlateCell[]): WellPlateFormat {\n return cells.some(cell => rowIndex(cell.row) > 5 || cell.column > 9) ? 96 : 54\n}\n\nfunction inferInjectionVolume(cells: LcmsPlateCell[]): number | undefined {\n return cells.find(cell => typeof cell.injection_volume === 'number')?.injection_volume ?? undefined\n}\n\nfunction rowIndex(row: string): number {\n return row.toUpperCase().charCodeAt(0) - 65\n}\n\nfunction getString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined\n}\n\nfunction getNullableString(value: unknown): string | null {\n return typeof value === 'string' && value.trim() ? value.trim() : null\n}\n\nfunction getNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction comparePlateCells(a: LcmsPlateCell, b: LcmsPlateCell): number {\n const rowDiff = rowIndex(a.row) - rowIndex(b.row)\n return rowDiff === 0 ? a.column - b.column : rowDiff\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/lcms.ts","../src/utils/rack.ts"],"sourcesContent":["import type { LcmsPlateCell, LcmsPlateType } from './utils/rack'\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport type LcmsPolarity = 'POS' | 'NEG' | 'BOTH'\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport type LcmsContainerType = 'VIAL' | 'PLATE'\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport interface LcmsSequenceItem {\n sample_type: string\n file_name: string\n sample_id: string\n path: string\n instrument_method: string\n position: string\n injection_volume: number\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport interface LcmsSequenceTableColumn {\n key: keyof LcmsSequenceItem | 'index' | 'actions'\n label: string\n align?: 'left' | 'right'\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport const DEFAULT_LCMS_SEQUENCE_COLUMNS: LcmsSequenceTableColumn[] = [\n { key: 'index', label: '#' },\n { key: 'sample_type', label: 'Type' },\n { key: 'file_name', label: 'File Name' },\n { key: 'position', label: 'Position' },\n { key: 'instrument_method', label: 'Method' },\n { key: 'injection_volume', label: 'Inj Vol', align: 'right' },\n]\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function extractLcmsCommonPrefix(fileNames: readonly string[]): string {\n if (fileNames.length === 0) return ''\n const stripped = fileNames.map(fileName => fileName.replace(/_\\d{3}$/, ''))\n const prefixes = stripped.map((fileName) => {\n const match = fileName.match(/^(.+?)_(POS|NEG)_/i)\n return match ? match[1] : fileName.replace(/_[^_]+$/, '')\n })\n\n let common = prefixes[0] ?? ''\n for (const prefix of prefixes.slice(1)) {\n while (common && !prefix.startsWith(common)) {\n const index = common.lastIndexOf('_')\n common = index > 0 ? common.substring(0, index) : common.substring(0, common.length - 1)\n }\n }\n return common\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function extractLcmsSampleName(fileName: string, prefix = ''): string {\n let name = fileName.replace(/_\\d{3}$/, '')\n if (prefix && name.startsWith(prefix)) {\n name = name.substring(prefix.length).replace(/^_+/, '')\n }\n name = name.replace(/^(POS|NEG)_/i, '')\n return name || fileName\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function lcmsWellIdFromPosition(position: string): string {\n return position.includes(':') ? position.split(':').pop() ?? position : position\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function inferLcmsPlateTypeFromWellIds(wellIds: readonly string[]): LcmsPlateType | null {\n let maxCol = 0\n let maxRow = 0\n for (const wellId of wellIds) {\n const match = wellId.match(/^([A-Z])(\\d+)$/i)\n if (!match) continue\n maxRow = Math.max(maxRow, match[1].toUpperCase().charCodeAt(0) - 64)\n maxCol = Math.max(maxCol, Number(match[2]))\n }\n if (maxCol === 0 && maxRow === 0) return null\n return maxCol <= 9 && maxRow <= 6 ? '54vial' : '96well'\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function reconstructLcmsPlateCellsFromSequenceItems(\n items: readonly LcmsSequenceItem[],\n): { cells: LcmsPlateCell[]; plateType: LcmsPlateType } | null {\n const unknownItems = items.filter(item => item.sample_type === 'Unknown')\n if (unknownItems.length === 0) return null\n\n const prefix = extractLcmsCommonPrefix(unknownItems.map(item => item.file_name))\n const seen = new Set<string>()\n const cells: LcmsPlateCell[] = []\n\n for (const item of unknownItems) {\n const wellId = lcmsWellIdFromPosition(item.position)\n if (seen.has(wellId)) continue\n seen.add(wellId)\n\n const match = wellId.match(/^([A-Z])(\\d+)$/i)\n if (!match) continue\n cells.push({\n row: match[1].toUpperCase(),\n column: Number(match[2]),\n sample_name: extractLcmsSampleName(item.file_name, prefix),\n })\n }\n\n if (cells.length === 0) return null\n const plateType = inferLcmsPlateTypeFromWellIds(cells.map(cell => `${cell.row}${cell.column}`))\n if (!plateType) return null\n return { cells, plateType }\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function basenameFromWindowsPath(path: string | null | undefined): string {\n if (!path) return ''\n return path.split(/[\\\\/]/).pop() ?? path\n}\n","import type { Rack, SlotPosition, Well, WellEditData, WellPlateFormat } from '../types'\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport type LcmsPlateType = '96well' | '54vial'\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport type LcmsControlSampleType = 'blank' | 'qc' | 'iqc'\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport interface LcmsPlateCell {\n row: string\n column: number\n sample_name: string\n sample_type?: string | null\n injection_volume?: number | null\n injection_count?: number | null\n custom_method?: string | null\n slot?: SlotPosition | null\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport interface LcmsPlateCellsToRackOptions {\n rackId?: string\n rackName?: string\n format?: WellPlateFormat\n plateType?: LcmsPlateType\n slot?: SlotPosition\n injectionVolume?: number\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport interface LcmsPlateCellsToRacksOptions extends Omit<LcmsPlateCellsToRackOptions, 'rackId' | 'rackName' | 'slot'> {\n defaultSlot?: SlotPosition\n rackId?: (slot: SlotPosition, index: number) => string\n rackName?: (slot: SlotPosition, index: number) => string\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport const LCMS_DEFAULT_CONTROL_POSITIONS: Record<LcmsPlateType, Record<LcmsControlSampleType, { row: string; column: number }>> = {\n '96well': {\n blank: { row: 'H', column: 12 },\n qc: { row: 'H', column: 11 },\n iqc: { row: 'H', column: 10 },\n },\n '54vial': {\n blank: { row: 'F', column: 9 },\n qc: { row: 'F', column: 8 },\n iqc: { row: 'F', column: 7 },\n },\n}\n\nconst SLOT_ORDER: SlotPosition[] = ['R', 'G', 'B', 'Y']\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function lcmsPlateTypeToRackFormat(plateType: LcmsPlateType): WellPlateFormat {\n return plateType === '96well' ? 96 : 54\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function rackFormatToLcmsPlateType(format: WellPlateFormat): LcmsPlateType {\n if (format === 96) return '96well'\n if (format === 54) return '54vial'\n throw new Error(`LCMS plate cells support only 54-vial racks and 96-well plates; received format ${format}.`)\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function lcmsWellId(row: string, column: number): string {\n return `${row.toUpperCase()}${column}`\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function parseLcmsWellId(wellId: string): { row: string; column: number } {\n const match = /^([A-Za-z]+)(\\d+)$/.exec(wellId.trim())\n if (!match) {\n throw new Error(`Invalid well id \"${wellId}\". Expected a row letter followed by a column number, e.g. A1.`)\n }\n\n return {\n row: match[1].toUpperCase(),\n column: Number(match[2]),\n }\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function lcmsPlateCellsToRack(cells: LcmsPlateCell[], options: LcmsPlateCellsToRackOptions = {}): Rack {\n const format = options.format ?? (options.plateType ? lcmsPlateTypeToRackFormat(options.plateType) : inferRackFormat(cells))\n const slot = options.slot ?? cells.find(cell => cell.slot)?.slot ?? 'R'\n const injectionVolume = options.injectionVolume ?? inferInjectionVolume(cells) ?? 5\n\n return {\n id: options.rackId ?? `rack-${slot}`,\n name: options.rackName ?? `Rack ${slot}`,\n format,\n slot,\n injectionVolume,\n wells: Object.fromEntries(\n cells\n .filter(cell => cell.sample_name.trim())\n .map((cell) => {\n const wellId = lcmsWellId(cell.row, cell.column)\n const well: Partial<Well> = {\n id: wellId,\n row: rowIndex(cell.row),\n col: cell.column - 1,\n state: 'filled',\n sampleType: cell.sample_type ?? 'sample',\n metadata: {\n label: cell.sample_name.trim(),\n injectionVolume: cell.injection_volume ?? injectionVolume,\n injectionCount: cell.injection_count ?? 1,\n customMethod: cell.custom_method ?? null,\n },\n }\n return [wellId, well]\n }),\n ),\n }\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function lcmsPlateCellsToRacks(cells: LcmsPlateCell[], options: LcmsPlateCellsToRacksOptions = {}): Rack[] {\n const bySlot = new Map<SlotPosition, LcmsPlateCell[]>()\n const defaultSlot = options.defaultSlot ?? 'R'\n\n for (const cell of cells) {\n const slot = cell.slot ?? defaultSlot\n const slotCells = bySlot.get(slot) ?? []\n slotCells.push(cell)\n bySlot.set(slot, slotCells)\n }\n\n return Array.from(bySlot.entries())\n .sort(([a], [b]) => SLOT_ORDER.indexOf(a) - SLOT_ORDER.indexOf(b))\n .map(([slot, slotCells], index) => lcmsPlateCellsToRack(slotCells, {\n ...options,\n slot,\n rackId: options.rackId?.(slot, index) ?? `rack-${slot}`,\n rackName: options.rackName?.(slot, index) ?? `Rack ${slot}`,\n }))\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function rackToLcmsPlateCells(rack: Rack): LcmsPlateCell[] {\n return Object.entries(rack.wells)\n .map(([wellId, well]) => wellToLcmsPlateCell(rack, wellId, well))\n .filter((cell): cell is LcmsPlateCell => cell !== null)\n .sort(comparePlateCells)\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function racksToLcmsPlateCells(racks: Rack[]): LcmsPlateCell[] {\n return racks.flatMap(rackToLcmsPlateCells)\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function getLcmsDefaultControlWellId(plateType: LcmsPlateType, sampleType: LcmsControlSampleType): string {\n const position = LCMS_DEFAULT_CONTROL_POSITIONS[plateType][sampleType]\n return lcmsWellId(position.row, position.column)\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function createLcmsControlWellEditData(\n sampleType: LcmsControlSampleType,\n options: {\n wellId?: string\n plateType?: LcmsPlateType\n injectionVolume?: number\n } = {},\n): WellEditData {\n const plateType = options.plateType ?? '54vial'\n return {\n wellId: options.wellId ?? getLcmsDefaultControlWellId(plateType, sampleType),\n label: sampleType === 'blank' ? 'Blank' : sampleType.toUpperCase(),\n sampleType,\n injectionVolume: options.injectionVolume ?? 5,\n injectionCount: 1,\n customMethod: '',\n }\n}\n\nfunction wellToLcmsPlateCell(rack: Rack, wellId: string, well: Partial<Well>): LcmsPlateCell | null {\n const metadata = well.metadata ?? {}\n const label = getString(metadata.label)\n if (!label) return null\n\n const parsed = parseLcmsWellId(well.id ?? wellId)\n return {\n row: parsed.row,\n column: parsed.column,\n sample_name: label,\n sample_type: well.sampleType ?? null,\n injection_volume: getNumber(metadata.injectionVolume) ?? rack.injectionVolume,\n injection_count: getNumber(metadata.injectionCount) ?? 1,\n custom_method: getNullableString(metadata.customMethod),\n slot: rack.slot,\n }\n}\n\nfunction inferRackFormat(cells: LcmsPlateCell[]): WellPlateFormat {\n return cells.some(cell => rowIndex(cell.row) > 5 || cell.column > 9) ? 96 : 54\n}\n\nfunction inferInjectionVolume(cells: LcmsPlateCell[]): number | undefined {\n return cells.find(cell => typeof cell.injection_volume === 'number')?.injection_volume ?? undefined\n}\n\nfunction rowIndex(row: string): number {\n return row.toUpperCase().charCodeAt(0) - 65\n}\n\nfunction getString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined\n}\n\nfunction getNullableString(value: unknown): string | null {\n return typeof value === 'string' && value.trim() ? value.trim() : null\n}\n\nfunction getNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction comparePlateCells(a: LcmsPlateCell, b: LcmsPlateCell): number {\n const rowDiff = rowIndex(a.row) - rowIndex(b.row)\n return rowDiff === 0 ? a.column - b.column : rowDiff\n}\n"],"mappings":"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"}
package/dist/install.js CHANGED
@@ -1,5 +1,4 @@
1
- import "./useControlSchema-vLiRPUmj.js";
2
- import { t as components_exports } from "./components-Bbg_gtzF.js";
1
+ import { t as components_exports } from "./components-GDDvof8D.js";
3
2
  //#region src/install.ts
4
3
  /**
5
4
  * Vue plugin that registers all MINT SDK components globally.
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","names":[],"sources":["../src/install.ts"],"sourcesContent":["import * as components from './components'\n\ntype ComponentRegistryApp = {\n component: (name: string, component: any) => unknown\n}\n\nexport interface MINTSdkPlugin {\n install(app: ComponentRegistryApp): void\n}\n\n/**\n * Vue plugin that registers all MINT SDK components globally.\n *\n * @example\n * ```typescript\n * import { createApp } from 'vue'\n * import { MINTSdk } from '@morscherlab/mint-sdk'\n * import '@morscherlab/mint-sdk/styles'\n *\n * const app = createApp(App)\n * app.use(MINTSdk)\n * ```\n */\nexport const MINTSdk: MINTSdkPlugin = {\n install(app) {\n for (const [name, component] of Object.entries(components)) {\n // Check if it's a valid Vue component (has setup, render, or template)\n if (\n component &&\n typeof component === 'object' &&\n ('setup' in component || 'render' in component || '__name' in component)\n ) {\n app.component(name, component)\n }\n }\n },\n}\n\nexport default MINTSdk\n"],"mappings":";;;;;;;;;;;;;;;;AAuBA,IAAa,UAAyB,EACpC,QAAQ,KAAK;AACX,MAAK,MAAM,CAAC,MAAM,cAAc,OAAO,QAAQ,mBAAW,CAExD,KACE,aACA,OAAO,cAAc,aACpB,WAAW,aAAa,YAAY,aAAa,YAAY,WAE9D,KAAI,UAAU,MAAM,UAAU;GAIrC"}
1
+ {"version":3,"file":"install.js","names":[],"sources":["../src/install.ts"],"sourcesContent":["import * as components from './components'\n\ntype ComponentRegistryApp = {\n component: (name: string, component: any) => unknown\n}\n\nexport interface MINTSdkPlugin {\n install(app: ComponentRegistryApp): void\n}\n\n/**\n * Vue plugin that registers all MINT SDK components globally.\n *\n * @example\n * ```typescript\n * import { createApp } from 'vue'\n * import { MINTSdk } from '@morscherlab/mint-sdk'\n * import '@morscherlab/mint-sdk/styles'\n *\n * const app = createApp(App)\n * app.use(MINTSdk)\n * ```\n */\nexport const MINTSdk: MINTSdkPlugin = {\n install(app) {\n for (const [name, component] of Object.entries(components)) {\n // Check if it's a valid Vue component (has setup, render, or template)\n if (\n component &&\n typeof component === 'object' &&\n ('setup' in component || 'render' in component || '__name' in component)\n ) {\n app.component(name, component)\n }\n }\n },\n}\n\nexport default MINTSdk\n"],"mappings":";;;;;;;;;;;;;;;AAuBA,IAAa,UAAyB,EACpC,QAAQ,KAAK;CACX,KAAK,MAAM,CAAC,MAAM,cAAc,OAAO,QAAQ,kBAAU,GAEvD,IACE,aACA,OAAO,cAAc,aACpB,WAAW,aAAa,YAAY,aAAa,YAAY,YAE9D,IAAI,UAAU,MAAM,SAAS;AAGnC,EACF"}
@@ -1,7 +1,13 @@
1
1
  import { SequenceProgress } from './types';
2
+ /** @deprecated Scheduled for removal in MINT 1.4; instrument monitor helpers move to the mld-ms plugins. */
2
3
  export declare function sequenceProgressPercent(progress: SequenceProgress | null | undefined): number;
4
+ /** @deprecated Scheduled for removal in MINT 1.4; instrument monitor helpers move to the mld-ms plugins. */
3
5
  export declare function sequenceSamplesRemaining(progress: SequenceProgress | null | undefined): number;
6
+ /** @deprecated Scheduled for removal in MINT 1.4; instrument monitor helpers move to the mld-ms plugins. */
4
7
  export declare function estimateSequenceRemainingSeconds(progress: SequenceProgress | null | undefined): number | null;
8
+ /** @deprecated Scheduled for removal in MINT 1.4; instrument monitor helpers move to the mld-ms plugins. */
5
9
  export declare function estimateSequenceFinishDate(progress: SequenceProgress | null | undefined, now?: Date): Date | null;
10
+ /** @deprecated Scheduled for removal in MINT 1.4; instrument monitor helpers move to the mld-ms plugins. */
6
11
  export declare function formatSequenceRemaining(progress: SequenceProgress | null | undefined): string | null;
12
+ /** @deprecated Scheduled for removal in MINT 1.4; instrument monitor helpers move to the mld-ms plugins. */
7
13
  export declare function formatSequenceEta(progress: SequenceProgress | null | undefined, locale?: Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string | null;
package/dist/lcms.d.ts CHANGED
@@ -1,6 +1,9 @@
1
1
  import { LcmsPlateCell, LcmsPlateType } from './utils/rack';
2
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
2
3
  export type LcmsPolarity = 'POS' | 'NEG' | 'BOTH';
4
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
3
5
  export type LcmsContainerType = 'VIAL' | 'PLATE';
6
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
4
7
  export interface LcmsSequenceItem {
5
8
  sample_type: string;
6
9
  file_name: string;
@@ -10,18 +13,26 @@ export interface LcmsSequenceItem {
10
13
  position: string;
11
14
  injection_volume: number;
12
15
  }
16
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
13
17
  export interface LcmsSequenceTableColumn {
14
18
  key: keyof LcmsSequenceItem | 'index' | 'actions';
15
19
  label: string;
16
20
  align?: 'left' | 'right';
17
21
  }
22
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
18
23
  export declare const DEFAULT_LCMS_SEQUENCE_COLUMNS: LcmsSequenceTableColumn[];
24
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
19
25
  export declare function extractLcmsCommonPrefix(fileNames: readonly string[]): string;
26
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
20
27
  export declare function extractLcmsSampleName(fileName: string, prefix?: string): string;
28
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
21
29
  export declare function lcmsWellIdFromPosition(position: string): string;
30
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
22
31
  export declare function inferLcmsPlateTypeFromWellIds(wellIds: readonly string[]): LcmsPlateType | null;
32
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
23
33
  export declare function reconstructLcmsPlateCellsFromSequenceItems(items: readonly LcmsSequenceItem[]): {
24
34
  cells: LcmsPlateCell[];
25
35
  plateType: LcmsPlateType;
26
36
  } | null;
37
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
27
38
  export declare function basenameFromWindowsPath(path: string | null | undefined): string;
@@ -26,37 +26,9 @@ export interface AccessPolicy {
26
26
  anyPermissions?: readonly string[];
27
27
  plugin?: string;
28
28
  }
29
- /**
30
- * An object that carries an access rule.
31
- *
32
- * The nested `access` policy is the supported shape. The four flat fields are
33
- * the pre-1.2 spelling of the same four `AccessPolicy` fields; they still work
34
- * but are deprecated, and `normalizeAccessPolicy()` lets the nested policy win
35
- * wherever both are given.
36
- */
29
+ /** An object that carries an access rule in its nested `access` policy. */
37
30
  export interface AccessControlled {
38
- /** The access policy. Preferred over the flat fields below. */
39
31
  access?: AccessPolicy;
40
- /**
41
- * @deprecated Since MINT 1.2; use `access.visibleFor` instead. The flat
42
- * duplicate is removed in 1.3.
43
- */
44
- visibleFor?: AccessAudienceInput;
45
- /**
46
- * @deprecated Since MINT 1.2; use `access.requiresAdmin` instead. The flat
47
- * duplicate is removed in 1.3.
48
- */
49
- requiresAdmin?: boolean;
50
- /**
51
- * @deprecated Since MINT 1.2; use `access.permissions` instead. The flat
52
- * duplicate is removed in 1.3.
53
- */
54
- permissions?: readonly string[];
55
- /**
56
- * @deprecated Since MINT 1.2; use `access.anyPermissions` instead. The flat
57
- * duplicate is removed in 1.3.
58
- */
59
- anyPermissions?: readonly string[];
60
32
  }
61
33
  export declare function getRoleInfo(user: PermissionUser | null | undefined): RoleInfo | null;
62
34
  export declare function isAdminRole(role: string | null | undefined): boolean;
@@ -67,21 +39,4 @@ export declare function hasAllPermissions(user: PermissionUser | null | undefine
67
39
  export declare function hasAnyPermission(user: PermissionUser | null | undefined, permissions?: readonly string[]): boolean;
68
40
  export declare function canAccessAdmin(user: PermissionUser | null | undefined): boolean;
69
41
  export declare function canAccessPlugin(user: PermissionUser | null | undefined, pluginName: string | null | undefined): boolean;
70
- /**
71
- * Flatten an access rule — either shape, or a mix of both — into one policy.
72
- *
73
- * ## Precedence
74
- *
75
- * 1. A defined field on the nested `access` policy wins. It is the supported
76
- * spelling, so an object that carries both shapes is read as "the nested
77
- * policy, with the deprecated flat fields as leftovers".
78
- * 2. Otherwise the flat field on the rule itself is used.
79
- * 3. A field set to `undefined` on either side counts as unset and never
80
- * masks the other side.
81
- *
82
- * Only `AccessPolicy` fields the flat shape never had (`audience`,
83
- * `requiresAuth`, `plugin`) can come from the nested policy alone; the four
84
- * duplicated fields are the ones this ordering exists for.
85
- */
86
- export declare function normalizeAccessPolicy(rule: AccessControlled | AccessPolicy | undefined): AccessPolicy;
87
- export declare function canAccessByPolicy(user: PermissionUser | null | undefined, rule: AccessControlled | AccessPolicy | undefined, isAuthenticated?: boolean): boolean;
42
+ export declare function canAccessByPolicy(user: PermissionUser | null | undefined, policy?: AccessPolicy, isAuthenticated?: boolean): boolean;
@@ -47,31 +47,7 @@ function canAccessPlugin(user, pluginName) {
47
47
  if (!access || access === "all") return true;
48
48
  return Array.isArray(access) && access.includes(pluginName);
49
49
  }
50
- /**
51
- * Flatten an access rule — either shape, or a mix of both — into one policy.
52
- *
53
- * ## Precedence
54
- *
55
- * 1. A defined field on the nested `access` policy wins. It is the supported
56
- * spelling, so an object that carries both shapes is read as "the nested
57
- * policy, with the deprecated flat fields as leftovers".
58
- * 2. Otherwise the flat field on the rule itself is used.
59
- * 3. A field set to `undefined` on either side counts as unset and never
60
- * masks the other side.
61
- *
62
- * Only `AccessPolicy` fields the flat shape never had (`audience`,
63
- * `requiresAuth`, `plugin`) can come from the nested policy alone; the four
64
- * duplicated fields are the ones this ordering exists for.
65
- */
66
- function normalizeAccessPolicy(rule) {
67
- if (!rule) return {};
68
- const { access: nested, ...flat } = rule;
69
- const policy = { ...flat };
70
- for (const [field, value] of Object.entries(nested ?? {})) if (value !== void 0) policy[field] = value;
71
- return policy;
72
- }
73
- function canAccessByPolicy(user, rule, isAuthenticated = user !== null && user !== void 0) {
74
- const policy = normalizeAccessPolicy(rule);
50
+ function canAccessByPolicy(user, policy = {}, isAuthenticated = user !== null && user !== void 0) {
75
51
  if (policy.requiresAuth && !isAuthenticated) return false;
76
52
  if (policy.requiresAdmin && !isAdminUser(user)) return false;
77
53
  if (!audienceAllowsUser(policy.visibleFor ?? policy.audience, user)) return false;
@@ -87,6 +63,6 @@ function audienceAllowsUser(audience, user) {
87
63
  return allowed.includes(getAccessAudience(user));
88
64
  }
89
65
  //#endregion
90
- export { ADMIN_PANEL_PERMISSIONS, ADMIN_ROLE, canAccessAdmin, canAccessByPolicy, canAccessPlugin, getAccessAudience, getRoleInfo, getUserPermissions, hasAllPermissions, hasAnyPermission, isAdminRole, isAdminUser, normalizeAccessPolicy };
66
+ export { ADMIN_PANEL_PERMISSIONS, ADMIN_ROLE, canAccessAdmin, canAccessByPolicy, canAccessPlugin, getAccessAudience, getRoleInfo, getUserPermissions, hasAllPermissions, hasAnyPermission, isAdminRole, isAdminUser };
91
67
 
92
68
  //# sourceMappingURL=permissions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.js","names":[],"sources":["../src/permissions.ts"],"sourcesContent":["export const ADMIN_ROLE = 'admin'\n\nexport const ADMIN_PANEL_PERMISSIONS = [\n 'users.view',\n 'users.manage',\n 'platform.configure',\n 'platform.view_logs',\n 'plugins.configure',\n 'plugins.install',\n 'notices.publish',\n] as const\n\nexport type AccessAudience = 'all' | 'admin' | 'user'\nexport type AccessAudienceInput = AccessAudience | readonly AccessAudience[]\n\nexport interface RoleInfo {\n id?: number\n slug: string\n name?: string\n color?: string\n permissions?: readonly string[] | null\n project_scope?: 'all' | 'assigned' | string\n plugin_access?: readonly string[] | 'all' | null\n}\n\nexport interface PermissionUser {\n role?: string | null\n role_obj?: RoleInfo | null\n roleObj?: RoleInfo | null\n permissions?: readonly string[] | null\n}\n\nexport interface AccessPolicy {\n audience?: AccessAudienceInput\n visibleFor?: AccessAudienceInput\n requiresAuth?: boolean\n requiresAdmin?: boolean\n permissions?: readonly string[]\n anyPermissions?: readonly string[]\n plugin?: string\n}\n\n/**\n * An object that carries an access rule.\n *\n * The nested `access` policy is the supported shape. The four flat fields are\n * the pre-1.2 spelling of the same four `AccessPolicy` fields; they still work\n * but are deprecated, and `normalizeAccessPolicy()` lets the nested policy win\n * wherever both are given.\n */\nexport interface AccessControlled {\n /** The access policy. Preferred over the flat fields below. */\n access?: AccessPolicy\n /**\n * @deprecated Since MINT 1.2; use `access.visibleFor` instead. The flat\n * duplicate is removed in 1.3.\n */\n visibleFor?: AccessAudienceInput\n /**\n * @deprecated Since MINT 1.2; use `access.requiresAdmin` instead. The flat\n * duplicate is removed in 1.3.\n */\n requiresAdmin?: boolean\n /**\n * @deprecated Since MINT 1.2; use `access.permissions` instead. The flat\n * duplicate is removed in 1.3.\n */\n permissions?: readonly string[]\n /**\n * @deprecated Since MINT 1.2; use `access.anyPermissions` instead. The flat\n * duplicate is removed in 1.3.\n */\n anyPermissions?: readonly string[]\n}\n\nexport function getRoleInfo(user: PermissionUser | null | undefined): RoleInfo | null {\n return user?.roleObj ?? user?.role_obj ?? null\n}\n\nexport function isAdminRole(role: string | null | undefined): boolean {\n return role === ADMIN_ROLE\n}\n\nexport function isAdminUser(user: PermissionUser | null | undefined): boolean {\n return isAdminRole(user?.role) || getRoleInfo(user)?.slug === ADMIN_ROLE\n}\n\nexport function getAccessAudience(user: PermissionUser | null | undefined): Exclude<AccessAudience, 'all'> {\n return isAdminUser(user) ? 'admin' : 'user'\n}\n\nexport function getUserPermissions(user: PermissionUser | null | undefined): string[] {\n const rolePermissions = getRoleInfo(user)?.permissions\n if (rolePermissions?.length) return [...rolePermissions]\n return [...(user?.permissions ?? [])]\n}\n\nexport function hasAllPermissions(\n user: PermissionUser | null | undefined,\n permissions: readonly string[] = [],\n): boolean {\n if (permissions.length === 0) return true\n if (isAdminUser(user)) return true\n const granted = new Set(getUserPermissions(user))\n return permissions.every(permission => granted.has(permission))\n}\n\nexport function hasAnyPermission(\n user: PermissionUser | null | undefined,\n permissions: readonly string[] = [],\n): boolean {\n if (permissions.length === 0) return true\n if (isAdminUser(user)) return true\n const granted = new Set(getUserPermissions(user))\n return permissions.some(permission => granted.has(permission))\n}\n\nexport function canAccessAdmin(user: PermissionUser | null | undefined): boolean {\n return isAdminUser(user) || hasAnyPermission(user, ADMIN_PANEL_PERMISSIONS)\n}\n\nexport function canAccessPlugin(\n user: PermissionUser | null | undefined,\n pluginName: string | null | undefined,\n): boolean {\n if (!pluginName) return true\n const access = getRoleInfo(user)?.plugin_access\n if (!access || access === 'all') return true\n return Array.isArray(access) && access.includes(pluginName)\n}\n\n/**\n * Flatten an access rule — either shape, or a mix of both — into one policy.\n *\n * ## Precedence\n *\n * 1. A defined field on the nested `access` policy wins. It is the supported\n * spelling, so an object that carries both shapes is read as \"the nested\n * policy, with the deprecated flat fields as leftovers\".\n * 2. Otherwise the flat field on the rule itself is used.\n * 3. A field set to `undefined` on either side counts as unset and never\n * masks the other side.\n *\n * Only `AccessPolicy` fields the flat shape never had (`audience`,\n * `requiresAuth`, `plugin`) can come from the nested policy alone; the four\n * duplicated fields are the ones this ordering exists for.\n */\nexport function normalizeAccessPolicy(rule: AccessControlled | AccessPolicy | undefined): AccessPolicy {\n if (!rule) return {}\n const { access: nested, ...flat } = rule as AccessPolicy & { access?: AccessPolicy }\n const policy = { ...flat } as Record<string, unknown>\n\n for (const [field, value] of Object.entries(nested ?? {})) {\n if (value !== undefined) policy[field] = value\n }\n\n return policy as AccessPolicy\n}\n\nexport function canAccessByPolicy(\n user: PermissionUser | null | undefined,\n rule: AccessControlled | AccessPolicy | undefined,\n isAuthenticated = user !== null && user !== undefined,\n): boolean {\n const policy = normalizeAccessPolicy(rule)\n if (policy.requiresAuth && !isAuthenticated) return false\n if (policy.requiresAdmin && !isAdminUser(user)) return false\n if (!audienceAllowsUser(policy.visibleFor ?? policy.audience, user)) return false\n if (!hasAllPermissions(user, policy.permissions)) return false\n if (!hasAnyPermission(user, policy.anyPermissions)) return false\n if (policy.plugin && !canAccessPlugin(user, policy.plugin)) return false\n return true\n}\n\nfunction audienceAllowsUser(\n audience: AccessAudienceInput | undefined,\n user: PermissionUser | null | undefined,\n): boolean {\n if (audience === undefined) return true\n const allowed = Array.isArray(audience) ? audience : [audience]\n if (allowed.includes('all')) return true\n return allowed.includes(getAccessAudience(user))\n}\n"],"mappings":";AAAA,IAAa,aAAa;AAE1B,IAAa,0BAA0B;CACrC;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAiED,SAAgB,YAAY,MAA0D;AACpF,QAAO,MAAM,WAAW,MAAM,YAAY;;AAG5C,SAAgB,YAAY,MAA0C;AACpE,QAAO,SAAS;;AAGlB,SAAgB,YAAY,MAAkD;AAC5E,QAAO,YAAY,MAAM,KAAK,IAAI,YAAY,KAAK,EAAE,SAAA;;AAGvD,SAAgB,kBAAkB,MAAyE;AACzG,QAAO,YAAY,KAAK,GAAG,UAAU;;AAGvC,SAAgB,mBAAmB,MAAmD;CACpF,MAAM,kBAAkB,YAAY,KAAK,EAAE;AAC3C,KAAI,iBAAiB,OAAQ,QAAO,CAAC,GAAG,gBAAgB;AACxD,QAAO,CAAC,GAAI,MAAM,eAAe,EAAE,CAAE;;AAGvC,SAAgB,kBACd,MACA,cAAiC,EAAE,EAC1B;AACT,KAAI,YAAY,WAAW,EAAG,QAAO;AACrC,KAAI,YAAY,KAAK,CAAE,QAAO;CAC9B,MAAM,UAAU,IAAI,IAAI,mBAAmB,KAAK,CAAC;AACjD,QAAO,YAAY,OAAM,eAAc,QAAQ,IAAI,WAAW,CAAC;;AAGjE,SAAgB,iBACd,MACA,cAAiC,EAAE,EAC1B;AACT,KAAI,YAAY,WAAW,EAAG,QAAO;AACrC,KAAI,YAAY,KAAK,CAAE,QAAO;CAC9B,MAAM,UAAU,IAAI,IAAI,mBAAmB,KAAK,CAAC;AACjD,QAAO,YAAY,MAAK,eAAc,QAAQ,IAAI,WAAW,CAAC;;AAGhE,SAAgB,eAAe,MAAkD;AAC/E,QAAO,YAAY,KAAK,IAAI,iBAAiB,MAAM,wBAAwB;;AAG7E,SAAgB,gBACd,MACA,YACS;AACT,KAAI,CAAC,WAAY,QAAO;CACxB,MAAM,SAAS,YAAY,KAAK,EAAE;AAClC,KAAI,CAAC,UAAU,WAAW,MAAO,QAAO;AACxC,QAAO,MAAM,QAAQ,OAAO,IAAI,OAAO,SAAS,WAAW;;;;;;;;;;;;;;;;;;AAmB7D,SAAgB,sBAAsB,MAAiE;AACrG,KAAI,CAAC,KAAM,QAAO,EAAE;CACpB,MAAM,EAAE,QAAQ,QAAQ,GAAG,SAAS;CACpC,MAAM,SAAS,EAAE,GAAG,MAAM;AAE1B,MAAK,MAAM,CAAC,OAAO,UAAU,OAAO,QAAQ,UAAU,EAAE,CAAC,CACvD,KAAI,UAAU,KAAA,EAAW,QAAO,SAAS;AAG3C,QAAO;;AAGT,SAAgB,kBACd,MACA,MACA,kBAAkB,SAAS,QAAQ,SAAS,KAAA,GACnC;CACT,MAAM,SAAS,sBAAsB,KAAK;AAC1C,KAAI,OAAO,gBAAgB,CAAC,gBAAiB,QAAO;AACpD,KAAI,OAAO,iBAAiB,CAAC,YAAY,KAAK,CAAE,QAAO;AACvD,KAAI,CAAC,mBAAmB,OAAO,cAAc,OAAO,UAAU,KAAK,CAAE,QAAO;AAC5E,KAAI,CAAC,kBAAkB,MAAM,OAAO,YAAY,CAAE,QAAO;AACzD,KAAI,CAAC,iBAAiB,MAAM,OAAO,eAAe,CAAE,QAAO;AAC3D,KAAI,OAAO,UAAU,CAAC,gBAAgB,MAAM,OAAO,OAAO,CAAE,QAAO;AACnE,QAAO;;AAGT,SAAS,mBACP,UACA,MACS;AACT,KAAI,aAAa,KAAA,EAAW,QAAO;CACnC,MAAM,UAAU,MAAM,QAAQ,SAAS,GAAG,WAAW,CAAC,SAAS;AAC/D,KAAI,QAAQ,SAAS,MAAM,CAAE,QAAO;AACpC,QAAO,QAAQ,SAAS,kBAAkB,KAAK,CAAC"}
1
+ {"version":3,"file":"permissions.js","names":[],"sources":["../src/permissions.ts"],"sourcesContent":["export const ADMIN_ROLE = 'admin'\n\nexport const ADMIN_PANEL_PERMISSIONS = [\n 'users.view',\n 'users.manage',\n 'platform.configure',\n 'platform.view_logs',\n 'plugins.configure',\n 'plugins.install',\n 'notices.publish',\n] as const\n\nexport type AccessAudience = 'all' | 'admin' | 'user'\nexport type AccessAudienceInput = AccessAudience | readonly AccessAudience[]\n\nexport interface RoleInfo {\n id?: number\n slug: string\n name?: string\n color?: string\n permissions?: readonly string[] | null\n project_scope?: 'all' | 'assigned' | string\n plugin_access?: readonly string[] | 'all' | null\n}\n\nexport interface PermissionUser {\n role?: string | null\n role_obj?: RoleInfo | null\n roleObj?: RoleInfo | null\n permissions?: readonly string[] | null\n}\n\nexport interface AccessPolicy {\n audience?: AccessAudienceInput\n visibleFor?: AccessAudienceInput\n requiresAuth?: boolean\n requiresAdmin?: boolean\n permissions?: readonly string[]\n anyPermissions?: readonly string[]\n plugin?: string\n}\n\n/** An object that carries an access rule in its nested `access` policy. */\nexport interface AccessControlled {\n access?: AccessPolicy\n}\n\nexport function getRoleInfo(user: PermissionUser | null | undefined): RoleInfo | null {\n return user?.roleObj ?? user?.role_obj ?? null\n}\n\nexport function isAdminRole(role: string | null | undefined): boolean {\n return role === ADMIN_ROLE\n}\n\nexport function isAdminUser(user: PermissionUser | null | undefined): boolean {\n return isAdminRole(user?.role) || getRoleInfo(user)?.slug === ADMIN_ROLE\n}\n\nexport function getAccessAudience(user: PermissionUser | null | undefined): Exclude<AccessAudience, 'all'> {\n return isAdminUser(user) ? 'admin' : 'user'\n}\n\nexport function getUserPermissions(user: PermissionUser | null | undefined): string[] {\n const rolePermissions = getRoleInfo(user)?.permissions\n if (rolePermissions?.length) return [...rolePermissions]\n return [...(user?.permissions ?? [])]\n}\n\nexport function hasAllPermissions(\n user: PermissionUser | null | undefined,\n permissions: readonly string[] = [],\n): boolean {\n if (permissions.length === 0) return true\n if (isAdminUser(user)) return true\n const granted = new Set(getUserPermissions(user))\n return permissions.every(permission => granted.has(permission))\n}\n\nexport function hasAnyPermission(\n user: PermissionUser | null | undefined,\n permissions: readonly string[] = [],\n): boolean {\n if (permissions.length === 0) return true\n if (isAdminUser(user)) return true\n const granted = new Set(getUserPermissions(user))\n return permissions.some(permission => granted.has(permission))\n}\n\nexport function canAccessAdmin(user: PermissionUser | null | undefined): boolean {\n return isAdminUser(user) || hasAnyPermission(user, ADMIN_PANEL_PERMISSIONS)\n}\n\nexport function canAccessPlugin(\n user: PermissionUser | null | undefined,\n pluginName: string | null | undefined,\n): boolean {\n if (!pluginName) return true\n const access = getRoleInfo(user)?.plugin_access\n if (!access || access === 'all') return true\n return Array.isArray(access) && access.includes(pluginName)\n}\n\nexport function canAccessByPolicy(\n user: PermissionUser | null | undefined,\n policy: AccessPolicy = {},\n isAuthenticated = user !== null && user !== undefined,\n): boolean {\n if (policy.requiresAuth && !isAuthenticated) return false\n if (policy.requiresAdmin && !isAdminUser(user)) return false\n if (!audienceAllowsUser(policy.visibleFor ?? policy.audience, user)) return false\n if (!hasAllPermissions(user, policy.permissions)) return false\n if (!hasAnyPermission(user, policy.anyPermissions)) return false\n if (policy.plugin && !canAccessPlugin(user, policy.plugin)) return false\n return true\n}\n\nfunction audienceAllowsUser(\n audience: AccessAudienceInput | undefined,\n user: PermissionUser | null | undefined,\n): boolean {\n if (audience === undefined) return true\n const allowed = Array.isArray(audience) ? audience : [audience]\n if (allowed.includes('all')) return true\n return allowed.includes(getAccessAudience(user))\n}\n"],"mappings":";AAAA,IAAa,aAAa;AAE1B,IAAa,0BAA0B;CACrC;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAqCA,SAAgB,YAAY,MAA0D;CACpF,OAAO,MAAM,WAAW,MAAM,YAAY;AAC5C;AAEA,SAAgB,YAAY,MAA0C;CACpE,OAAO,SAAS;AAClB;AAEA,SAAgB,YAAY,MAAkD;CAC5E,OAAO,YAAY,MAAM,IAAI,KAAK,YAAY,IAAI,CAAC,EAAE,SAAA;AACvD;AAEA,SAAgB,kBAAkB,MAAyE;CACzG,OAAO,YAAY,IAAI,IAAI,UAAU;AACvC;AAEA,SAAgB,mBAAmB,MAAmD;CACpF,MAAM,kBAAkB,YAAY,IAAI,CAAC,EAAE;CAC3C,IAAI,iBAAiB,QAAQ,OAAO,CAAC,GAAG,eAAe;CACvD,OAAO,CAAC,GAAI,MAAM,eAAe,CAAC,CAAE;AACtC;AAEA,SAAgB,kBACd,MACA,cAAiC,CAAC,GACzB;CACT,IAAI,YAAY,WAAW,GAAG,OAAO;CACrC,IAAI,YAAY,IAAI,GAAG,OAAO;CAC9B,MAAM,UAAU,IAAI,IAAI,mBAAmB,IAAI,CAAC;CAChD,OAAO,YAAY,OAAM,eAAc,QAAQ,IAAI,UAAU,CAAC;AAChE;AAEA,SAAgB,iBACd,MACA,cAAiC,CAAC,GACzB;CACT,IAAI,YAAY,WAAW,GAAG,OAAO;CACrC,IAAI,YAAY,IAAI,GAAG,OAAO;CAC9B,MAAM,UAAU,IAAI,IAAI,mBAAmB,IAAI,CAAC;CAChD,OAAO,YAAY,MAAK,eAAc,QAAQ,IAAI,UAAU,CAAC;AAC/D;AAEA,SAAgB,eAAe,MAAkD;CAC/E,OAAO,YAAY,IAAI,KAAK,iBAAiB,MAAM,uBAAuB;AAC5E;AAEA,SAAgB,gBACd,MACA,YACS;CACT,IAAI,CAAC,YAAY,OAAO;CACxB,MAAM,SAAS,YAAY,IAAI,CAAC,EAAE;CAClC,IAAI,CAAC,UAAU,WAAW,OAAO,OAAO;CACxC,OAAO,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,UAAU;AAC5D;AAEA,SAAgB,kBACd,MACA,SAAuB,CAAC,GACxB,kBAAkB,SAAS,QAAQ,SAAS,KAAA,GACnC;CACT,IAAI,OAAO,gBAAgB,CAAC,iBAAiB,OAAO;CACpD,IAAI,OAAO,iBAAiB,CAAC,YAAY,IAAI,GAAG,OAAO;CACvD,IAAI,CAAC,mBAAmB,OAAO,cAAc,OAAO,UAAU,IAAI,GAAG,OAAO;CAC5E,IAAI,CAAC,kBAAkB,MAAM,OAAO,WAAW,GAAG,OAAO;CACzD,IAAI,CAAC,iBAAiB,MAAM,OAAO,cAAc,GAAG,OAAO;CAC3D,IAAI,OAAO,UAAU,CAAC,gBAAgB,MAAM,OAAO,MAAM,GAAG,OAAO;CACnE,OAAO;AACT;AAEA,SAAS,mBACP,UACA,MACS;CACT,IAAI,aAAa,KAAA,GAAW,OAAO;CACnC,MAAM,UAAU,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAQ;CAC9D,IAAI,QAAQ,SAAS,KAAK,GAAG,OAAO;CACpC,OAAO,QAAQ,SAAS,kBAAkB,IAAI,CAAC;AACjD"}