@morscherlab/mint-sdk 1.0.0-alpha.2

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 (491) hide show
  1. package/README.md +326 -0
  2. package/dist/__stories__/experiment-helpers.d.ts +25 -0
  3. package/dist/__tests__/components/AppLayout.test.d.ts +1 -0
  4. package/dist/__tests__/components/AppSidebar.test.d.ts +1 -0
  5. package/dist/__tests__/components/AppTopBar.test.d.ts +1 -0
  6. package/dist/__tests__/components/BaseInput.test.d.ts +1 -0
  7. package/dist/__tests__/components/BasePill.test.d.ts +1 -0
  8. package/dist/__tests__/components/Calendar.test.d.ts +1 -0
  9. package/dist/__tests__/components/CollapsibleCard.test.d.ts +1 -0
  10. package/dist/__tests__/components/DataFrame.test.d.ts +1 -0
  11. package/dist/__tests__/components/DropdownButton.test.d.ts +1 -0
  12. package/dist/__tests__/composables/formBuilderRegistry.test.d.ts +1 -0
  13. package/dist/__tests__/composables/useAppExperiment.test.d.ts +1 -0
  14. package/dist/__tests__/composables/useAuth.test.d.ts +1 -0
  15. package/dist/__tests__/composables/useAutoGroup.test.d.ts +1 -0
  16. package/dist/__tests__/composables/useExperimentData.test.d.ts +13 -0
  17. package/dist/__tests__/composables/useExperimentSave.test.d.ts +1 -0
  18. package/dist/__tests__/composables/useForm.test.d.ts +1 -0
  19. package/dist/__tests__/composables/useFormBuilder.test.d.ts +1 -0
  20. package/dist/__tests__/composables/usePlatformContext.test.d.ts +1 -0
  21. package/dist/__tests__/composables/usePluginApi.test.d.ts +13 -0
  22. package/dist/__tests__/composables/usePluginConfig.test.d.ts +14 -0
  23. package/dist/__tests__/utils/color.test.d.ts +1 -0
  24. package/dist/auth-BYmxZdJl.js +297 -0
  25. package/dist/auth-BYmxZdJl.js.map +1 -0
  26. package/dist/components/AlertBox.vue.d.ts +34 -0
  27. package/dist/components/AppAvatarMenu.vue.d.ts +58 -0
  28. package/dist/components/AppContainer.vue.d.ts +28 -0
  29. package/dist/components/AppLayout.vue.d.ts +31 -0
  30. package/dist/components/AppPageSelector.vue.d.ts +43 -0
  31. package/dist/components/AppPillNav.vue.d.ts +11 -0
  32. package/dist/components/AppPluginSwitcher.vue.d.ts +38 -0
  33. package/dist/components/AppSidebar.vue.d.ts +47 -0
  34. package/dist/components/AppTopBar.vue.d.ts +111 -0
  35. package/dist/components/AuditTrail.vue.d.ts +38 -0
  36. package/dist/components/AutoGroupModal.vue.d.ts +124 -0
  37. package/dist/components/Avatar.vue.d.ts +14 -0
  38. package/dist/components/BaseButton.vue.d.ts +37 -0
  39. package/dist/components/BaseCheckbox.vue.d.ts +17 -0
  40. package/dist/components/BaseInput.vue.d.ts +34 -0
  41. package/dist/components/BaseModal.vue.d.ts +46 -0
  42. package/dist/components/BasePill.vue.d.ts +57 -0
  43. package/dist/components/BaseRadioGroup.vue.d.ts +21 -0
  44. package/dist/components/BaseSelect.vue.d.ts +20 -0
  45. package/dist/components/BaseSlider.vue.d.ts +22 -0
  46. package/dist/components/BaseTabs.vue.d.ts +14 -0
  47. package/dist/components/BaseTextarea.vue.d.ts +30 -0
  48. package/dist/components/BaseToggle.vue.d.ts +19 -0
  49. package/dist/components/BatchProgressList.vue.d.ts +43 -0
  50. package/dist/components/Breadcrumb.vue.d.ts +33 -0
  51. package/dist/components/Calendar.vue.d.ts +107 -0
  52. package/dist/components/ChartContainer.vue.d.ts +31 -0
  53. package/dist/components/ChemicalFormula.vue.d.ts +8 -0
  54. package/dist/components/CollapsibleCard.vue.d.ts +41 -0
  55. package/dist/components/ColorSlider.vue.d.ts +34 -0
  56. package/dist/components/ConcentrationInput.vue.d.ts +25 -0
  57. package/dist/components/ConfirmDialog.vue.d.ts +42 -0
  58. package/dist/components/DataFrame.vue.d.ts +107 -0
  59. package/dist/components/DatePicker.vue.d.ts +25 -0
  60. package/dist/components/DateTimePicker.vue.d.ts +30 -0
  61. package/dist/components/Divider.vue.d.ts +14 -0
  62. package/dist/components/DoseCalculator.vue.d.ts +19 -0
  63. package/dist/components/DropdownButton.vue.d.ts +47 -0
  64. package/dist/components/EmptyState.vue.d.ts +36 -0
  65. package/dist/components/ExperimentCodeBadge.vue.d.ts +14 -0
  66. package/dist/components/ExperimentDataViewer.vue.d.ts +29 -0
  67. package/dist/components/ExperimentPopover.vue.d.ts +32 -0
  68. package/dist/components/ExperimentSelectorModal.vue.d.ts +28 -0
  69. package/dist/components/ExperimentTimeline.vue.d.ts +44 -0
  70. package/dist/components/FileUploader.vue.d.ts +40 -0
  71. package/dist/components/FitPanel.vue.d.ts +46 -0
  72. package/dist/components/FormActions.vue.d.ts +33 -0
  73. package/dist/components/FormBuilder.vue.d.ts +287 -0
  74. package/dist/components/FormField.vue.d.ts +28 -0
  75. package/dist/components/FormFieldRenderer.vue.d.ts +31 -0
  76. package/dist/components/FormSection.vue.d.ts +43 -0
  77. package/dist/components/FormulaInput.vue.d.ts +25 -0
  78. package/dist/components/GroupAssigner.vue.d.ts +25 -0
  79. package/dist/components/GroupingModal.vue.d.ts +12 -0
  80. package/dist/components/IconButton.vue.d.ts +34 -0
  81. package/dist/components/LoadingSpinner.vue.d.ts +12 -0
  82. package/dist/components/MoleculeInput.vue.d.ts +27 -0
  83. package/dist/components/MultiSelect.vue.d.ts +19 -0
  84. package/dist/components/NumberInput.vue.d.ts +22 -0
  85. package/dist/components/PlateMapEditor.vue.d.ts +50 -0
  86. package/dist/components/ProgressBar.vue.d.ts +23 -0
  87. package/dist/components/ProtocolStepEditor.vue.d.ts +24 -0
  88. package/dist/components/RackEditor.vue.d.ts +40 -0
  89. package/dist/components/ReagentEditor.vue.d.ts +30 -0
  90. package/dist/components/ReagentList.vue.d.ts +32 -0
  91. package/dist/components/ResourceCard.vue.d.ts +50 -0
  92. package/dist/components/SampleHierarchyTree.vue.d.ts +26 -0
  93. package/dist/components/SampleLegend.vue.d.ts +32 -0
  94. package/dist/components/SampleSelector.vue.d.ts +29 -0
  95. package/dist/components/ScheduleCalendar.vue.d.ts +110 -0
  96. package/dist/components/ScientificNumber.vue.d.ts +14 -0
  97. package/dist/components/SegmentedControl.vue.d.ts +20 -0
  98. package/dist/components/SequenceInput.vue.d.ts +54 -0
  99. package/dist/components/SettingsButton.vue.d.ts +30 -0
  100. package/dist/components/SettingsModal.vue.d.ts +36 -0
  101. package/dist/components/Skeleton.vue.d.ts +11 -0
  102. package/dist/components/StatusIndicator.vue.d.ts +13 -0
  103. package/dist/components/StepWizard.vue.d.ts +65 -0
  104. package/dist/components/TagsInput.vue.d.ts +39 -0
  105. package/dist/components/ThemeToggle.vue.d.ts +7 -0
  106. package/dist/components/TimePicker.vue.d.ts +29 -0
  107. package/dist/components/TimeRangeInput.vue.d.ts +27 -0
  108. package/dist/components/ToastNotification.vue.d.ts +2 -0
  109. package/dist/components/Tooltip.vue.d.ts +35 -0
  110. package/dist/components/UnitInput.vue.d.ts +39 -0
  111. package/dist/components/WellEditPopup.vue.d.ts +25 -0
  112. package/dist/components/WellPlate.vue.d.ts +73 -0
  113. package/dist/components/index.d.ts +87 -0
  114. package/dist/components/index.js +3 -0
  115. package/dist/components-CKf-UpGi.js +15089 -0
  116. package/dist/components-CKf-UpGi.js.map +1 -0
  117. package/dist/composables/experiment-utils.d.ts +8 -0
  118. package/dist/composables/formBuilderRegistry.d.ts +13 -0
  119. package/dist/composables/index.d.ts +28 -0
  120. package/dist/composables/index.js +3 -0
  121. package/dist/composables/useApi.d.ts +20 -0
  122. package/dist/composables/useAppExperiment.d.ts +37 -0
  123. package/dist/composables/useAsync.d.ts +128 -0
  124. package/dist/composables/useAuth.d.ts +47 -0
  125. package/dist/composables/useAutoGroup.d.ts +106 -0
  126. package/dist/composables/useChemicalFormula.d.ts +21 -0
  127. package/dist/composables/useConcentrationUnits.d.ts +29 -0
  128. package/dist/composables/useDoseCalculator.d.ts +58 -0
  129. package/dist/composables/useExperimentData.d.ts +18 -0
  130. package/dist/composables/useExperimentSave.d.ts +36 -0
  131. package/dist/composables/useExperimentSelector.d.ts +30 -0
  132. package/dist/composables/useForm.d.ts +92 -0
  133. package/dist/composables/useFormBuilder.d.ts +24 -0
  134. package/dist/composables/usePasskey.d.ts +10 -0
  135. package/dist/composables/usePlatformContext.d.ts +131 -0
  136. package/dist/composables/usePluginApi.d.ts +29 -0
  137. package/dist/composables/usePluginConfig.d.ts +13 -0
  138. package/dist/composables/useProtocolTemplates.d.ts +44 -0
  139. package/dist/composables/useRackEditor.d.ts +31 -0
  140. package/dist/composables/useReagentSeries.d.ts +23 -0
  141. package/dist/composables/useScheduleDrag.d.ts +78 -0
  142. package/dist/composables/useSequenceUtils.d.ts +14 -0
  143. package/dist/composables/useTheme.d.ts +8 -0
  144. package/dist/composables/useTimeUtils.d.ts +29 -0
  145. package/dist/composables/useToast.d.ts +22 -0
  146. package/dist/composables/useWellPlateEditor.d.ts +33 -0
  147. package/dist/composables-D0QfFzq1.js +805 -0
  148. package/dist/composables-D0QfFzq1.js.map +1 -0
  149. package/dist/histoire.setup.d.ts +1 -0
  150. package/dist/index.d.ts +6 -0
  151. package/dist/index.js +7 -0
  152. package/dist/install.d.ts +16 -0
  153. package/dist/install.js +23 -0
  154. package/dist/install.js.map +1 -0
  155. package/dist/stores/auth.d.ts +146 -0
  156. package/dist/stores/index.d.ts +2 -0
  157. package/dist/stores/index.js +2 -0
  158. package/dist/stores/settings.d.ts +75 -0
  159. package/dist/styles.css +29728 -0
  160. package/dist/tailwind.preset.d.ts +58 -0
  161. package/dist/tailwind.preset.js +66 -0
  162. package/dist/tailwind.preset.js.map +1 -0
  163. package/dist/types/auth.d.ts +42 -0
  164. package/dist/types/auto-group.d.ts +34 -0
  165. package/dist/types/components.d.ts +528 -0
  166. package/dist/types/form-builder.d.ts +167 -0
  167. package/dist/types/index.d.ts +5 -0
  168. package/dist/types/index.js +0 -0
  169. package/dist/types/platform.d.ts +75 -0
  170. package/dist/useScheduleDrag-DAJueTbK.js +7181 -0
  171. package/dist/useScheduleDrag-DAJueTbK.js.map +1 -0
  172. package/dist/utils/color.d.ts +24 -0
  173. package/package.json +114 -0
  174. package/src/__stories__/experiment-helpers.ts +83 -0
  175. package/src/__tests__/components/AppLayout.test.ts +163 -0
  176. package/src/__tests__/components/AppSidebar.test.ts +292 -0
  177. package/src/__tests__/components/AppTopBar.test.ts +683 -0
  178. package/src/__tests__/components/BaseInput.test.ts +99 -0
  179. package/src/__tests__/components/BasePill.test.ts +291 -0
  180. package/src/__tests__/components/Calendar.test.ts +566 -0
  181. package/src/__tests__/components/CollapsibleCard.test.ts +524 -0
  182. package/src/__tests__/components/DataFrame.test.ts +767 -0
  183. package/src/__tests__/components/DropdownButton.test.ts +471 -0
  184. package/src/__tests__/composables/formBuilderRegistry.test.ts +187 -0
  185. package/src/__tests__/composables/useAppExperiment.test.ts +560 -0
  186. package/src/__tests__/composables/useAuth.test.ts +188 -0
  187. package/src/__tests__/composables/useAutoGroup.test.ts +860 -0
  188. package/src/__tests__/composables/useExperimentData.test.ts +127 -0
  189. package/src/__tests__/composables/useExperimentSave.test.ts +347 -0
  190. package/src/__tests__/composables/useForm.test.ts +205 -0
  191. package/src/__tests__/composables/useFormBuilder.test.ts +917 -0
  192. package/src/__tests__/composables/usePlatformContext.test.ts +116 -0
  193. package/src/__tests__/composables/usePluginApi.test.ts +81 -0
  194. package/src/__tests__/composables/usePluginConfig.test.ts +176 -0
  195. package/src/__tests__/utils/color.test.ts +96 -0
  196. package/src/components/AlertBox.story.vue +204 -0
  197. package/src/components/AlertBox.vue +88 -0
  198. package/src/components/AppAvatarMenu.story.vue +155 -0
  199. package/src/components/AppAvatarMenu.vue +184 -0
  200. package/src/components/AppContainer.story.vue +104 -0
  201. package/src/components/AppContainer.vue +34 -0
  202. package/src/components/AppLayout.story.vue +292 -0
  203. package/src/components/AppLayout.vue +75 -0
  204. package/src/components/AppPageSelector.vue +159 -0
  205. package/src/components/AppPillNav.vue +66 -0
  206. package/src/components/AppPluginSwitcher.vue +241 -0
  207. package/src/components/AppSidebar.story.vue +309 -0
  208. package/src/components/AppSidebar.vue +119 -0
  209. package/src/components/AppTopBar.story.vue +304 -0
  210. package/src/components/AppTopBar.vue +661 -0
  211. package/src/components/AuditTrail.story.vue +163 -0
  212. package/src/components/AuditTrail.vue +151 -0
  213. package/src/components/AutoGroupModal.story.vue +273 -0
  214. package/src/components/AutoGroupModal.vue +566 -0
  215. package/src/components/Avatar.story.vue +115 -0
  216. package/src/components/Avatar.vue +79 -0
  217. package/src/components/BaseButton.story.vue +96 -0
  218. package/src/components/BaseButton.vue +73 -0
  219. package/src/components/BaseCheckbox.story.vue +73 -0
  220. package/src/components/BaseCheckbox.vue +69 -0
  221. package/src/components/BaseInput.story.vue +98 -0
  222. package/src/components/BaseInput.vue +74 -0
  223. package/src/components/BaseModal.story.vue +237 -0
  224. package/src/components/BaseModal.vue +182 -0
  225. package/src/components/BasePill.story.vue +142 -0
  226. package/src/components/BasePill.vue +89 -0
  227. package/src/components/BaseRadioGroup.story.vue +145 -0
  228. package/src/components/BaseRadioGroup.vue +124 -0
  229. package/src/components/BaseSelect.story.vue +120 -0
  230. package/src/components/BaseSelect.vue +71 -0
  231. package/src/components/BaseSlider.story.vue +122 -0
  232. package/src/components/BaseSlider.vue +126 -0
  233. package/src/components/BaseTabs.story.vue +127 -0
  234. package/src/components/BaseTabs.vue +59 -0
  235. package/src/components/BaseTextarea.story.vue +91 -0
  236. package/src/components/BaseTextarea.vue +62 -0
  237. package/src/components/BaseToggle.story.vue +81 -0
  238. package/src/components/BaseToggle.vue +76 -0
  239. package/src/components/BatchProgressList.story.vue +92 -0
  240. package/src/components/BatchProgressList.vue +184 -0
  241. package/src/components/Breadcrumb.story.vue +106 -0
  242. package/src/components/Breadcrumb.vue +75 -0
  243. package/src/components/Calendar.story.vue +106 -0
  244. package/src/components/Calendar.vue +363 -0
  245. package/src/components/ChartContainer.story.vue +113 -0
  246. package/src/components/ChartContainer.vue +64 -0
  247. package/src/components/ChemicalFormula.story.vue +102 -0
  248. package/src/components/ChemicalFormula.vue +39 -0
  249. package/src/components/CollapsibleCard.story.vue +135 -0
  250. package/src/components/CollapsibleCard.vue +167 -0
  251. package/src/components/ColorSlider.story.vue +120 -0
  252. package/src/components/ColorSlider.vue +164 -0
  253. package/src/components/ConcentrationInput.story.vue +77 -0
  254. package/src/components/ConcentrationInput.vue +185 -0
  255. package/src/components/ConfirmDialog.story.vue +248 -0
  256. package/src/components/ConfirmDialog.vue +93 -0
  257. package/src/components/DataFrame.story.vue +148 -0
  258. package/src/components/DataFrame.vue +419 -0
  259. package/src/components/DatePicker.story.vue +119 -0
  260. package/src/components/DatePicker.vue +330 -0
  261. package/src/components/DateTimePicker.story.vue +112 -0
  262. package/src/components/DateTimePicker.vue +392 -0
  263. package/src/components/Divider.story.vue +80 -0
  264. package/src/components/Divider.vue +49 -0
  265. package/src/components/DoseCalculator.story.vue +68 -0
  266. package/src/components/DoseCalculator.vue +476 -0
  267. package/src/components/DropdownButton.story.vue +102 -0
  268. package/src/components/DropdownButton.vue +181 -0
  269. package/src/components/EmptyState.story.vue +135 -0
  270. package/src/components/EmptyState.vue +69 -0
  271. package/src/components/ExperimentCodeBadge.story.vue +77 -0
  272. package/src/components/ExperimentCodeBadge.vue +64 -0
  273. package/src/components/ExperimentDataViewer.story.vue +174 -0
  274. package/src/components/ExperimentDataViewer.vue +288 -0
  275. package/src/components/ExperimentPopover.story.vue +384 -0
  276. package/src/components/ExperimentPopover.vue +241 -0
  277. package/src/components/ExperimentSelectorModal.story.vue +391 -0
  278. package/src/components/ExperimentSelectorModal.vue +387 -0
  279. package/src/components/ExperimentTimeline.story.vue +161 -0
  280. package/src/components/ExperimentTimeline.vue +382 -0
  281. package/src/components/FileUploader.story.vue +107 -0
  282. package/src/components/FileUploader.vue +386 -0
  283. package/src/components/FitPanel.story.vue +125 -0
  284. package/src/components/FitPanel.vue +120 -0
  285. package/src/components/FormActions.vue +92 -0
  286. package/src/components/FormBuilder.vue +214 -0
  287. package/src/components/FormField.story.vue +132 -0
  288. package/src/components/FormField.vue +59 -0
  289. package/src/components/FormFieldRenderer.vue +58 -0
  290. package/src/components/FormSection.vue +90 -0
  291. package/src/components/FormulaInput.story.vue +96 -0
  292. package/src/components/FormulaInput.vue +125 -0
  293. package/src/components/GroupAssigner.story.vue +83 -0
  294. package/src/components/GroupAssigner.vue +284 -0
  295. package/src/components/GroupingModal.story.vue +52 -0
  296. package/src/components/GroupingModal.vue +422 -0
  297. package/src/components/IconButton.story.vue +135 -0
  298. package/src/components/IconButton.vue +73 -0
  299. package/src/components/LoadingSpinner.story.vue +70 -0
  300. package/src/components/LoadingSpinner.vue +50 -0
  301. package/src/components/MoleculeInput.story.vue +66 -0
  302. package/src/components/MoleculeInput.vue +426 -0
  303. package/src/components/MultiSelect.story.vue +132 -0
  304. package/src/components/MultiSelect.vue +118 -0
  305. package/src/components/NumberInput.story.vue +122 -0
  306. package/src/components/NumberInput.vue +160 -0
  307. package/src/components/PlateMapEditor.story.vue +92 -0
  308. package/src/components/PlateMapEditor.vue +513 -0
  309. package/src/components/ProgressBar.story.vue +148 -0
  310. package/src/components/ProgressBar.vue +114 -0
  311. package/src/components/ProtocolStepEditor.story.vue +69 -0
  312. package/src/components/ProtocolStepEditor.vue +522 -0
  313. package/src/components/RackEditor.story.vue +100 -0
  314. package/src/components/RackEditor.vue +371 -0
  315. package/src/components/ReagentEditor.story.vue +153 -0
  316. package/src/components/ReagentEditor.vue +418 -0
  317. package/src/components/ReagentList.story.vue +137 -0
  318. package/src/components/ReagentList.vue +463 -0
  319. package/src/components/ResourceCard.story.vue +150 -0
  320. package/src/components/ResourceCard.vue +161 -0
  321. package/src/components/SampleHierarchyTree.story.vue +161 -0
  322. package/src/components/SampleHierarchyTree.vue +256 -0
  323. package/src/components/SampleLegend.story.vue +91 -0
  324. package/src/components/SampleLegend.vue +119 -0
  325. package/src/components/SampleSelector.story.vue +111 -0
  326. package/src/components/SampleSelector.vue +1033 -0
  327. package/src/components/ScheduleCalendar.story.vue +195 -0
  328. package/src/components/ScheduleCalendar.vue +569 -0
  329. package/src/components/ScientificNumber.story.vue +127 -0
  330. package/src/components/ScientificNumber.vue +197 -0
  331. package/src/components/SegmentedControl.story.vue +132 -0
  332. package/src/components/SegmentedControl.vue +79 -0
  333. package/src/components/SequenceInput.story.vue +119 -0
  334. package/src/components/SequenceInput.vue +209 -0
  335. package/src/components/SettingsButton.story.vue +58 -0
  336. package/src/components/SettingsButton.vue +76 -0
  337. package/src/components/SettingsModal.story.vue +145 -0
  338. package/src/components/SettingsModal.vue +146 -0
  339. package/src/components/Skeleton.story.vue +141 -0
  340. package/src/components/Skeleton.vue +74 -0
  341. package/src/components/StatusIndicator.story.vue +99 -0
  342. package/src/components/StatusIndicator.vue +40 -0
  343. package/src/components/StepWizard.story.vue +155 -0
  344. package/src/components/StepWizard.vue +223 -0
  345. package/src/components/TagsInput.story.vue +155 -0
  346. package/src/components/TagsInput.vue +265 -0
  347. package/src/components/ThemeToggle.story.vue +36 -0
  348. package/src/components/ThemeToggle.vue +54 -0
  349. package/src/components/TimePicker.story.vue +96 -0
  350. package/src/components/TimePicker.vue +273 -0
  351. package/src/components/TimeRangeInput.story.vue +104 -0
  352. package/src/components/TimeRangeInput.vue +122 -0
  353. package/src/components/ToastNotification.story.vue +157 -0
  354. package/src/components/ToastNotification.vue +62 -0
  355. package/src/components/Tooltip.story.vue +138 -0
  356. package/src/components/Tooltip.vue +119 -0
  357. package/src/components/UnitInput.story.vue +194 -0
  358. package/src/components/UnitInput.vue +213 -0
  359. package/src/components/WellEditPopup.vue +234 -0
  360. package/src/components/WellPlate.story.vue +282 -0
  361. package/src/components/WellPlate.vue +830 -0
  362. package/src/components/index.ts +118 -0
  363. package/src/composables/experiment-utils.ts +57 -0
  364. package/src/composables/formBuilderRegistry.ts +79 -0
  365. package/src/composables/index.ts +140 -0
  366. package/src/composables/useApi.ts +167 -0
  367. package/src/composables/useAppExperiment.ts +159 -0
  368. package/src/composables/useAsync.ts +323 -0
  369. package/src/composables/useAuth.ts +445 -0
  370. package/src/composables/useAutoGroup.ts +641 -0
  371. package/src/composables/useChemicalFormula.ts +275 -0
  372. package/src/composables/useConcentrationUnits.ts +246 -0
  373. package/src/composables/useDoseCalculator.ts +370 -0
  374. package/src/composables/useExperimentData.ts +86 -0
  375. package/src/composables/useExperimentSave.ts +192 -0
  376. package/src/composables/useExperimentSelector.ts +292 -0
  377. package/src/composables/useForm.ts +416 -0
  378. package/src/composables/useFormBuilder.ts +383 -0
  379. package/src/composables/usePasskey.ts +216 -0
  380. package/src/composables/usePlatformContext.ts +299 -0
  381. package/src/composables/usePluginApi.ts +39 -0
  382. package/src/composables/usePluginConfig.ts +93 -0
  383. package/src/composables/useProtocolTemplates.ts +518 -0
  384. package/src/composables/useRackEditor.ts +222 -0
  385. package/src/composables/useReagentSeries.ts +91 -0
  386. package/src/composables/useScheduleDrag.ts +245 -0
  387. package/src/composables/useSequenceUtils.ts +105 -0
  388. package/src/composables/useTheme.ts +58 -0
  389. package/src/composables/useTimeUtils.ts +131 -0
  390. package/src/composables/useToast.ts +40 -0
  391. package/src/composables/useWellPlateEditor.ts +421 -0
  392. package/src/histoire.setup.ts +17 -0
  393. package/src/index.ts +367 -0
  394. package/src/install.ts +32 -0
  395. package/src/stores/auth.ts +152 -0
  396. package/src/stores/index.ts +2 -0
  397. package/src/stores/settings.ts +218 -0
  398. package/src/styles/components/alert-box.css +150 -0
  399. package/src/styles/components/app-avatar-menu.css +155 -0
  400. package/src/styles/components/app-container.css +33 -0
  401. package/src/styles/components/app-layout.css +98 -0
  402. package/src/styles/components/app-page-selector.css +191 -0
  403. package/src/styles/components/app-pill-nav.css +57 -0
  404. package/src/styles/components/app-plugin-switcher.css +209 -0
  405. package/src/styles/components/app-sidebar.css +145 -0
  406. package/src/styles/components/app-top-bar.css +492 -0
  407. package/src/styles/components/audit-trail.css +143 -0
  408. package/src/styles/components/auto-group-modal.css +644 -0
  409. package/src/styles/components/avatar.css +73 -0
  410. package/src/styles/components/batch-progress-list.css +196 -0
  411. package/src/styles/components/breadcrumb.css +64 -0
  412. package/src/styles/components/button.css +188 -0
  413. package/src/styles/components/calendar.css +192 -0
  414. package/src/styles/components/chart-container.css +69 -0
  415. package/src/styles/components/checkbox.css +123 -0
  416. package/src/styles/components/chemical-formula.css +46 -0
  417. package/src/styles/components/collapsible-card.css +253 -0
  418. package/src/styles/components/color-slider.css +110 -0
  419. package/src/styles/components/concentration-input.css +156 -0
  420. package/src/styles/components/confirm-dialog.css +183 -0
  421. package/src/styles/components/dataframe.css +382 -0
  422. package/src/styles/components/date-picker.css +243 -0
  423. package/src/styles/components/datetime-picker.css +229 -0
  424. package/src/styles/components/divider.css +63 -0
  425. package/src/styles/components/dose-calculator.css +301 -0
  426. package/src/styles/components/dropdown-button.css +280 -0
  427. package/src/styles/components/empty-state.css +151 -0
  428. package/src/styles/components/experiment-code-badge.css +33 -0
  429. package/src/styles/components/experiment-data-viewer.css +138 -0
  430. package/src/styles/components/experiment-popover.css +562 -0
  431. package/src/styles/components/experiment-selector-modal.css +285 -0
  432. package/src/styles/components/experiment-timeline.css +529 -0
  433. package/src/styles/components/file-uploader.css +310 -0
  434. package/src/styles/components/fit-panel.css +67 -0
  435. package/src/styles/components/form-builder.css +69 -0
  436. package/src/styles/components/form-field.css +48 -0
  437. package/src/styles/components/formula-input.css +103 -0
  438. package/src/styles/components/group-assigner.css +200 -0
  439. package/src/styles/components/grouping-modal.css +323 -0
  440. package/src/styles/components/icon-button.css +192 -0
  441. package/src/styles/components/input.css +66 -0
  442. package/src/styles/components/loading-spinner.css +67 -0
  443. package/src/styles/components/modal.css +350 -0
  444. package/src/styles/components/molecule-input.css +186 -0
  445. package/src/styles/components/multi-select.css +131 -0
  446. package/src/styles/components/number-input.css +199 -0
  447. package/src/styles/components/pill.css +188 -0
  448. package/src/styles/components/plate-map-editor.css +464 -0
  449. package/src/styles/components/progress-bar.css +133 -0
  450. package/src/styles/components/protocol-step-editor.css +449 -0
  451. package/src/styles/components/rack-editor.css +265 -0
  452. package/src/styles/components/radio-group.css +240 -0
  453. package/src/styles/components/reagent-editor.css +510 -0
  454. package/src/styles/components/reagent-list.css +407 -0
  455. package/src/styles/components/resource-card.css +360 -0
  456. package/src/styles/components/sample-hierarchy-tree.css +314 -0
  457. package/src/styles/components/sample-legend.css +201 -0
  458. package/src/styles/components/sample-selector.css +751 -0
  459. package/src/styles/components/schedule-calendar.css +478 -0
  460. package/src/styles/components/scientific-number.css +63 -0
  461. package/src/styles/components/segmented-control.css +197 -0
  462. package/src/styles/components/select.css +77 -0
  463. package/src/styles/components/sequence-input.css +184 -0
  464. package/src/styles/components/settings-button.css +94 -0
  465. package/src/styles/components/settings-modal.css +95 -0
  466. package/src/styles/components/skeleton.css +49 -0
  467. package/src/styles/components/slider.css +74 -0
  468. package/src/styles/components/status-indicator.css +66 -0
  469. package/src/styles/components/step-wizard.css +192 -0
  470. package/src/styles/components/tabs.css +95 -0
  471. package/src/styles/components/tags-input.css +195 -0
  472. package/src/styles/components/textarea.css +82 -0
  473. package/src/styles/components/theme-toggle.css +69 -0
  474. package/src/styles/components/time-picker.css +171 -0
  475. package/src/styles/components/time-range-input.css +42 -0
  476. package/src/styles/components/toast.css +91 -0
  477. package/src/styles/components/toggle.css +146 -0
  478. package/src/styles/components/tooltip.css +91 -0
  479. package/src/styles/components/unit-input.css +123 -0
  480. package/src/styles/components/well-edit-popup.css +252 -0
  481. package/src/styles/components/well-plate.css +307 -0
  482. package/src/styles/index.css +87 -0
  483. package/src/styles/variables.css +1117 -0
  484. package/src/tailwind.preset.ts +61 -0
  485. package/src/types/auth.ts +55 -0
  486. package/src/types/auto-group.ts +40 -0
  487. package/src/types/components.ts +710 -0
  488. package/src/types/form-builder.ts +197 -0
  489. package/src/types/index.ts +207 -0
  490. package/src/types/platform.ts +116 -0
  491. package/src/utils/color.ts +96 -0
