@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,92 @@
1
+ import { Ref } from 'vue';
2
+ /**
3
+ * Validation rule function type.
4
+ * Returns error message string if invalid, undefined/null if valid.
5
+ */
6
+ export type ValidationRule<T = unknown> = (value: T, formData: Record<string, unknown>) => string | undefined | null;
7
+ /**
8
+ * Field validation rules configuration.
9
+ */
10
+ export interface FieldRules<T = unknown> {
11
+ required?: boolean | string;
12
+ minLength?: number | {
13
+ value: number;
14
+ message: string;
15
+ };
16
+ maxLength?: number | {
17
+ value: number;
18
+ message: string;
19
+ };
20
+ min?: number | {
21
+ value: number;
22
+ message: string;
23
+ };
24
+ max?: number | {
25
+ value: number;
26
+ message: string;
27
+ };
28
+ pattern?: RegExp | {
29
+ value: RegExp;
30
+ message: string;
31
+ };
32
+ email?: boolean | string;
33
+ custom?: ValidationRule<T> | ValidationRule<T>[];
34
+ }
35
+ /**
36
+ * Field validation rules configuration.
37
+ */
38
+ export interface FieldState {
39
+ value: unknown;
40
+ error: string | null;
41
+ touched: boolean;
42
+ dirty: boolean;
43
+ }
44
+ /**
45
+ * Form state and methods.
46
+ */
47
+ export interface UseFormReturn<T extends Record<string, unknown>> {
48
+ data: T;
49
+ errors: Record<string, string | null>;
50
+ touched: Record<string, boolean>;
51
+ dirty: Record<string, boolean>;
52
+ isValid: Ref<boolean>;
53
+ isDirty: Ref<boolean>;
54
+ isSubmitting: Ref<boolean>;
55
+ setFieldValue: <K extends keyof T>(field: K, value: T[K]) => void;
56
+ setFieldError: (field: string, error: string | null) => void;
57
+ setFieldTouched: (field: string, touched?: boolean) => void;
58
+ validateField: (field: string) => boolean;
59
+ validate: () => boolean;
60
+ reset: (values?: Partial<T>) => void;
61
+ handleSubmit: (onSubmit: (data: T) => Promise<void> | void) => (e?: Event) => Promise<void>;
62
+ getFieldProps: <K extends keyof T>(field: K) => {
63
+ modelValue: T[K];
64
+ 'onUpdate:modelValue': (value: T[K]) => void;
65
+ onBlur: () => void;
66
+ error: string | null;
67
+ };
68
+ }
69
+ /**
70
+ * Form state management composable with validation.
71
+ *
72
+ * @param initialValues - Initial form values
73
+ * @param rules - Validation rules for each field
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * const { data, errors, isValid, handleSubmit, getFieldProps } = useForm(
78
+ * { email: '', password: '' },
79
+ * {
80
+ * email: { required: true, email: true },
81
+ * password: { required: true, minLength: 8 },
82
+ * }
83
+ * )
84
+ *
85
+ * // In template
86
+ * <BaseInput v-bind="getFieldProps('email')" label="Email" />
87
+ * <BaseInput v-bind="getFieldProps('password')" type="password" label="Password" />
88
+ * <BaseButton @click="handleSubmit(onSubmit)" :disabled="!isValid">Submit</BaseButton>
89
+ * ```
90
+ */
91
+ /** Reactive form state with field-level validation, dirty tracking, and submit handling. */
92
+ export declare function useForm<T extends Record<string, unknown>>(initialValues: T, rules?: Partial<Record<keyof T, FieldRules>>): UseFormReturn<T>;
@@ -0,0 +1,24 @@
1
+ import { FormSchema, FieldCondition, FormEnhancements, UseFormBuilderReturn } from '../types/form-builder';
2
+ /**
3
+ * Evaluate a JSON-serializable field condition against the current form data.
4
+ *
5
+ * Supports logical operators (`and`, `or`, `not`) and comparison operators
6
+ * (`eq`, `neq`, `gt`, `lt`, `gte`, `lte`, `in`, `notIn`, `truthy`, `falsy`,
7
+ * `contains`). Returns `true` if the condition passes.
8
+ */
9
+ export declare function evaluateCondition(condition: FieldCondition, data: Record<string, unknown>): boolean;
10
+ /**
11
+ * Drive a `FormSchema` as reactive form state.
12
+ *
13
+ * Builds initial values from schema defaults and `initialData`, derives
14
+ * validation rules from `FieldValidation` descriptors and enhancement
15
+ * validators, evaluates `FieldCondition` expressions for field/section
16
+ * visibility, and wires wizard step navigation when `schema.steps` is set.
17
+ *
18
+ * @param schema - Declarative form or wizard schema.
19
+ * @param initialData - Values that override schema defaults.
20
+ * @param enhancements - TypeScript-only callbacks (dynamic options, validators,
21
+ * submit handler, transform, field-change watcher).
22
+ */
23
+ /** Drives a declarative FormSchema as reactive state with conditional fields, wizard steps, and validation. */
24
+ export declare function useFormBuilder<T extends Record<string, unknown> = Record<string, unknown>>(schema: FormSchema, initialData?: Partial<T>, enhancements?: FormEnhancements<T>): UseFormBuilderReturn<T>;
@@ -0,0 +1,10 @@
1
+ import { CredentialInfo } from '../types';
2
+ /** Registers and authenticates passkeys using WebAuthn, lazily loading the browser dependency. */
3
+ export declare function usePasskey(): {
4
+ isSupported: () => Promise<boolean>;
5
+ registerPasskey: (deviceName?: string) => Promise<boolean>;
6
+ loginWithPasskey: () => Promise<boolean>;
7
+ listCredentials: () => Promise<CredentialInfo[]>;
8
+ deleteCredential: (credentialId: string) => Promise<boolean>;
9
+ deleteAllCredentials: () => Promise<boolean>;
10
+ };
@@ -0,0 +1,131 @@
1
+ import { PlatformContext, PlatformContextOptions, PlatformEvent } from '../types';
2
+ /**
3
+ * Platform context composable for plugin integration with MLD Platform.
4
+ *
5
+ * Provides secure communication with the parent platform via postMessage.
6
+ *
7
+ * @param options - Configuration options
8
+ * @param options.allowedOrigins - List of allowed origins for postMessage
9
+ * @param options.allowAnyOrigin - Allow any origin (UNSAFE, development only)
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * // Basic usage - derives origin from platform injection
14
+ * const { isIntegrated, user, theme } = usePlatformContext()
15
+ *
16
+ * // With explicit allowed origins
17
+ * const { isIntegrated } = usePlatformContext({
18
+ * allowedOrigins: ['https://mld.example.com']
19
+ * })
20
+ *
21
+ * // Development mode (UNSAFE)
22
+ * const { isIntegrated } = usePlatformContext({
23
+ * allowAnyOrigin: import.meta.env.DEV
24
+ * })
25
+ * ```
26
+ */
27
+ /** Connects a plugin to the MLD platform via postMessage, exposing user, theme, and experiment context. */
28
+ export declare function usePlatformContext(options?: PlatformContextOptions): {
29
+ context: import('vue').Ref<{
30
+ isIntegrated: boolean;
31
+ plugin?: {
32
+ id: string;
33
+ name: string;
34
+ version: string;
35
+ description?: string | undefined;
36
+ icon?: string | undefined;
37
+ route_prefix: string;
38
+ api_prefix: string;
39
+ nav_items?: {
40
+ id: string;
41
+ label: string;
42
+ path: string;
43
+ icon?: string | undefined;
44
+ children?: /*elided*/ any[] | undefined;
45
+ }[] | undefined;
46
+ settings?: import('..').PluginSettings | undefined;
47
+ } | undefined;
48
+ platformApiUrl?: string | undefined;
49
+ platformOrigin?: string | undefined;
50
+ user?: {
51
+ id: string;
52
+ username: string;
53
+ role: string;
54
+ shortname?: string | undefined;
55
+ } | undefined;
56
+ theme: "light" | "dark" | "system";
57
+ allowedExperimentTypes?: string[] | null | undefined;
58
+ features?: {
59
+ experiments?: boolean | undefined;
60
+ passkey?: boolean | undefined;
61
+ multiUser?: boolean | undefined;
62
+ } | undefined;
63
+ }, PlatformContext | {
64
+ isIntegrated: boolean;
65
+ plugin?: {
66
+ id: string;
67
+ name: string;
68
+ version: string;
69
+ description?: string | undefined;
70
+ icon?: string | undefined;
71
+ route_prefix: string;
72
+ api_prefix: string;
73
+ nav_items?: {
74
+ id: string;
75
+ label: string;
76
+ path: string;
77
+ icon?: string | undefined;
78
+ children?: /*elided*/ any[] | undefined;
79
+ }[] | undefined;
80
+ settings?: import('..').PluginSettings | undefined;
81
+ } | undefined;
82
+ platformApiUrl?: string | undefined;
83
+ platformOrigin?: string | undefined;
84
+ user?: {
85
+ id: string;
86
+ username: string;
87
+ role: string;
88
+ shortname?: string | undefined;
89
+ } | undefined;
90
+ theme: "light" | "dark" | "system";
91
+ allowedExperimentTypes?: string[] | null | undefined;
92
+ features?: {
93
+ experiments?: boolean | undefined;
94
+ passkey?: boolean | undefined;
95
+ multiUser?: boolean | undefined;
96
+ } | undefined;
97
+ }>;
98
+ isIntegrated: import('vue').ComputedRef<boolean>;
99
+ plugin: import('vue').ComputedRef<{
100
+ id: string;
101
+ name: string;
102
+ version: string;
103
+ description?: string | undefined;
104
+ icon?: string | undefined;
105
+ route_prefix: string;
106
+ api_prefix: string;
107
+ nav_items?: {
108
+ id: string;
109
+ label: string;
110
+ path: string;
111
+ icon?: string | undefined;
112
+ children?: /*elided*/ any[] | undefined;
113
+ }[] | undefined;
114
+ settings?: import('..').PluginSettings | undefined;
115
+ } | undefined>;
116
+ user: import('vue').ComputedRef<{
117
+ id: string;
118
+ username: string;
119
+ role: string;
120
+ shortname?: string | undefined;
121
+ } | undefined>;
122
+ theme: import('vue').ComputedRef<"light" | "dark" | "system">;
123
+ features: import('vue').ComputedRef<{
124
+ experiments?: boolean | undefined;
125
+ passkey?: boolean | undefined;
126
+ multiUser?: boolean | undefined;
127
+ } | undefined>;
128
+ navigate: (path: string) => void;
129
+ notify: (message: string, type?: "success" | "error" | "warning" | "info") => void;
130
+ sendToPlatform: (event: PlatformEvent) => void;
131
+ };
@@ -0,0 +1,29 @@
1
+ export interface UsePluginApiOptions {
2
+ /**
3
+ * Fallback API prefix when `VITE_API_PREFIX` is not set.
4
+ * Typically your plugin's route prefix, e.g. `'/api/drp'`.
5
+ */
6
+ fallbackPrefix?: string;
7
+ }
8
+ /**
9
+ * Pre-configured API client for plugins.
10
+ *
11
+ * Resolves the base URL in priority order:
12
+ * 1. `import.meta.env.VITE_API_PREFIX` (build-time env override)
13
+ * 2. `fallbackPrefix` option (plugin's route prefix)
14
+ * 3. `'/api'` (default)
15
+ *
16
+ * Eliminates the repeated pattern across plugins:
17
+ * ```ts
18
+ * const API_BASE = import.meta.env.VITE_API_PREFIX || '/api/my-plugin'
19
+ * const api = useApi({ baseUrl: API_BASE })
20
+ * ```
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * const api = usePluginApi({ fallbackPrefix: '/api/drp' })
25
+ * const data = await api.get('/sessions')
26
+ * ```
27
+ */
28
+ /** Pre-configured API client resolving the plugin base URL from VITE_API_PREFIX or a fallback prefix. */
29
+ export declare function usePluginApi(options?: UsePluginApiOptions): import('./useApi').UseApiReturn;
@@ -0,0 +1,13 @@
1
+ import { Ref, ComputedRef } from 'vue';
2
+ export interface UsePluginConfigReturn {
3
+ config: Ref<Record<string, unknown>>;
4
+ isLoading: Ref<boolean>;
5
+ isSaving: Ref<boolean>;
6
+ error: Ref<string | null>;
7
+ isDirty: ComputedRef<boolean>;
8
+ load: () => Promise<void>;
9
+ save: () => Promise<boolean>;
10
+ reset: () => void;
11
+ }
12
+ /** Loads, saves, and tracks dirty state for a plugin's persistent configuration via the platform API. */
13
+ export declare function usePluginConfig(pluginName?: string): UsePluginConfigReturn;
@@ -0,0 +1,44 @@
1
+ import { Ref, ComputedRef } from 'vue';
2
+ import { ProtocolStep, ProtocolStepType } from '../types';
3
+ export interface ParameterDefinition {
4
+ key: string;
5
+ label: string;
6
+ type: 'number' | 'text' | 'select' | 'concentration' | 'temperature' | 'duration' | 'reagent';
7
+ unit?: string;
8
+ options?: Array<{
9
+ value: string;
10
+ label: string;
11
+ }>;
12
+ required?: boolean;
13
+ default?: unknown;
14
+ min?: number;
15
+ max?: number;
16
+ placeholder?: string;
17
+ }
18
+ export interface StepTemplate {
19
+ id: string;
20
+ type: ProtocolStepType;
21
+ name: string;
22
+ description?: string;
23
+ defaultDuration?: number;
24
+ parameters: ParameterDefinition[];
25
+ isBuiltIn?: boolean;
26
+ }
27
+ export interface ValidationResult {
28
+ valid: boolean;
29
+ errors: Record<string, string>;
30
+ }
31
+ export interface UseProtocolTemplatesReturn {
32
+ builtInTemplates: StepTemplate[];
33
+ customTemplates: Ref<StepTemplate[]>;
34
+ allTemplates: ComputedRef<StepTemplate[]>;
35
+ getTemplateByType: (type: ProtocolStepType) => StepTemplate | undefined;
36
+ getTemplateById: (id: string) => StepTemplate | undefined;
37
+ saveCustomTemplate: (template: StepTemplate) => void;
38
+ deleteCustomTemplate: (templateId: string) => void;
39
+ validateStep: (step: ProtocolStep, template: StepTemplate) => ValidationResult;
40
+ createStepFromTemplate: (template: StepTemplate, overrides?: Partial<ProtocolStep>) => ProtocolStep;
41
+ formatParameterValue: (value: unknown, param: ParameterDefinition) => string;
42
+ }
43
+ /** Provides built-in and custom protocol step templates with validation and step creation helpers. */
44
+ export declare function useProtocolTemplates(): UseProtocolTemplatesReturn;
@@ -0,0 +1,31 @@
1
+ import { Ref, ComputedRef } from 'vue';
2
+ import { Rack, WellPlateFormat, Well } from '../types';
3
+ export interface UseRackEditorOptions {
4
+ defaultFormat?: WellPlateFormat;
5
+ defaultInjectionVolume?: number;
6
+ maxRacks?: number;
7
+ minRacks?: number;
8
+ }
9
+ export interface UseRackEditorReturn {
10
+ racks: Ref<Rack[]>;
11
+ activeRack: ComputedRef<Rack | undefined>;
12
+ activeRackId: Ref<string>;
13
+ addRack(name?: string): Rack;
14
+ removeRack(rackId: string): void;
15
+ reorderRacks(fromIndex: number, toIndex: number): void;
16
+ updateRack(rackId: string, data: Partial<Rack>): void;
17
+ setActiveRack(rackId: string): void;
18
+ setWellData(rackId: string, wellId: string, data: Partial<Well>): void;
19
+ clearWell(rackId: string, wellId: string): void;
20
+ clearAllWells(rackId: string): void;
21
+ fillSeries(rackId: string, prefix?: string): void;
22
+ getAllWells(): Array<{
23
+ rackId: string;
24
+ wellId: string;
25
+ well: Partial<Well>;
26
+ }>;
27
+ totalSampleCount: ComputedRef<number>;
28
+ reset(): void;
29
+ }
30
+ /** Manages a set of sample racks with well-level assignment, series fill, and multi-rack reordering. */
31
+ export declare function useRackEditor(initialRacks?: Rack[], options?: UseRackEditorOptions): UseRackEditorReturn;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Composable for generating dilution series used in plate-based experiments.
3
+ * Provides geometric series generation from presets (2x, 3x, ½ log, 10x)
4
+ * and utility functions for series manipulation.
5
+ */
6
+ export interface LevelEntry {
7
+ value: number;
8
+ replicates: number;
9
+ }
10
+ export interface DilutionPreset {
11
+ label: string;
12
+ factor: number | 'half-log';
13
+ }
14
+ export declare const DEFAULT_PRESETS: DilutionPreset[];
15
+ export declare const DEFAULT_UNITS: string[];
16
+ export declare function generateDilutionSeries(startConcentration: number, count: number, factor: number | 'half-log', defaultReplicates?: number): LevelEntry[];
17
+ export interface UseReagentSeriesReturn {
18
+ generateSeries: (start: number, count: number, factor: number | 'half-log', defaultReplicates?: number) => LevelEntry[];
19
+ sortLevels: (levels: LevelEntry[], order?: 'asc' | 'desc') => LevelEntry[];
20
+ totalPositions: (levels: LevelEntry[]) => number;
21
+ }
22
+ /** Generates and sorts geometric dilution series (2x, 3x, ½ log, 10x) for plate-based experiments. */
23
+ export declare function useReagentSeries(): UseReagentSeriesReturn;
@@ -0,0 +1,78 @@
1
+ import { Ref } from 'vue';
2
+ import { ScheduleEvent } from '../types/components';
3
+ export type DragType = 'create' | 'resize-top' | 'resize-bottom' | 'move';
4
+ export interface DragState {
5
+ type: DragType;
6
+ event?: ScheduleEvent;
7
+ startDate: Date;
8
+ startY: number;
9
+ currentY: number;
10
+ dayIndex: number;
11
+ currentDayIndex: number;
12
+ }
13
+ export interface GhostEvent {
14
+ start: Date;
15
+ end: Date;
16
+ dayIndex: number;
17
+ style: Record<string, string>;
18
+ }
19
+ export interface UseScheduleDragOptions {
20
+ slotDuration: Ref<number>;
21
+ dayStartHour: Ref<number>;
22
+ dayEndHour: Ref<number>;
23
+ readonly: Ref<boolean>;
24
+ slotHeight: Ref<number>;
25
+ blockedSlots?: Ref<{
26
+ start: string;
27
+ end: string;
28
+ label?: string;
29
+ }[]>;
30
+ onCreateComplete?: (start: Date, end: Date) => void;
31
+ onMoveComplete?: (event: ScheduleEvent, newStart: Date, newEnd: Date) => void;
32
+ onResizeComplete?: (event: ScheduleEvent, newStart: Date, newEnd: Date) => void;
33
+ }
34
+ /** Handles pointer-driven create, move, and resize drag interactions for the ScheduleCalendar grid. */
35
+ export declare function useScheduleDrag(options: UseScheduleDragOptions): {
36
+ isDragging: Ref<boolean, boolean>;
37
+ dragState: Ref<{
38
+ type: DragType;
39
+ event?: {
40
+ id: string;
41
+ start: string;
42
+ end: string;
43
+ title: string;
44
+ color?: string | undefined;
45
+ status?: import('..').ScheduleEventStatus | undefined;
46
+ draggable?: boolean | undefined;
47
+ resizable?: boolean | undefined;
48
+ metadata?: Record<string, unknown> | undefined;
49
+ } | undefined;
50
+ startDate: Date;
51
+ startY: number;
52
+ currentY: number;
53
+ dayIndex: number;
54
+ currentDayIndex: number;
55
+ } | null, DragState | {
56
+ type: DragType;
57
+ event?: {
58
+ id: string;
59
+ start: string;
60
+ end: string;
61
+ title: string;
62
+ color?: string | undefined;
63
+ status?: import('..').ScheduleEventStatus | undefined;
64
+ draggable?: boolean | undefined;
65
+ resizable?: boolean | undefined;
66
+ metadata?: Record<string, unknown> | undefined;
67
+ } | undefined;
68
+ startDate: Date;
69
+ startY: number;
70
+ currentY: number;
71
+ dayIndex: number;
72
+ currentDayIndex: number;
73
+ } | null>;
74
+ ghost: import('vue').ComputedRef<GhostEvent | null>;
75
+ startCreate: (date: Date, y: number, dayIndex: number) => void;
76
+ startMove: (event: ScheduleEvent, y: number, dayIndex: number) => void;
77
+ startResize: (event: ScheduleEvent, edge: "top" | "bottom", y: number, dayIndex: number) => void;
78
+ };
@@ -0,0 +1,14 @@
1
+ export type SequenceType = 'dna' | 'rna' | 'protein' | 'auto';
2
+ export interface SequenceStats {
3
+ length: number;
4
+ gcPercent?: number;
5
+ molecularWeight?: number;
6
+ }
7
+ /** Detects, validates, cleans, and computes stats (GC%, MW) for DNA, RNA, and protein sequences. */
8
+ export declare function useSequenceUtils(): {
9
+ detectSequenceType: (seq: string) => "dna" | "rna" | "protein";
10
+ validateSequence: (seq: string, type: SequenceType) => string;
11
+ reverseComplement: (seq: string, type: "dna" | "rna") => string;
12
+ calculateStats: (seq: string, type: "dna" | "rna" | "protein") => SequenceStats;
13
+ formatFasta: (seq: string, lineWidth?: number) => string;
14
+ };
@@ -0,0 +1,8 @@
1
+ import { Ref } from 'vue';
2
+ export interface UseThemeReturn {
3
+ isDark: Ref<boolean>;
4
+ toggleTheme: () => void;
5
+ setTheme: (theme: 'light' | 'dark') => void;
6
+ }
7
+ /** Reads and toggles the active theme (light/dark/system) with reactivity to OS preference changes. */
8
+ export declare function useTheme(): UseThemeReturn;
@@ -0,0 +1,29 @@
1
+ import { TimeRange } from '../types/components';
2
+ export declare function parseTime(time: string): {
3
+ hour: number;
4
+ minute: number;
5
+ };
6
+ export declare function formatTime(hour: number, minute: number, format?: '12h' | '24h'): string;
7
+ export declare function generateTimeSlots(start: string, end: string, stepMinutes: number): string[];
8
+ export declare function rangesOverlap(a: TimeRange, b: TimeRange): boolean;
9
+ export declare function durationMinutes(start: string, end: string): number;
10
+ export declare function formatDuration(minutes: number): string;
11
+ export declare function isTimeInRange(time: string, start: string, end: string): boolean;
12
+ export declare function findAvailableSlots(dayStart: string, dayEnd: string, occupied: TimeRange[], minDuration: number): TimeRange[];
13
+ export declare function snapToSlot(time: string, stepMinutes: number): string;
14
+ export declare function addMinutes(time: string, minutes: number): string;
15
+ export declare function compareTime(a: string, b: string): number;
16
+ /** Time utility helpers for parsing, formatting, comparing, and snapping HH:MM strings. */
17
+ export declare function useTimeUtils(): {
18
+ parseTime: typeof parseTime;
19
+ formatTime: typeof formatTime;
20
+ generateTimeSlots: typeof generateTimeSlots;
21
+ rangesOverlap: typeof rangesOverlap;
22
+ durationMinutes: typeof durationMinutes;
23
+ formatDuration: typeof formatDuration;
24
+ isTimeInRange: typeof isTimeInRange;
25
+ findAvailableSlots: typeof findAvailableSlots;
26
+ snapToSlot: typeof snapToSlot;
27
+ addMinutes: typeof addMinutes;
28
+ compareTime: typeof compareTime;
29
+ };
@@ -0,0 +1,22 @@
1
+ import { Toast } from '../types';
2
+ /** Reactive global toast queue with success/error/warning/info variants and auto-dismiss timers. */
3
+ export declare function useToast(): {
4
+ toasts: import('vue').Ref<{
5
+ id: number;
6
+ message: string;
7
+ type: "success" | "error" | "warning" | "info";
8
+ duration?: number | undefined;
9
+ }[], Toast[] | {
10
+ id: number;
11
+ message: string;
12
+ type: "success" | "error" | "warning" | "info";
13
+ duration?: number | undefined;
14
+ }[]>;
15
+ show: (message: string, type?: Toast["type"], duration?: number) => void;
16
+ success: (message: string, duration?: number) => void;
17
+ error: (message: string, duration?: number) => void;
18
+ warning: (message: string, duration?: number) => void;
19
+ info: (message: string, duration?: number) => void;
20
+ dismiss: (id: number) => void;
21
+ clear: () => void;
22
+ };
@@ -0,0 +1,33 @@
1
+ import { ComputedRef } from 'vue';
2
+ import { PlateMapEditorState, PlateMap, SampleType, WellPlateFormat } from '../types';
3
+ export interface UseWellPlateEditorOptions {
4
+ maxHistory?: number;
5
+ defaultFormat?: WellPlateFormat;
6
+ }
7
+ export interface UseWellPlateEditorReturn {
8
+ state: ComputedRef<PlateMapEditorState>;
9
+ plates: ComputedRef<PlateMap[]>;
10
+ activePlate: ComputedRef<PlateMap | undefined>;
11
+ samples: ComputedRef<SampleType[]>;
12
+ selectedWells: ComputedRef<string[]>;
13
+ activeSampleId: ComputedRef<string | undefined>;
14
+ canUndo: ComputedRef<boolean>;
15
+ canRedo: ComputedRef<boolean>;
16
+ setActivePlate: (plateId: string) => void;
17
+ setActiveSample: (sampleId: string | undefined) => void;
18
+ setSelectedWells: (wellIds: string[]) => void;
19
+ addPlate: (name?: string, format?: WellPlateFormat) => PlateMap;
20
+ removePlate: (plateId: string) => void;
21
+ addSample: (name: string, color?: string) => SampleType;
22
+ removeSample: (sampleId: string) => void;
23
+ assignSample: (wellIds: string[], sampleId: string | undefined) => void;
24
+ clearWells: (wellIds: string[]) => void;
25
+ undo: () => void;
26
+ redo: () => void;
27
+ exportData: (format: 'json' | 'csv') => string;
28
+ importData: (data: string, format: 'json' | 'csv') => boolean;
29
+ loadState: (state: Partial<PlateMapEditorState>) => void;
30
+ reset: () => void;
31
+ }
32
+ /** Manages multi-plate well-plate state with sample assignment, selection, and undo/redo history. */
33
+ export declare function useWellPlateEditor(initialState?: Partial<PlateMapEditorState>, options?: UseWellPlateEditorOptions): UseWellPlateEditorReturn;