@@ -0,0 +1,8 @@
1
+ import { DatePreset, ExperimentStatus, SelectOption, PillVariant } from '../types';
2
+ export declare function formatExperimentDate(dateStr: string): string;
3
+ export declare function datePresetToISO(preset: DatePreset): string;
4
+ export declare const EXPERIMENT_STATUS_OPTIONS: SelectOption<string>[];
5
+ export declare const EXPERIMENT_STATUS_VARIANT_MAP: Record<ExperimentStatus, PillVariant>;
6
+ export declare const EXPERIMENT_STATUS_LABELS: Record<ExperimentStatus, string>;
7
+ export declare const DATE_PRESET_OPTIONS: SelectOption<string>[];
8
+ export declare const SORT_OPTIONS: SelectOption<string>[];
@@ -0,0 +1,13 @@
1
+ import { Component } from 'vue';
2
+ import { FormFieldType } from '../types/form-builder';
3
+ export interface RegistryEntry {
4
+ component: Component;
5
+ /** Default props applied to the component. */
6
+ defaults: Record<string, unknown>;
7
+ /** Whether the component uses v-model (false for event-only components like FileUploader). */
8
+ vModel: boolean;
9
+ }
10
+ /** Return the registry entry for a given field type. Throws if the type is unregistered. */
11
+ export declare function getFieldRegistryEntry(type: FormFieldType): RegistryEntry;
12
+ /** Get the default empty value for a given field type. */
13
+ export declare function getTypeDefault(type: FormFieldType): unknown;
@@ -0,0 +1,28 @@
1
+ export { useApi, type ApiClientOptions } from './useApi';
2
+ export { useAuth } from './useAuth';
3
+ export { usePasskey } from './usePasskey';
4
+ export { useTheme } from './useTheme';
5
+ export { useToast } from './useToast';
6
+ export { usePlatformContext } from './usePlatformContext';
7
+ export { useForm, type ValidationRule, type FieldRules, type FieldState, type UseFormReturn, } from './useForm';
8
+ export { useAsync, useAsyncBatch, type AsyncError, type AsyncState, type UseAsyncReturn, type UseAsyncOptions, } from './useAsync';
9
+ export { useWellPlateEditor, type UseWellPlateEditorOptions, type UseWellPlateEditorReturn, } from './useWellPlateEditor';
10
+ export { useConcentrationUnits, type ConcentrationValue, type ConcentrationUnit, type MolarityUnit, type MassVolumeUnit, type PercentageUnit, type UnitCategory, type UseConcentrationUnitsReturn, } from './useConcentrationUnits';
11
+ export { useDoseCalculator, type VolumeUnit, type VolumeValue, type DilutionParams, type DilutionResult, type SerialDilutionParams, type SerialDilutionStep, type SerialDilutionResult, type WellConcentration, type UseDoseCalculatorReturn, } from './useDoseCalculator';
12
+ export { useProtocolTemplates, type ParameterDefinition, type StepTemplate, type ValidationResult, type UseProtocolTemplatesReturn, } from './useProtocolTemplates';
13
+ export { useRackEditor, type UseRackEditorOptions, type UseRackEditorReturn, } from './useRackEditor';
14
+ export { useChemicalFormula, ATOMIC_WEIGHTS, type ParsedElement, type FormulaParseResult, type FormulaPart, type FormulaPartType, } from './useChemicalFormula';
15
+ export { useSequenceUtils, type SequenceType, type SequenceStats, } from './useSequenceUtils';
16
+ export { useTimeUtils, parseTime, formatTime, generateTimeSlots, rangesOverlap, durationMinutes, formatDuration, isTimeInRange, findAvailableSlots, snapToSlot, addMinutes, compareTime, } from './useTimeUtils';
17
+ export { useScheduleDrag } from './useScheduleDrag';
18
+ export { useFormBuilder, evaluateCondition } from './useFormBuilder';
19
+ export { useAutoGroup, DEFAULT_COLORS, extractSamplesFromDesignData } from './useAutoGroup';
20
+ export { useReagentSeries, generateDilutionSeries, DEFAULT_PRESETS, DEFAULT_UNITS, type LevelEntry, type DilutionPreset, type UseReagentSeriesReturn, } from './useReagentSeries';
21
+ export { usePluginConfig, type UsePluginConfigReturn } from './usePluginConfig';
22
+ export { useExperimentSelector, type UseExperimentSelectorOptions, type UseExperimentSelectorReturn, } from './useExperimentSelector';
23
+ export { formatExperimentDate, datePresetToISO, EXPERIMENT_STATUS_OPTIONS, EXPERIMENT_STATUS_VARIANT_MAP, EXPERIMENT_STATUS_LABELS, DATE_PRESET_OPTIONS, SORT_OPTIONS, } from './experiment-utils';
24
+ export { useExperimentData, type UseExperimentDataOptions, type UseExperimentDataReturn, } from './useExperimentData';
25
+ export { getFieldRegistryEntry, getTypeDefault, type RegistryEntry, } from './formBuilderRegistry';
26
+ export { useAppExperiment, APP_EXPERIMENT_KEY, type UseAppExperimentOptions, type UseAppExperimentReturn, type AppExperimentState, } from './useAppExperiment';
27
+ export { useExperimentSave, type UseExperimentSaveOptions, type UseExperimentSaveReturn, } from './useExperimentSave';
28
+ export { usePluginApi, type UsePluginApiOptions, } from './usePluginApi';
@@ -0,0 +1,3 @@
1
+ import { $ as formatTime, A as APP_EXPERIMENT_KEY, B as formatExperimentDate, D as useAutoGroup, F as EXPERIMENT_STATUS_LABELS, H as useTheme, I as EXPERIMENT_STATUS_OPTIONS, J as addMinutes, L as EXPERIMENT_STATUS_VARIANT_MAP, M as usePlatformContext, N as useExperimentSelector, O as useWellPlateEditor, P as DATE_PRESET_OPTIONS, Q as formatDuration, R as SORT_OPTIONS, S as useConcentrationUnits, T as extractSamplesFromDesignData, U as useToast, V as useApi, X as durationMinutes, Y as compareTime, Z as findAvailableSlots, _ as DEFAULT_UNITS, a as getFieldRegistryEntry, at as useTimeUtils, b as useDoseCalculator, c as useForm, d as useSequenceUtils, et as generateTimeSlots, g as DEFAULT_PRESETS, h as useProtocolTemplates, i as useFormBuilder, it as snapToSlot, j as useAppExperiment, k as useRackEditor, m as useChemicalFormula, n as useExperimentData, nt as parseTime, o as getTypeDefault, p as ATOMIC_WEIGHTS, r as evaluateCondition, rt as rangesOverlap, t as useScheduleDrag, tt as isTimeInRange, v as generateDilutionSeries, w as DEFAULT_COLORS, y as useReagentSeries, z as datePresetToISO } from "../useScheduleDrag-DAJueTbK.js";
2
+ import { a as useAsyncBatch, i as useAsync, n as useExperimentSave, o as usePasskey, r as usePluginConfig, s as useAuth, t as usePluginApi } from "../composables-D0QfFzq1.js";
3
+ export { APP_EXPERIMENT_KEY, ATOMIC_WEIGHTS, DATE_PRESET_OPTIONS, DEFAULT_COLORS, DEFAULT_PRESETS, DEFAULT_UNITS, EXPERIMENT_STATUS_LABELS, EXPERIMENT_STATUS_OPTIONS, EXPERIMENT_STATUS_VARIANT_MAP, SORT_OPTIONS, addMinutes, compareTime, datePresetToISO, durationMinutes, evaluateCondition, extractSamplesFromDesignData, findAvailableSlots, formatDuration, formatExperimentDate, formatTime, generateDilutionSeries, generateTimeSlots, getFieldRegistryEntry, getTypeDefault, isTimeInRange, parseTime, rangesOverlap, snapToSlot, useApi, useAppExperiment, useAsync, useAsyncBatch, useAuth, useAutoGroup, useChemicalFormula, useConcentrationUnits, useDoseCalculator, useExperimentData, useExperimentSave, useExperimentSelector, useForm, useFormBuilder, usePasskey, usePlatformContext, usePluginApi, usePluginConfig, useProtocolTemplates, useRackEditor, useReagentSeries, useScheduleDrag, useSequenceUtils, useTheme, useTimeUtils, useToast, useWellPlateEditor };
@@ -0,0 +1,20 @@
1
+ import { AxiosInstance, AxiosRequestConfig } from 'axios';
2
+ export interface ApiClientOptions {
3
+ baseUrl?: string;
4
+ timeout?: number;
5
+ withAuth?: boolean;
6
+ }
7
+ export interface UseApiReturn {
8
+ client: AxiosInstance;
9
+ get: <T>(url: string, config?: AxiosRequestConfig) => Promise<T>;
10
+ post: <T>(url: string, data?: unknown, config?: AxiosRequestConfig) => Promise<T>;
11
+ put: <T>(url: string, data?: unknown, config?: AxiosRequestConfig) => Promise<T>;
12
+ patch: <T>(url: string, data?: unknown, config?: AxiosRequestConfig) => Promise<T>;
13
+ delete: <T>(url: string, config?: AxiosRequestConfig) => Promise<T>;
14
+ upload: <T>(url: string, file: File, fieldName?: string, additionalData?: Record<string, unknown>) => Promise<T>;
15
+ download: (url: string, filename?: string) => Promise<string>;
16
+ buildUrl: (path: string) => string;
17
+ buildWsUrl: (path: string) => string;
18
+ }
19
+ /** Axios-based API client that injects the plugin base URL and JWT auth header on every request. */
20
+ export declare function useApi(options?: ApiClientOptions): UseApiReturn;
@@ -0,0 +1,37 @@
1
+ import { Ref, ComputedRef, InjectionKey } from 'vue';
2
+ import { ExperimentSummary, ExperimentStatus } from '../types';
3
+ export interface UseAppExperimentOptions {
4
+ onSelect?: (experiment: ExperimentSummary) => void | Promise<void>;
5
+ onSave?: () => string | null | Promise<string | null>;
6
+ onDetach?: () => void;
7
+ saveDisabled?: Ref<boolean> | ComputedRef<boolean>;
8
+ saveDisabledMessage?: string | Ref<string | undefined> | ComputedRef<string | undefined>;
9
+ }
10
+ export interface UseAppExperimentReturn {
11
+ set: (experiment: Pick<ExperimentSummary, 'id' | 'name' | 'status' | 'experiment_code'>) => void;
12
+ clear: () => void;
13
+ experimentName: Readonly<Ref<string | undefined>>;
14
+ experimentCode: Readonly<Ref<string | undefined>>;
15
+ experimentId: Readonly<Ref<number | null>>;
16
+ }
17
+ export interface AppExperimentState {
18
+ experimentName: Ref<string | undefined>;
19
+ experimentCode: Ref<string | undefined>;
20
+ experimentStatus: Ref<ExperimentStatus | undefined>;
21
+ experimentId: Ref<number | null>;
22
+ showModal: Ref<boolean>;
23
+ saveLoading: Ref<boolean>;
24
+ saveSuccessMessage: Ref<string | undefined>;
25
+ showSave: Ref<boolean>;
26
+ showDetach: ComputedRef<boolean>;
27
+ closeModal: () => void;
28
+ saveDisabled: ComputedRef<boolean>;
29
+ saveDisabledMessage: ComputedRef<string | undefined>;
30
+ openModal: () => void;
31
+ handleSelect: (experiment: ExperimentSummary) => void;
32
+ handleSave: () => Promise<void>;
33
+ handleDetach: () => void;
34
+ }
35
+ export declare const APP_EXPERIMENT_KEY: InjectionKey<AppExperimentState>;
36
+ /** Manages the active experiment selection, save flow, and detach action for a plugin's app shell. */
37
+ export declare function useAppExperiment(options?: UseAppExperimentOptions): UseAppExperimentReturn;
@@ -0,0 +1,128 @@
1
+ import { Ref, ComputedRef } from 'vue';
2
+ /**
3
+ * Error type for async operations.
4
+ */
5
+ export interface AsyncError {
6
+ message: string;
7
+ code?: string;
8
+ details?: Record<string, unknown>;
9
+ originalError?: unknown;
10
+ }
11
+ /**
12
+ * State of an async operation.
13
+ */
14
+ export type AsyncState = 'idle' | 'loading' | 'success' | 'error';
15
+ /**
16
+ * Return type for useAsync composable.
17
+ */
18
+ export interface UseAsyncReturn<T> {
19
+ data: Ref<T | null>;
20
+ error: Ref<AsyncError | null>;
21
+ state: Ref<AsyncState>;
22
+ isIdle: ComputedRef<boolean>;
23
+ isLoading: ComputedRef<boolean>;
24
+ isSuccess: ComputedRef<boolean>;
25
+ isError: ComputedRef<boolean>;
26
+ execute: (...args: unknown[]) => Promise<T | null>;
27
+ reset: () => void;
28
+ setData: (data: T | null) => void;
29
+ setError: (error: AsyncError | null) => void;
30
+ }
31
+ /**
32
+ * Options for useAsync.
33
+ */
34
+ export interface UseAsyncOptions<T> {
35
+ initialData?: T | null;
36
+ immediate?: boolean;
37
+ immediateArgs?: unknown[];
38
+ transformError?: (error: unknown) => AsyncError;
39
+ onSuccess?: (data: T) => void;
40
+ onError?: (error: AsyncError) => void;
41
+ resetOnExecute?: boolean;
42
+ }
43
+ /**
44
+ * Composable for managing async operation state.
45
+ *
46
+ * Provides standardized loading, error, and success state management
47
+ * for any async function.
48
+ *
49
+ * @param asyncFn - The async function to wrap
50
+ * @param options - Configuration options
51
+ *
52
+ * @example
53
+ * ```typescript
54
+ * // Basic usage
55
+ * const { data, isLoading, error, execute } = useAsync(
56
+ * async (id: string) => {
57
+ * const response = await api.get(`/users/${id}`)
58
+ * return response.data
59
+ * }
60
+ * )
61
+ *
62
+ * // Execute the function
63
+ * await execute('user-123')
64
+ *
65
+ * // In template
66
+ * <div v-if="isLoading">Loading...</div>
67
+ * <div v-else-if="error">{{ error.message }}</div>
68
+ * <div v-else-if="data">{{ data.name }}</div>
69
+ * ```
70
+ *
71
+ * @example
72
+ * ```typescript
73
+ * // With options
74
+ * const { data, execute } = useAsync(
75
+ * fetchUser,
76
+ * {
77
+ * immediate: true,
78
+ * immediateArgs: ['default-user'],
79
+ * onSuccess: (user) => console.log('Fetched:', user.name),
80
+ * onError: (error) => toast.error(error.message),
81
+ * }
82
+ * )
83
+ * ```
84
+ *
85
+ * @example
86
+ * ```typescript
87
+ * // Form submission
88
+ * const { isLoading, error, execute: submit } = useAsync(
89
+ * async (formData: FormData) => {
90
+ * await api.post('/submit', formData)
91
+ * },
92
+ * {
93
+ * onSuccess: () => {
94
+ * toast.success('Submitted!')
95
+ * router.push('/success')
96
+ * },
97
+ * }
98
+ * )
99
+ *
100
+ * const handleSubmit = () => submit(new FormData(formRef.value))
101
+ * ```
102
+ */
103
+ /** Wraps an async function with reactive loading, error, and success state plus optional auto-execute. */
104
+ export declare function useAsync<T>(asyncFn: (...args: unknown[]) => Promise<T>, options?: UseAsyncOptions<T>): UseAsyncReturn<T>;
105
+ /**
106
+ * Create a batch of async operations that can be executed in parallel.
107
+ *
108
+ * @example
109
+ * ```typescript
110
+ * const { results, isLoading, execute } = useAsyncBatch([
111
+ * () => fetchUser(userId),
112
+ * () => fetchPosts(userId),
113
+ * () => fetchComments(userId),
114
+ * ])
115
+ *
116
+ * await execute()
117
+ * // results.value = [user, posts, comments]
118
+ * ```
119
+ */
120
+ export declare function useAsyncBatch<T extends readonly (() => Promise<unknown>)[]>(asyncFns: T): {
121
+ results: Ref<{
122
+ [K in keyof T]: Awaited<ReturnType<T[K]>> | null;
123
+ }>;
124
+ errors: Ref<(AsyncError | null)[]>;
125
+ isLoading: Ref<boolean>;
126
+ execute: () => Promise<void>;
127
+ reset: () => void;
128
+ };
@@ -0,0 +1,47 @@
1
+ import { Ref } from 'vue';
2
+ import { AuthConfig, UserInfo } from '../types';
3
+ /**
4
+ * Authentication composable with automatic token refresh.
5
+ *
6
+ * Features:
7
+ * - Automatic token refresh before expiration
8
+ * - Login/logout/register functionality
9
+ * - Token verification on startup
10
+ * - User profile management
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const { login, logout, isAuthenticated, user } = useAuth()
15
+ *
16
+ * // Login
17
+ * const success = await login('username', 'password')
18
+ *
19
+ * // Automatic refresh is enabled by default
20
+ * // Tokens are refreshed 5 minutes before expiration
21
+ * ```
22
+ */
23
+ export interface UseAuthReturn {
24
+ login: (username: string, password: string) => Promise<boolean>;
25
+ logout: () => void;
26
+ register: (username: string, password: string, email?: string) => Promise<boolean>;
27
+ verifyToken: () => Promise<boolean>;
28
+ fetchAuthConfig: () => Promise<AuthConfig>;
29
+ initializeAuth: () => Promise<void>;
30
+ getCurrentUser: () => Promise<UserInfo | null>;
31
+ getAuthHeader: () => Record<string, string>;
32
+ updateProfile: (data: {
33
+ email?: string;
34
+ shortname?: string;
35
+ currentPassword?: string;
36
+ newPassword?: string;
37
+ }) => Promise<{
38
+ success: boolean;
39
+ error?: string;
40
+ }>;
41
+ refreshToken: () => Promise<boolean>;
42
+ isRefreshing: Ref<boolean>;
43
+ }
44
+ /** @internal Reset module-level state — only for use in tests. */
45
+ export declare function _resetAuthStateForTesting(): void;
46
+ /** Manages authentication state with login/logout/register and automatic JWT token refresh. */
47
+ export declare function useAuth(): UseAuthReturn;
@@ -0,0 +1,106 @@
1
+ import { InputMode, OutlierAction, OutlierInfo, ColumnInfo, MetadataRow, AutoGroupResult, ParsedCsvData } from '../types/auto-group';
2
+ import { SampleGroup } from '../types/components';
3
+ export declare const DEFAULT_COLORS: string[];
4
+ export declare function analyzeDelimiter(lines: string[]): {
5
+ delimiter: string;
6
+ dominantFieldCount: number;
7
+ minFieldCount: number;
8
+ consistency: number;
9
+ };
10
+ export declare function detectOutliers(lines: string[], delimiter: string, minFieldCount: number): OutlierInfo[];
11
+ export declare function classifyOutlierAction(sample: string, delimiter: string): OutlierAction;
12
+ export declare function isUsefulField(field: ColumnInfo, rowCount: number): boolean;
13
+ export declare function extractColumns(samples: string[], delimiter: string, minFieldCount: number): ColumnInfo[];
14
+ export declare function parseCSVLine(line: string, delimiter?: string): string[];
15
+ export declare function parseCSV(text: string): ParsedCsvData;
16
+ export declare function computeGroups(allSamples: string[], columns: ColumnInfo[], enabledFields: Set<number>, outlierActions: Map<number, OutlierAction>, delimiter: string, minFieldCount: number): {
17
+ groups: SampleGroup[];
18
+ metadata: MetadataRow[];
19
+ excludedSamples: string[];
20
+ };
21
+ /**
22
+ * Extract sample metadata from raw design_data into ParsedCsvData format.
23
+ *
24
+ * Looks for a `samples` array in the design data. For each sample, merges
25
+ * the `conditions` dict (the metadata table) with the `sample_name` to
26
+ * produce a flat tabular row. QC and blank samples are filtered out by
27
+ * their explicit `sample_type` field.
28
+ *
29
+ * Returns null if no samples with conditions are found.
30
+ */
31
+ export declare function extractSamplesFromDesignData(rawData: Record<string, unknown>): ParsedCsvData | null;
32
+ export declare function computeGroupsFromCsv(csvData: ParsedCsvData, columns: ColumnInfo[], enabledFields: Set<number>): {
33
+ groups: SampleGroup[];
34
+ metadata: MetadataRow[];
35
+ excludedSamples: string[];
36
+ };
37
+ /** Parses sample names or CSV data to propose group assignments with outlier detection and preview. */
38
+ export declare function useAutoGroup(): {
39
+ inputMode: import('vue').Ref<InputMode, InputMode>;
40
+ rawText: import('vue').Ref<string, string>;
41
+ csvData: import('vue').Ref<{
42
+ columns: string[];
43
+ rows: Record<string, string>[];
44
+ sampleColumn: string;
45
+ delimiter: string;
46
+ } | null, ParsedCsvData | {
47
+ columns: string[];
48
+ rows: Record<string, string>[];
49
+ sampleColumn: string;
50
+ delimiter: string;
51
+ } | null>;
52
+ delimiter: import('vue').Ref<string, string>;
53
+ dominantFieldCount: import('vue').Ref<number, number>;
54
+ minFieldCount: import('vue').Ref<number, number>;
55
+ outliers: import('vue').Ref<{
56
+ sample: string;
57
+ index: number;
58
+ fieldCount: number;
59
+ action: OutlierAction;
60
+ }[], OutlierInfo[] | {
61
+ sample: string;
62
+ index: number;
63
+ fieldCount: number;
64
+ action: OutlierAction;
65
+ }[]>;
66
+ fields: import('vue').Ref<{
67
+ index: number;
68
+ name: string;
69
+ uniqueValues: string[];
70
+ cardinality: number;
71
+ type?: "prefix" | "suffix" | undefined;
72
+ originalName?: string | undefined;
73
+ }[], ColumnInfo[] | {
74
+ index: number;
75
+ name: string;
76
+ uniqueValues: string[];
77
+ cardinality: number;
78
+ type?: "prefix" | "suffix" | undefined;
79
+ originalName?: string | undefined;
80
+ }[]>;
81
+ fieldNames: import('vue').Ref<Record<number, string>, Record<number, string>>;
82
+ enabledFields: import('vue').Ref<Set<number> & Omit<Set<number>, keyof Set<any>>, Set<number> | (Set<number> & Omit<Set<number>, keyof Set<any>>)>;
83
+ samples: import('vue').ComputedRef<string[]>;
84
+ hasOutliers: import('vue').ComputedRef<boolean>;
85
+ conformingSamples: import('vue').ComputedRef<string[]>;
86
+ groups: import('vue').ComputedRef<SampleGroup[]>;
87
+ metadata: import('vue').ComputedRef<MetadataRow[]>;
88
+ excludedSamples: import('vue').ComputedRef<string[]>;
89
+ allSingletons: import('vue').ComputedRef<boolean>;
90
+ result: import('vue').ComputedRef<AutoGroupResult>;
91
+ effectiveColumns: import('vue').ComputedRef<{
92
+ name: string;
93
+ index: number;
94
+ uniqueValues: string[];
95
+ cardinality: number;
96
+ type?: "prefix" | "suffix" | undefined;
97
+ originalName?: string | undefined;
98
+ }[]>;
99
+ parseInput: () => void;
100
+ loadExperimentData: (rawData: Record<string, unknown>) => boolean;
101
+ setOutlierAction: (index: number, action: OutlierAction) => void;
102
+ setAllOutlierActions: (action: OutlierAction) => void;
103
+ toggleField: (index: number) => void;
104
+ renameField: (index: number, name: string) => void;
105
+ reset: () => void;
106
+ };
@@ -0,0 +1,21 @@
1
+ export interface ParsedElement {
2
+ symbol: string;
3
+ count: number;
4
+ }
5
+ export interface FormulaParseResult {
6
+ elements: Record<string, number>;
7
+ valid: boolean;
8
+ error?: string;
9
+ }
10
+ export type FormulaPartType = 'element' | 'subscript' | 'superscript' | 'paren' | 'dot' | 'charge';
11
+ export interface FormulaPart {
12
+ type: FormulaPartType;
13
+ text: string;
14
+ }
15
+ export declare const ATOMIC_WEIGHTS: Record<string, number>;
16
+ /** Parses and renders chemical formulas, computes molecular weight, and generates rich-text formula parts. */
17
+ export declare function useChemicalFormula(): {
18
+ parseFormula: (formula: string) => FormulaParseResult;
19
+ calculateMW: (elements: Record<string, number>) => number;
20
+ renderFormulaParts: (formula: string) => FormulaPart[];
21
+ };
@@ -0,0 +1,29 @@
1
+ import { ComputedRef } from 'vue';
2
+ export type MolarityUnit = 'pM' | 'nM' | 'µM' | 'mM' | 'M';
3
+ export type MassVolumeUnit = 'pg/mL' | 'ng/mL' | 'µg/mL' | 'mg/mL' | 'g/mL';
4
+ export type PercentageUnit = '% v/v' | '% w/v' | '% w/w';
5
+ export type ConcentrationUnit = MolarityUnit | MassVolumeUnit | PercentageUnit | string;
6
+ export interface ConcentrationValue {
7
+ value: number;
8
+ unit: ConcentrationUnit;
9
+ }
10
+ export interface UnitCategory {
11
+ label: string;
12
+ units: ConcentrationUnit[];
13
+ }
14
+ export interface UseConcentrationUnitsReturn {
15
+ unitCategories: ComputedRef<UnitCategory[]>;
16
+ molarityUnits: MolarityUnit[];
17
+ massVolumeUnits: MassVolumeUnit[];
18
+ percentageUnits: PercentageUnit[];
19
+ convert: (value: number, from: ConcentrationUnit, to: ConcentrationUnit, mw?: number) => number | null;
20
+ formatWithUnit: (concentration: ConcentrationValue, precision?: number) => string;
21
+ parseConcentration: (input: string) => ConcentrationValue | null;
22
+ getBaseUnit: (unit: ConcentrationUnit) => ConcentrationUnit;
23
+ getConversionHint: (concentration: ConcentrationValue) => string | null;
24
+ isMolarity: (unit: ConcentrationUnit) => boolean;
25
+ isMassVolume: (unit: ConcentrationUnit) => boolean;
26
+ isPercentage: (unit: ConcentrationUnit) => boolean;
27
+ }
28
+ /** Converts between molarity, mass/volume, and percentage concentration units with formatting helpers. */
29
+ export declare function useConcentrationUnits(): UseConcentrationUnitsReturn;
@@ -0,0 +1,58 @@
1
+ import { ConcentrationValue, MolarityUnit, MassVolumeUnit } from './useConcentrationUnits';
2
+ export type VolumeUnit = 'µL' | 'mL' | 'L';
3
+ export interface VolumeValue {
4
+ value: number;
5
+ unit: VolumeUnit;
6
+ }
7
+ export interface DilutionParams {
8
+ stockConcentration: ConcentrationValue;
9
+ finalConcentration: ConcentrationValue;
10
+ finalVolume: VolumeValue;
11
+ }
12
+ export interface DilutionResult {
13
+ stockVolume: VolumeValue;
14
+ diluentVolume: VolumeValue;
15
+ dilutionFactor: number;
16
+ valid: boolean;
17
+ error?: string;
18
+ }
19
+ export interface SerialDilutionParams {
20
+ startingConcentration: ConcentrationValue;
21
+ dilutionFactor: number;
22
+ numberOfDilutions: number;
23
+ volumePerWell: VolumeValue;
24
+ }
25
+ export interface SerialDilutionStep {
26
+ stepNumber: number;
27
+ concentration: ConcentrationValue;
28
+ transferVolume: VolumeValue;
29
+ diluentVolume: VolumeValue;
30
+ }
31
+ export interface SerialDilutionResult {
32
+ steps: SerialDilutionStep[];
33
+ totalStockVolume: VolumeValue;
34
+ valid: boolean;
35
+ error?: string;
36
+ }
37
+ export interface ConversionResult {
38
+ result: ConcentrationValue;
39
+ valid: boolean;
40
+ error?: string;
41
+ }
42
+ export interface WellConcentration {
43
+ wellId: string;
44
+ concentration: ConcentrationValue;
45
+ volume?: VolumeValue;
46
+ }
47
+ export interface UseDoseCalculatorReturn {
48
+ volumeUnits: VolumeUnit[];
49
+ calculateDilution: (params: DilutionParams) => DilutionResult;
50
+ calculateSerialDilution: (params: SerialDilutionParams) => SerialDilutionResult;
51
+ convertMassToMolar: (mass: number, massUnit: MassVolumeUnit, mw: number) => ConcentrationValue;
52
+ convertMolarToMass: (molar: number, molarUnit: MolarityUnit, mw: number) => ConcentrationValue;
53
+ convertVolume: (value: number, from: VolumeUnit, to: VolumeUnit) => number;
54
+ formatVolume: (volume: VolumeValue, precision?: number) => string;
55
+ generateWellConcentrations: (result: SerialDilutionResult, wellIds: string[]) => WellConcentration[];
56
+ }
57
+ /** Calculates single dilutions, serial dilution series, and plate-filling volumes for dose-response experiments. */
58
+ export declare function useDoseCalculator(): UseDoseCalculatorReturn;
@@ -0,0 +1,18 @@
1
+ import { Ref, ComputedRef } from 'vue';
2
+ import { TreeNode, SummaryData } from '../types';
3
+ export interface UseExperimentDataOptions {
4
+ apiBaseUrl?: string;
5
+ immediate?: boolean;
6
+ }
7
+ export interface UseExperimentDataReturn {
8
+ data: Ref<Record<string, unknown> | null>;
9
+ treeData: ComputedRef<TreeNode[]>;
10
+ tableData: ComputedRef<Record<string, unknown>[]>;
11
+ summaryData: ComputedRef<SummaryData | null>;
12
+ isLoading: Ref<boolean>;
13
+ error: Ref<string | null>;
14
+ fetch: (experimentId: number) => Promise<void>;
15
+ refresh: () => Promise<void>;
16
+ }
17
+ /** Fetches and normalises experiment output data (tree, table, summary) from the platform API. */
18
+ export declare function useExperimentData(options?: UseExperimentDataOptions): UseExperimentDataReturn;
@@ -0,0 +1,36 @@
1
+ import { Ref } from 'vue';
2
+ export interface UseExperimentSaveOptions {
3
+ /** Default plugin_id for all save/load calls. */
4
+ pluginId?: string;
5
+ /** Default schema version for design saves (defaults to "1.0"). */
6
+ schemaVersion?: string;
7
+ /** Override API base URL. */
8
+ apiBaseUrl?: string;
9
+ }
10
+ export interface UseExperimentSaveReturn {
11
+ /** Whether a save operation is in progress. */
12
+ isSaving: Ref<boolean>;
13
+ /** Error message from the last failed operation, or null. */
14
+ error: Ref<string | null>;
15
+ /** Timestamp of the last successful save, or null. */
16
+ lastSavedAt: Ref<Date | null>;
17
+ /** Save design data for an experiment. */
18
+ saveDesign: (experimentId: number, data: Record<string, unknown>) => Promise<boolean>;
19
+ /** Save analysis result for an experiment. */
20
+ saveAnalysis: (experimentId: number, result: Record<string, unknown>) => Promise<boolean>;
21
+ /** Save design and/or analysis in one call. */
22
+ save: (experimentId: number, opts: {
23
+ design?: Record<string, unknown>;
24
+ analysis?: Record<string, unknown>;
25
+ }) => Promise<boolean>;
26
+ /** Load design data for an experiment. */
27
+ loadDesign: (experimentId: number) => Promise<Record<string, unknown> | null>;
28
+ /** Load analysis result for an experiment. */
29
+ loadAnalysis: (experimentId: number) => Promise<Record<string, unknown> | null>;
30
+ /** Delete design data for an experiment. */
31
+ deleteDesign: (experimentId: number) => Promise<boolean>;
32
+ /** Delete analysis result for an experiment. */
33
+ deleteAnalysis: (experimentId: number) => Promise<boolean>;
34
+ }
35
+ /** Persists and loads experiment design and analysis data via the plugin's API endpoint. */
36
+ export declare function useExperimentSave(options?: UseExperimentSaveOptions): UseExperimentSaveReturn;
@@ -0,0 +1,30 @@
1
+ import { Ref, ComputedRef } from 'vue';
2
+ import { ExperimentSummary, ExperimentFilters, ExperimentTypeOption, SelectOption } from '../types';
3
+ export interface UseExperimentSelectorOptions {
4
+ experimentType?: string;
5
+ apiBaseUrl?: string;
6
+ limit?: number;
7
+ immediate?: boolean;
8
+ }
9
+ export interface UseExperimentSelectorReturn {
10
+ experiments: Ref<ExperimentSummary[]>;
11
+ total: Ref<number>;
12
+ selectedExperiment: Ref<ExperimentSummary | null>;
13
+ filters: ExperimentFilters;
14
+ isLoading: Ref<boolean>;
15
+ error: Ref<string | null>;
16
+ page: Ref<number>;
17
+ hasMore: ComputedRef<boolean>;
18
+ sortKey: Ref<string>;
19
+ experimentTypes: Ref<ExperimentTypeOption[]>;
20
+ projects: Ref<SelectOption<string>[]>;
21
+ groupedByProject: ComputedRef<[string, ExperimentSummary[]][]>;
22
+ fetch: () => Promise<void>;
23
+ loadMore: () => Promise<void>;
24
+ reset: () => void;
25
+ select: (experiment: ExperimentSummary) => void;
26
+ clear: () => void;
27
+ fetchFilterOptions: () => Promise<void>;
28
+ }
29
+ /** Fetches a paginated, filtered experiment list from the platform API for picker and selector UIs. */
30
+ export declare function useExperimentSelector(options?: UseExperimentSelectorOptions): UseExperimentSelectorReturn;