@morscherlab/mint-sdk 1.0.0-beta.1 → 1.0.0-beta.3

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 (421) hide show
  1. package/README.md +218 -6
  2. package/dist/__tests__/components/ActionItem.test.d.ts +1 -0
  3. package/dist/__tests__/components/AppAvatarMenu.test.d.ts +1 -0
  4. package/dist/__tests__/components/AppPageSelector.test.d.ts +1 -0
  5. package/dist/__tests__/components/AppPillNav.test.d.ts +1 -0
  6. package/dist/__tests__/components/AppPluginSwitcher.test.d.ts +1 -0
  7. package/dist/__tests__/components/AppToastContainer.test.d.ts +1 -0
  8. package/dist/__tests__/components/BaseRadioGroup.test.d.ts +1 -0
  9. package/dist/__tests__/components/BaseSelect.test.d.ts +1 -0
  10. package/dist/__tests__/components/BaseTabs.test.d.ts +1 -0
  11. package/dist/__tests__/components/BatchProgressList.test.d.ts +1 -0
  12. package/dist/__tests__/components/BioTemplateExperimentWorkspaceView.test.d.ts +1 -0
  13. package/dist/__tests__/components/BioTemplatePackWorkspaceView.test.d.ts +1 -0
  14. package/dist/__tests__/components/BioTemplatePresetWorkspaceView.test.d.ts +1 -0
  15. package/dist/__tests__/components/BioTemplateRenderer.test.d.ts +1 -0
  16. package/dist/__tests__/components/Breadcrumb.test.d.ts +1 -0
  17. package/dist/__tests__/components/CalendarGridPanel.test.d.ts +1 -0
  18. package/dist/__tests__/components/ConcentrationInput.test.d.ts +1 -0
  19. package/dist/__tests__/components/ControlWorkspaceView.test.d.ts +1 -0
  20. package/dist/__tests__/components/DatePicker.test.d.ts +1 -0
  21. package/dist/__tests__/components/DateTimePicker.test.d.ts +1 -0
  22. package/dist/__tests__/components/EmptyState.test.d.ts +1 -0
  23. package/dist/__tests__/components/ExperimentPopover.test.d.ts +1 -0
  24. package/dist/__tests__/components/FormBuilder.test.d.ts +1 -0
  25. package/dist/__tests__/components/FormCompatibility.test.d.ts +1 -0
  26. package/dist/__tests__/components/GroupAssigner.test.d.ts +1 -0
  27. package/dist/__tests__/components/GroupingModal.test.d.ts +1 -0
  28. package/dist/__tests__/components/MultiSelect.test.d.ts +1 -0
  29. package/dist/__tests__/components/PluginIcon.test.d.ts +1 -0
  30. package/dist/__tests__/components/ProtocolStepEditor.test.d.ts +1 -0
  31. package/dist/__tests__/components/ReagentList.test.d.ts +1 -0
  32. package/dist/__tests__/components/SampleHierarchyTree.test.d.ts +1 -0
  33. package/dist/__tests__/components/SampleSelector.test.d.ts +1 -0
  34. package/dist/__tests__/components/SegmentedControl.test.d.ts +1 -0
  35. package/dist/__tests__/components/SettingsButton.test.d.ts +1 -0
  36. package/dist/__tests__/components/SettingsModal.test.d.ts +1 -0
  37. package/dist/__tests__/components/TagsInput.test.d.ts +1 -0
  38. package/dist/__tests__/components/ThemeToggle.test.d.ts +1 -0
  39. package/dist/__tests__/components/TimePicker.test.d.ts +1 -0
  40. package/dist/__tests__/composables/useBioTemplatePackWorkspace.test.d.ts +1 -0
  41. package/dist/__tests__/composables/useBioTemplatePresetWorkspace.test.d.ts +1 -0
  42. package/dist/__tests__/composables/useBioTemplateWorkspace.test.d.ts +1 -0
  43. package/dist/__tests__/composables/useCalendarGrid.test.d.ts +1 -0
  44. package/dist/__tests__/composables/useControlSchema.test.d.ts +1 -0
  45. package/dist/__tests__/composables/useDebouncedWatch.test.d.ts +1 -0
  46. package/dist/__tests__/composables/useDropdownState.test.d.ts +1 -0
  47. package/dist/__tests__/composables/useEventListener.test.d.ts +1 -0
  48. package/dist/__tests__/composables/useExpansionSet.test.d.ts +1 -0
  49. package/dist/__tests__/composables/useExperimentData.test.d.ts +1 -0
  50. package/dist/__tests__/composables/useExperimentSelector.test.d.ts +1 -0
  51. package/dist/__tests__/composables/useGroupAssignment.test.d.ts +1 -0
  52. package/dist/__tests__/composables/useListSelection.test.d.ts +1 -0
  53. package/dist/__tests__/composables/usePluginClient.test.d.ts +1 -0
  54. package/dist/__tests__/composables/usePluginConfig.test.d.ts +1 -0
  55. package/dist/__tests__/composables/useRequestSyncState.test.d.ts +1 -0
  56. package/dist/__tests__/composables/useSampleGroups.test.d.ts +1 -0
  57. package/dist/__tests__/composables/useSelectionLimit.test.d.ts +1 -0
  58. package/dist/__tests__/composables/useSortedItems.test.d.ts +1 -0
  59. package/dist/__tests__/composables/useTemplateCollection.test.d.ts +1 -0
  60. package/dist/__tests__/composables/useTextSearch.test.d.ts +1 -0
  61. package/dist/__tests__/composables/useTheme.test.d.ts +1 -0
  62. package/dist/__tests__/composables/useTimeUtils.test.d.ts +1 -0
  63. package/dist/__tests__/docs/frontendDocsCatalog.test.d.ts +1 -0
  64. package/dist/__tests__/templates/templates.test.d.ts +1 -0
  65. package/dist/{auth-DsI0rQ7_.js → auth-QQj2kkze.js} +12 -5
  66. package/dist/auth-QQj2kkze.js.map +1 -0
  67. package/dist/components/ActionItem.vue.d.ts +32 -0
  68. package/dist/components/AppAvatarMenu.vue.d.ts +2 -7
  69. package/dist/components/AppPageSelector.vue.d.ts +3 -6
  70. package/dist/components/AppPillNav.vue.d.ts +2 -2
  71. package/dist/components/AppSidebar.vue.d.ts +56 -3
  72. package/dist/components/AppToastContainer.vue.d.ts +2 -0
  73. package/dist/components/AppTopBar.vue.d.ts +43 -10
  74. package/dist/components/BaseButton.vue.d.ts +2 -2
  75. package/dist/components/BaseCheckbox.vue.d.ts +1 -1
  76. package/dist/components/BaseInput.vue.d.ts +2 -2
  77. package/dist/components/BasePill.vue.d.ts +3 -3
  78. package/dist/components/BaseRadioGroup.vue.d.ts +4 -4
  79. package/dist/components/BaseSelect.vue.d.ts +4 -4
  80. package/dist/components/BaseSlider.vue.d.ts +1 -1
  81. package/dist/components/BaseTabs.vue.d.ts +2 -2
  82. package/dist/components/BaseTextarea.vue.d.ts +2 -2
  83. package/dist/components/BaseToggle.vue.d.ts +1 -1
  84. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +117 -0
  85. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +92 -0
  86. package/dist/components/BioTemplatePresetWorkspaceView.vue.d.ts +82 -0
  87. package/dist/components/BioTemplateRenderer.vue.d.ts +29 -0
  88. package/dist/components/Breadcrumb.vue.d.ts +2 -2
  89. package/dist/components/Calendar.vue.d.ts +1 -1
  90. package/dist/components/CalendarGridPanel.vue.d.ts +25 -0
  91. package/dist/components/CollapsibleCard.vue.d.ts +1 -1
  92. package/dist/components/ColorSlider.vue.d.ts +1 -1
  93. package/dist/components/ConcentrationInput.vue.d.ts +2 -2
  94. package/dist/components/ConfirmDialog.vue.d.ts +2 -2
  95. package/dist/components/ControlWorkspaceView.vue.d.ts +130 -0
  96. package/dist/components/DatePicker.vue.d.ts +2 -2
  97. package/dist/components/DateTimePicker.vue.d.ts +3 -3
  98. package/dist/components/DropdownButton.vue.d.ts +4 -4
  99. package/dist/components/EmptyState.vue.d.ts +1 -2
  100. package/dist/components/ExperimentDataViewer.vue.d.ts +1 -1
  101. package/dist/components/ExperimentTimeline.vue.d.ts +2 -2
  102. package/dist/components/FileUploader.vue.d.ts +2 -2
  103. package/dist/components/FitPanel.vue.d.ts +1 -1
  104. package/dist/components/FormActions.vue.d.ts +4 -4
  105. package/dist/components/FormBuilder.vue.d.ts +22 -8
  106. package/dist/components/FormFieldRenderer.vue.d.ts +7 -10
  107. package/dist/components/FormSection.vue.d.ts +11 -24
  108. package/dist/components/FormulaInput.vue.d.ts +2 -2
  109. package/dist/components/IconButton.vue.d.ts +1 -1
  110. package/dist/components/LoadingSpinner.vue.d.ts +1 -1
  111. package/dist/components/MoleculeInput.vue.d.ts +2 -2
  112. package/dist/components/MultiSelect.vue.d.ts +3 -3
  113. package/dist/components/NumberInput.vue.d.ts +2 -2
  114. package/dist/components/PluginIcon.vue.d.ts +11 -0
  115. package/dist/components/ProgressBar.vue.d.ts +2 -2
  116. package/dist/components/ProtocolStepEditor.vue.d.ts +3 -1
  117. package/dist/components/RackEditor.vue.d.ts +2 -2
  118. package/dist/components/ReagentEditor.vue.d.ts +1 -1
  119. package/dist/components/ResourceCard.vue.d.ts +1 -1
  120. package/dist/components/SampleLegend.vue.d.ts +2 -2
  121. package/dist/components/SampleSelector.vue.d.ts +1 -1
  122. package/dist/components/ScheduleCalendar.vue.d.ts +2 -2
  123. package/dist/components/ScientificNumber.vue.d.ts +1 -1
  124. package/dist/components/SegmentedControl.vue.d.ts +3 -3
  125. package/dist/components/SequenceInput.vue.d.ts +3 -3
  126. package/dist/components/SettingsButton.vue.d.ts +2 -2
  127. package/dist/components/SettingsModal.vue.d.ts +32 -4
  128. package/dist/components/StatusIndicator.vue.d.ts +1 -1
  129. package/dist/components/TagsInput.vue.d.ts +3 -2
  130. package/dist/components/TimePicker.vue.d.ts +3 -3
  131. package/dist/components/TimeRangeInput.vue.d.ts +2 -2
  132. package/dist/components/UnitInput.vue.d.ts +2 -2
  133. package/dist/components/WellPlate.vue.d.ts +8 -8
  134. package/dist/components/index.d.ts +12 -1
  135. package/dist/components/index.js +3 -3
  136. package/dist/components/internal/FormFieldRendererInternal.vue.d.ts +31 -0
  137. package/dist/components/internal/FormSectionRenderer.vue.d.ts +43 -0
  138. package/dist/{components-CzbQQPCb.js → components-D_Sr0adg.js} +9629 -8647
  139. package/dist/components-D_Sr0adg.js.map +1 -0
  140. package/dist/composables/index.d.ts +21 -2
  141. package/dist/composables/index.js +4 -3
  142. package/dist/composables/platformContextHelpers.d.ts +14 -0
  143. package/dist/composables/useBioTemplateComponents.d.ts +20 -0
  144. package/dist/composables/useBioTemplateControls.d.ts +6 -0
  145. package/dist/composables/useBioTemplatePackWorkspace.d.ts +45 -0
  146. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +74 -0
  147. package/dist/composables/useBioTemplateWorkspace.d.ts +50 -0
  148. package/dist/composables/useCalendarGrid.d.ts +26 -0
  149. package/dist/composables/useControlSchema.d.ts +321 -0
  150. package/dist/composables/useDebouncedWatch.d.ts +20 -0
  151. package/dist/composables/useDropdownState.d.ts +19 -0
  152. package/dist/composables/useEventListener.d.ts +13 -0
  153. package/dist/composables/useExpansionSet.d.ts +21 -0
  154. package/dist/composables/useExperimentData.d.ts +10 -0
  155. package/dist/composables/useExperimentSave.d.ts +31 -2
  156. package/dist/composables/useExperimentSelector.d.ts +20 -0
  157. package/dist/composables/useForm.d.ts +2 -0
  158. package/dist/composables/useGroupAssignment.d.ts +31 -0
  159. package/dist/composables/useListSelection.d.ts +35 -0
  160. package/dist/composables/usePlatformContext.d.ts +24 -3
  161. package/dist/composables/usePluginApi.d.ts +7 -14
  162. package/dist/composables/usePluginClient.d.ts +109 -0
  163. package/dist/composables/usePluginConfig.d.ts +12 -0
  164. package/dist/composables/useRequestSyncState.d.ts +34 -0
  165. package/dist/composables/useSampleGroups.d.ts +32 -0
  166. package/dist/composables/useSelectionLimit.d.ts +17 -0
  167. package/dist/composables/useSortedItems.d.ts +32 -0
  168. package/dist/composables/useTemplateCollection.d.ts +58 -0
  169. package/dist/composables/useTextSearch.d.ts +18 -0
  170. package/dist/composables/useTimeUtils.d.ts +8 -0
  171. package/dist/{composables-BXklV5ii.js → composables-C3dpXQN5.js} +228 -146
  172. package/dist/composables-C3dpXQN5.js.map +1 -0
  173. package/dist/index.d.ts +12 -3
  174. package/dist/index.js +6 -5
  175. package/dist/install.d.ts +7 -2
  176. package/dist/install.js +2 -2
  177. package/dist/install.js.map +1 -1
  178. package/dist/stores/auth.d.ts +1 -1
  179. package/dist/stores/index.js +1 -1
  180. package/dist/stores/settings.d.ts +4 -1
  181. package/dist/styles.css +5255 -5654
  182. package/dist/templates/adapters.d.ts +43 -0
  183. package/dist/templates/builders.d.ts +63 -0
  184. package/dist/templates/catalog.d.ts +188 -0
  185. package/dist/templates/componentBindings.d.ts +58 -0
  186. package/dist/templates/controlSchemas.d.ts +25 -0
  187. package/dist/templates/index.d.ts +15 -0
  188. package/dist/templates/index.js +2 -0
  189. package/dist/templates/lookup.d.ts +4 -0
  190. package/dist/templates/packs.d.ts +18 -0
  191. package/dist/templates/presets.d.ts +90 -0
  192. package/dist/templates/types.d.ts +531 -0
  193. package/dist/templates-50NPjaxL.js +9333 -0
  194. package/dist/templates-50NPjaxL.js.map +1 -0
  195. package/dist/types/components.d.ts +62 -1
  196. package/dist/types/form-builder.d.ts +6 -8
  197. package/dist/types/index.d.ts +2 -2
  198. package/dist/types/platform.d.ts +8 -1
  199. package/dist/useScheduleDrag-D4oWdh41.js +4371 -0
  200. package/dist/useScheduleDrag-D4oWdh41.js.map +1 -0
  201. package/dist/utils/formModelSync.d.ts +5 -0
  202. package/dist/utils/items.d.ts +8 -0
  203. package/dist/utils/options.d.ts +6 -0
  204. package/dist/utils/pluginIcon.d.ts +9 -0
  205. package/package.json +7 -2
  206. package/src/__tests__/components/ActionItem.test.ts +99 -0
  207. package/src/__tests__/components/AppAvatarMenu.test.ts +27 -0
  208. package/src/__tests__/components/AppPageSelector.test.ts +134 -0
  209. package/src/__tests__/components/AppPillNav.test.ts +78 -0
  210. package/src/__tests__/components/AppPluginSwitcher.test.ts +44 -0
  211. package/src/__tests__/components/AppSidebar.test.ts +370 -0
  212. package/src/__tests__/components/AppToastContainer.test.ts +48 -0
  213. package/src/__tests__/components/AppTopBar.test.ts +414 -13
  214. package/src/__tests__/components/BaseRadioGroup.test.ts +25 -0
  215. package/src/__tests__/components/BaseSelect.test.ts +21 -0
  216. package/src/__tests__/components/BaseTabs.test.ts +25 -0
  217. package/src/__tests__/components/BatchProgressList.test.ts +52 -0
  218. package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +153 -0
  219. package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +161 -0
  220. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +281 -0
  221. package/src/__tests__/components/BioTemplateRenderer.test.ts +71 -0
  222. package/src/__tests__/components/Breadcrumb.test.ts +23 -0
  223. package/src/__tests__/components/CalendarGridPanel.test.ts +36 -0
  224. package/src/__tests__/components/ConcentrationInput.test.ts +45 -0
  225. package/src/__tests__/components/ControlWorkspaceView.test.ts +1031 -0
  226. package/src/__tests__/components/DataFrame.test.ts +11 -0
  227. package/src/__tests__/components/DatePicker.test.ts +45 -0
  228. package/src/__tests__/components/DateTimePicker.test.ts +48 -0
  229. package/src/__tests__/components/DropdownButton.test.ts +23 -0
  230. package/src/__tests__/components/EmptyState.test.ts +23 -0
  231. package/src/__tests__/components/ExperimentPopover.test.ts +56 -0
  232. package/src/__tests__/components/FormBuilder.test.ts +296 -0
  233. package/src/__tests__/components/FormCompatibility.test.ts +94 -0
  234. package/src/__tests__/components/GroupAssigner.test.ts +30 -0
  235. package/src/__tests__/components/GroupingModal.test.ts +73 -0
  236. package/src/__tests__/components/MultiSelect.test.ts +48 -0
  237. package/src/__tests__/components/PluginIcon.test.ts +119 -0
  238. package/src/__tests__/components/ProtocolStepEditor.test.ts +33 -0
  239. package/src/__tests__/components/ReagentList.test.ts +82 -0
  240. package/src/__tests__/components/SampleHierarchyTree.test.ts +53 -0
  241. package/src/__tests__/components/SampleSelector.test.ts +60 -0
  242. package/src/__tests__/components/SegmentedControl.test.ts +24 -0
  243. package/src/__tests__/components/SettingsButton.test.ts +44 -0
  244. package/src/__tests__/components/SettingsModal.test.ts +296 -0
  245. package/src/__tests__/components/TagsInput.test.ts +75 -0
  246. package/src/__tests__/components/ThemeToggle.test.ts +47 -0
  247. package/src/__tests__/components/TimePicker.test.ts +38 -0
  248. package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +122 -0
  249. package/src/__tests__/composables/useBioTemplatePresetWorkspace.test.ts +199 -0
  250. package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +99 -0
  251. package/src/__tests__/composables/useCalendarGrid.test.ts +38 -0
  252. package/src/__tests__/composables/useControlSchema.test.ts +919 -0
  253. package/src/__tests__/composables/useDebouncedWatch.test.ts +93 -0
  254. package/src/__tests__/composables/useDropdownState.test.ts +95 -0
  255. package/src/__tests__/composables/useEventListener.test.ts +116 -0
  256. package/src/__tests__/composables/useExpansionSet.test.ts +62 -0
  257. package/src/__tests__/composables/useExperimentData.test.ts +4 -0
  258. package/src/__tests__/composables/useExperimentSave.test.ts +203 -8
  259. package/src/__tests__/composables/useExperimentSelector.test.ts +164 -0
  260. package/src/__tests__/composables/useForm.test.ts +58 -0
  261. package/src/__tests__/composables/useFormBuilder.test.ts +77 -0
  262. package/src/__tests__/composables/useGroupAssignment.test.ts +73 -0
  263. package/src/__tests__/composables/useListSelection.test.ts +66 -0
  264. package/src/__tests__/composables/usePluginClient.test.ts +444 -0
  265. package/src/__tests__/composables/usePluginConfig.test.ts +5 -0
  266. package/src/__tests__/composables/useRequestSyncState.test.ts +92 -0
  267. package/src/__tests__/composables/useSampleGroups.test.ts +66 -0
  268. package/src/__tests__/composables/useSelectionLimit.test.ts +41 -0
  269. package/src/__tests__/composables/useSortedItems.test.ts +87 -0
  270. package/src/__tests__/composables/useTemplateCollection.test.ts +147 -0
  271. package/src/__tests__/composables/useTextSearch.test.ts +55 -0
  272. package/src/__tests__/composables/useTheme.test.ts +91 -0
  273. package/src/__tests__/composables/useTimeUtils.test.ts +35 -0
  274. package/src/__tests__/docs/frontendDocsCatalog.test.ts +229 -0
  275. package/src/__tests__/fixtures/templates/dose-response.json +81 -0
  276. package/src/__tests__/fixtures/templates/plate-map.json +54 -0
  277. package/src/__tests__/fixtures/templates/qpcr-plate.json +96 -0
  278. package/src/__tests__/fixtures/templates/sample-sheet.json +71 -0
  279. package/src/__tests__/templates/templates.test.ts +1043 -0
  280. package/src/components/ActionItem.vue +82 -0
  281. package/src/components/AppAvatarMenu.vue +15 -69
  282. package/src/components/AppLayout.story.vue +25 -25
  283. package/src/components/AppPageSelector.vue +63 -94
  284. package/src/components/AppPillNav.vue +44 -39
  285. package/src/components/AppPluginSwitcher.vue +41 -145
  286. package/src/components/AppSidebar.story.vue +94 -0
  287. package/src/components/AppSidebar.vue +187 -12
  288. package/src/components/{ToastNotification.story.vue → AppToastContainer.story.vue} +6 -6
  289. package/src/components/AppToastContainer.vue +62 -0
  290. package/src/components/AppTopBar.story.vue +7 -30
  291. package/src/components/AppTopBar.vue +283 -84
  292. package/src/components/BaseModal.vue +3 -5
  293. package/src/components/BaseRadioGroup.vue +7 -3
  294. package/src/components/BaseSelect.vue +11 -7
  295. package/src/components/BaseTabs.vue +6 -4
  296. package/src/components/BatchProgressList.vue +5 -8
  297. package/src/components/BioTemplateExperimentWorkspaceView.story.vue +123 -0
  298. package/src/components/BioTemplateExperimentWorkspaceView.vue +337 -0
  299. package/src/components/BioTemplatePackWorkspaceView.story.vue +107 -0
  300. package/src/components/BioTemplatePackWorkspaceView.vue +176 -0
  301. package/src/components/BioTemplatePresetWorkspaceView.story.vue +151 -0
  302. package/src/components/BioTemplatePresetWorkspaceView.vue +392 -0
  303. package/src/components/BioTemplateRenderer.story.vue +57 -0
  304. package/src/components/BioTemplateRenderer.vue +269 -0
  305. package/src/components/Breadcrumb.vue +14 -8
  306. package/src/components/CalendarGridPanel.vue +120 -0
  307. package/src/components/ConcentrationInput.vue +27 -64
  308. package/src/components/ControlWorkspaceView.story.vue +336 -0
  309. package/src/components/ControlWorkspaceView.vue +347 -0
  310. package/src/components/DataFrame.vue +34 -50
  311. package/src/components/DatePicker.vue +59 -192
  312. package/src/components/DateTimePicker.vue +50 -171
  313. package/src/components/DropdownButton.vue +14 -32
  314. package/src/components/EmptyState.vue +4 -2
  315. package/src/components/ExperimentPopover.vue +5 -22
  316. package/src/components/FormBuilder.vue +124 -27
  317. package/src/components/FormFieldRenderer.vue +15 -38
  318. package/src/components/FormSection.vue +20 -73
  319. package/src/components/GroupAssigner.vue +24 -56
  320. package/src/components/GroupingModal.story.vue +3 -3
  321. package/src/components/GroupingModal.vue +30 -391
  322. package/src/components/MultiSelect.vue +17 -12
  323. package/src/components/PlateMapEditor.vue +3 -8
  324. package/src/components/PluginIcon.story.vue +71 -0
  325. package/src/components/PluginIcon.vue +68 -0
  326. package/src/components/ProtocolStepEditor.vue +13 -22
  327. package/src/components/ReagentList.vue +25 -33
  328. package/src/components/SampleHierarchyTree.vue +12 -23
  329. package/src/components/SampleSelector.vue +42 -122
  330. package/src/components/SegmentedControl.vue +7 -3
  331. package/src/components/SettingsButton.story.vue +1 -1
  332. package/src/components/SettingsButton.vue +15 -27
  333. package/src/components/SettingsModal.story.vue +337 -45
  334. package/src/components/SettingsModal.vue +344 -66
  335. package/src/components/TagsInput.vue +29 -14
  336. package/src/components/ThemeToggle.vue +9 -7
  337. package/src/components/TimePicker.vue +19 -41
  338. package/src/components/ToastNotification.vue +4 -57
  339. package/src/components/Tooltip.vue +7 -12
  340. package/src/components/WellEditPopup.vue +3 -8
  341. package/src/components/WellPlate.vue +4 -10
  342. package/src/components/index.ts +12 -1
  343. package/src/components/internal/FormFieldRendererInternal.vue +50 -0
  344. package/src/components/internal/FormSectionRenderer.vue +78 -0
  345. package/src/composables/index.ts +212 -0
  346. package/src/composables/platformContextHelpers.ts +74 -0
  347. package/src/composables/useBioTemplateComponents.ts +93 -0
  348. package/src/composables/useBioTemplateControls.ts +41 -0
  349. package/src/composables/useBioTemplatePackWorkspace.ts +181 -0
  350. package/src/composables/useBioTemplatePresetWorkspace.ts +337 -0
  351. package/src/composables/useBioTemplateWorkspace.ts +139 -0
  352. package/src/composables/useCalendarGrid.ts +140 -0
  353. package/src/composables/useControlSchema.ts +1274 -0
  354. package/src/composables/useDebouncedWatch.ts +119 -0
  355. package/src/composables/useDropdownState.ts +83 -0
  356. package/src/composables/useEventListener.ts +111 -0
  357. package/src/composables/useExpansionSet.ts +117 -0
  358. package/src/composables/useExperimentData.ts +20 -11
  359. package/src/composables/useExperimentSave.ts +202 -50
  360. package/src/composables/useExperimentSelector.ts +86 -72
  361. package/src/composables/useForm.ts +49 -4
  362. package/src/composables/useFormBuilder.ts +93 -42
  363. package/src/composables/useGroupAssignment.ts +148 -0
  364. package/src/composables/useListSelection.ts +158 -0
  365. package/src/composables/usePluginApi.ts +7 -14
  366. package/src/composables/usePluginClient.ts +425 -0
  367. package/src/composables/usePluginConfig.ts +34 -13
  368. package/src/composables/useRequestSyncState.ts +126 -0
  369. package/src/composables/useSampleGroups.ts +126 -0
  370. package/src/composables/useSelectionLimit.ts +57 -0
  371. package/src/composables/useSortedItems.ts +118 -0
  372. package/src/composables/useTemplateCollection.ts +229 -0
  373. package/src/composables/useTextSearch.ts +60 -0
  374. package/src/composables/useTheme.ts +2 -28
  375. package/src/composables/useTimeUtils.ts +26 -2
  376. package/src/composables/useWellPlateEditor.ts +13 -9
  377. package/src/index.ts +228 -4
  378. package/src/install.ts +11 -4
  379. package/src/stores/settings.ts +13 -9
  380. package/src/styles/components/app-page-selector.css +23 -0
  381. package/src/styles/components/app-pill-nav.css +8 -2
  382. package/src/styles/components/app-top-bar.css +35 -2
  383. package/src/styles/components/button.css +3 -7
  384. package/src/styles/components/concentration-input.css +3 -142
  385. package/src/styles/components/dropdown-button.css +4 -4
  386. package/src/styles/components/empty-state.css +0 -16
  387. package/src/styles/components/input.css +4 -5
  388. package/src/styles/components/number-input.css +3 -3
  389. package/src/styles/components/plugin-icon.css +38 -0
  390. package/src/styles/components/segmented-control.css +4 -7
  391. package/src/styles/components/settings-button.css +3 -66
  392. package/src/styles/components/settings-modal.css +184 -0
  393. package/src/styles/components/tabs.css +1 -2
  394. package/src/styles/components/textarea.css +4 -5
  395. package/src/styles/components/theme-toggle.css +3 -66
  396. package/src/styles/components/unit-input.css +3 -3
  397. package/src/styles/index.css +0 -1
  398. package/src/templates/adapters.ts +785 -0
  399. package/src/templates/builders.ts +2149 -0
  400. package/src/templates/catalog.ts +245 -0
  401. package/src/templates/componentBindings.ts +615 -0
  402. package/src/templates/controlSchemas.ts +718 -0
  403. package/src/templates/index.ts +314 -0
  404. package/src/templates/lookup.ts +18 -0
  405. package/src/templates/packs.ts +156 -0
  406. package/src/templates/presets.ts +146 -0
  407. package/src/templates/types.ts +668 -0
  408. package/src/types/components.ts +80 -1
  409. package/src/types/form-builder.ts +7 -2
  410. package/src/types/index.ts +17 -0
  411. package/src/types/platform.ts +8 -1
  412. package/src/utils/formModelSync.ts +52 -0
  413. package/src/utils/items.ts +28 -0
  414. package/src/utils/options.ts +23 -0
  415. package/src/utils/pluginIcon.ts +30 -0
  416. package/dist/auth-DsI0rQ7_.js.map +0 -1
  417. package/dist/components-CzbQQPCb.js.map +0 -1
  418. package/dist/composables-BXklV5ii.js.map +0 -1
  419. package/dist/useScheduleDrag-CxBeqYcu.js +0 -7181
  420. package/dist/useScheduleDrag-CxBeqYcu.js.map +0 -1
  421. package/src/styles/components/grouping-modal.css +0 -323
@@ -0,0 +1,337 @@
1
+ import {
2
+ computed,
3
+ reactive,
4
+ ref,
5
+ watch,
6
+ type ComputedRef,
7
+ type Ref,
8
+ } from 'vue'
9
+ import type { PillNavItem } from '../types'
10
+ import {
11
+ createBioTemplatePresetCollectionFromControls,
12
+ getBioTemplatePresetInfo,
13
+ type BioTemplateControlValues,
14
+ type BioTemplatePresetEntry,
15
+ type TemplateCollectionEnvelope,
16
+ type TemplatePresetId,
17
+ } from '../templates'
18
+ import type {
19
+ ControlWorkspaceAppTopBarPillBinding,
20
+ ControlWorkspaceAppTopBarTabsBinding,
21
+ ControlWorkspaceOptions,
22
+ ControlWorkspaceFormBinding,
23
+ ControlWorkspacePillNavBinding,
24
+ ControlWorkspaceSidebarBinding,
25
+ ControlWorkspaceTopBarBinding,
26
+ ControlWorkspaceTopBarSettingsBinding,
27
+ UseControlSchemaReturn,
28
+ } from './useControlSchema'
29
+ import {
30
+ useTemplateCollection,
31
+ type UseTemplateCollectionOptions,
32
+ type UseTemplateCollectionReturn,
33
+ } from './useTemplateCollection'
34
+ import {
35
+ useBioTemplateWorkspace,
36
+ type BioTemplateRendererBinding,
37
+ type UseBioTemplateWorkspaceReturn,
38
+ } from './useBioTemplateWorkspace'
39
+ import type {
40
+ BioTemplateComponentBinding,
41
+ BioTemplateComponentImport,
42
+ BioTemplateComponentPropsByComponent,
43
+ BioTemplateComponentPropsBinding,
44
+ BioTemplateComponentPropsById,
45
+ BioTemplateComponentSnippet,
46
+ BioTemplateComponentUsage,
47
+ } from './useBioTemplateComponents'
48
+ import type {
49
+ BioTemplateControlSchema,
50
+ } from './useBioTemplateControls'
51
+
52
+ export interface UseBioTemplatePresetWorkspaceOptions extends UseTemplateCollectionOptions {
53
+ /** Optional schema-rendering options for the generated FormBuilder/AppSidebar controls. */
54
+ controlOptions?: ControlWorkspaceOptions
55
+ /** Initial control values for the generated preset. Merged over controlOptions.initialValues. */
56
+ initialValues?: BioTemplateControlValues
57
+ }
58
+
59
+ export interface UseBioTemplatePresetWorkspaceReturn {
60
+ presetId: TemplatePresetId
61
+ presetInfo: ComputedRef<BioTemplatePresetEntry | undefined>
62
+ presetLabel: ComputedRef<string>
63
+ collection: Ref<TemplateCollectionEnvelope>
64
+ templates: UseTemplateCollectionReturn['templates']
65
+ templateIds: UseTemplateCollectionReturn['templateIds']
66
+ currentExperimentId: UseTemplateCollectionReturn['currentExperimentId']
67
+ hasCurrentExperiment: UseTemplateCollectionReturn['hasCurrentExperiment']
68
+ saving: UseTemplateCollectionReturn['isSaving']
69
+ error: UseTemplateCollectionReturn['error']
70
+ lastSavedAt: UseTemplateCollectionReturn['lastSavedAt']
71
+ controls: UseControlSchemaReturn<BioTemplateControlSchema>
72
+ controlSchema: BioTemplateControlSchema
73
+ controlValues: Ref<BioTemplateControlValues>
74
+ controlViewIds: ComputedRef<string[]>
75
+ controlViewItems: ComputedRef<PillNavItem[]>
76
+ activeControlView: Ref<string>
77
+ form: ControlWorkspaceFormBinding
78
+ sidebar: ControlWorkspaceSidebarBinding
79
+ topBar: ControlWorkspaceTopBarBinding
80
+ pillNav: ControlWorkspacePillNavBinding
81
+ topBarSettings: ControlWorkspaceTopBarSettingsBinding
82
+ bindings: BioTemplatePresetWorkspaceBindings
83
+ renderer: ComputedRef<BioTemplateRendererBinding>
84
+ workspace: ComputedRef<UseBioTemplateWorkspaceReturn>
85
+ componentBindings: ComputedRef<BioTemplateComponentBinding[]>
86
+ componentImports: ComputedRef<BioTemplateComponentImport[]>
87
+ componentProps: ComputedRef<BioTemplateComponentPropsBinding[]>
88
+ componentPropsById: ComputedRef<BioTemplateComponentPropsById>
89
+ componentPropsByComponent: ComputedRef<BioTemplateComponentPropsByComponent>
90
+ componentSnippets: ComputedRef<BioTemplateComponentSnippet[]>
91
+ componentUsage: ComputedRef<BioTemplateComponentUsage | null>
92
+ getComponentProps: UseBioTemplateWorkspaceReturn['getComponentProps']
93
+ setActiveControlView: (viewId: string) => void
94
+ setControlValues: (values: BioTemplateControlValues) => TemplateCollectionEnvelope
95
+ updateControlValues: (values: Partial<BioTemplateControlValues>) => TemplateCollectionEnvelope
96
+ applyCollection: (value: TemplateCollectionEnvelope) => TemplateCollectionEnvelope
97
+ resetToDefaultCollection: () => TemplateCollectionEnvelope
98
+ save: UseTemplateCollectionReturn['save']
99
+ saveCurrent: UseTemplateCollectionReturn['saveCurrent']
100
+ }
101
+
102
+ export interface BioTemplatePresetWorkspaceBindings {
103
+ renderer: ComputedRef<BioTemplateRendererBinding>
104
+ form: ControlWorkspaceFormBinding
105
+ sidebar: ControlWorkspaceSidebarBinding
106
+ topBar: ComputedRef<ControlWorkspaceAppTopBarPillBinding>
107
+ topBarTabs: ComputedRef<ControlWorkspaceAppTopBarTabsBinding>
108
+ topBarSettings: ControlWorkspaceTopBarSettingsBinding
109
+ pillNav: ControlWorkspacePillNavBinding
110
+ componentBindings: ComputedRef<BioTemplateComponentBinding[]>
111
+ componentProps: ComputedRef<BioTemplateComponentPropsBinding[]>
112
+ componentPropsById: ComputedRef<BioTemplateComponentPropsById>
113
+ componentPropsByComponent: ComputedRef<BioTemplateComponentPropsByComponent>
114
+ componentSnippets: ComputedRef<BioTemplateComponentSnippet[]>
115
+ componentUsage: ComputedRef<BioTemplateComponentUsage | null>
116
+ getComponentProps: UseBioTemplateWorkspaceReturn['getComponentProps']
117
+ }
118
+
119
+ /** Create a complete editable WellPlate/DoseCalculator workspace for dose design from a built-in biology template preset with current-experiment save wiring. */
120
+ export function useBioTemplatePresetWorkspace(
121
+ presetId: TemplatePresetId,
122
+ options: UseBioTemplatePresetWorkspaceOptions = {},
123
+ ): UseBioTemplatePresetWorkspaceReturn {
124
+ const { controlOptions, initialValues, ...collectionOptions } = options
125
+ const resolvedControlOptions = mergeInitialValues(controlOptions, initialValues)
126
+ const presetWorkspace = useBioTemplateWorkspace(presetId, resolvedControlOptions)
127
+ const presetInfo = computed(() => getBioTemplatePresetInfo(presetId))
128
+ const presetLabel = computed(() => presetInfo.value?.label ?? humanizePresetId(presetId))
129
+ const controls = presetWorkspace.controls
130
+ const controlValues = ref<BioTemplateControlValues>({ ...controls.initialValues })
131
+ const controlViewIds = computed(() => controls.viewIds)
132
+ const controlViewItems = computed(() => controls.viewItems)
133
+ const activeControlView = ref(controls.defaultView)
134
+ const templateCollection = useTemplateCollection({
135
+ ...collectionOptions,
136
+ initial: createDefaultCollection,
137
+ })
138
+ const collection = templateCollection.templateCollection
139
+ const workspace = computed(() => useBioTemplateWorkspace(collection.value, resolvedControlOptions))
140
+ const renderer = computed<BioTemplateRendererBinding>(() => ({ target: collection.value }))
141
+ const componentBindings = computed(() => workspace.value.componentBindings)
142
+ const componentImports = computed(() => workspace.value.componentImports)
143
+ const componentProps = computed(() => workspace.value.componentProps)
144
+ const componentPropsById = computed(() => workspace.value.componentPropsById)
145
+ const componentPropsByComponent = computed(() => workspace.value.componentPropsByComponent)
146
+ const componentSnippets = computed(() => workspace.value.componentSnippets)
147
+ const componentUsage = computed(() => workspace.value.componentUsage)
148
+ const form = reactive({
149
+ ...controls.form,
150
+ modelValue: controlValues.value,
151
+ 'onUpdate:modelValue': setControlValues,
152
+ }) as ControlWorkspaceFormBinding
153
+ const sidebar = reactive({
154
+ ...controls.sidebar,
155
+ activeView: activeControlView.value,
156
+ modelValue: controlValues.value,
157
+ 'onUpdate:modelValue': setControlValues,
158
+ values: controlValues.value,
159
+ 'onUpdate:values': setControlValues,
160
+ }) as ControlWorkspaceSidebarBinding
161
+ const topBar = reactive({
162
+ tabs: controls.topBarTabs,
163
+ currentTabId: activeControlView.value,
164
+ onTabSelect: (tab: { id: string }) => setActiveControlView(tab.id),
165
+ }) as ControlWorkspaceTopBarBinding
166
+ const pillNav = reactive({
167
+ items: controls.viewItems,
168
+ currentItemId: activeControlView.value,
169
+ onSelect: (item: { id: string }) => setActiveControlView(item.id),
170
+ }) as ControlWorkspacePillNavBinding
171
+ const topBarSettings = reactive({
172
+ showSettings: true,
173
+ settingsConfig: {
174
+ ...controls.topBarSettingsConfig,
175
+ values: controlValues.value,
176
+ },
177
+ onSettingsValuesChange: setControlValues,
178
+ }) as ControlWorkspaceTopBarSettingsBinding
179
+ const topBarProps = computed<ControlWorkspaceAppTopBarPillBinding>(() => ({
180
+ pillNav: pillNav.items,
181
+ currentPillId: pillNav.currentItemId,
182
+ onPillSelect: pillNav.onSelect,
183
+ ...topBarSettings,
184
+ }))
185
+ const topBarTabsProps = computed<ControlWorkspaceAppTopBarTabsBinding>(() => ({
186
+ tabs: topBar.tabs,
187
+ currentTabId: topBar.currentTabId,
188
+ onTabSelect: topBar.onTabSelect,
189
+ ...topBarSettings,
190
+ }))
191
+
192
+ function getComponentProps(
193
+ component: string,
194
+ options?: Parameters<UseBioTemplateWorkspaceReturn['getComponentProps']>[1],
195
+ ) {
196
+ return workspace.value.getComponentProps(component, options)
197
+ }
198
+
199
+ const bindings: BioTemplatePresetWorkspaceBindings = {
200
+ renderer,
201
+ form,
202
+ sidebar,
203
+ topBar: topBarProps,
204
+ topBarTabs: topBarTabsProps,
205
+ topBarSettings,
206
+ pillNav,
207
+ componentBindings,
208
+ componentProps,
209
+ componentPropsById,
210
+ componentPropsByComponent,
211
+ componentSnippets,
212
+ componentUsage,
213
+ getComponentProps,
214
+ }
215
+
216
+ function createDefaultCollection(): TemplateCollectionEnvelope {
217
+ return createBioTemplatePresetCollectionFromControls(presetId, controls.initialValues)
218
+ }
219
+
220
+ watch(
221
+ controlValues,
222
+ (values) => {
223
+ syncControlValueBindings(values)
224
+ templateCollection.apply(createBioTemplatePresetCollectionFromControls(presetId, values))
225
+ },
226
+ { deep: true },
227
+ )
228
+
229
+ watch(activeControlView, (viewId) => {
230
+ sidebar.activeView = viewId
231
+ topBar.currentTabId = viewId
232
+ pillNav.currentItemId = viewId
233
+ }, { flush: 'sync' })
234
+ watch(() => sidebar.activeView, setActiveControlView, { flush: 'sync' })
235
+ watch(() => topBar.currentTabId, setActiveControlView, { flush: 'sync' })
236
+ watch(() => pillNav.currentItemId, setActiveControlView, { flush: 'sync' })
237
+
238
+ function applyCollection(value: TemplateCollectionEnvelope): TemplateCollectionEnvelope {
239
+ return templateCollection.apply(value)
240
+ }
241
+
242
+ function setActiveControlView(viewId: string): void {
243
+ if (!controlViewIds.value.includes(viewId)) return
244
+ activeControlView.value = viewId
245
+ }
246
+
247
+ function setControlValues(values: BioTemplateControlValues): TemplateCollectionEnvelope {
248
+ const nextValues = { ...values }
249
+ controlValues.value = nextValues
250
+ syncControlValueBindings(nextValues)
251
+ return templateCollection.apply(createBioTemplatePresetCollectionFromControls(presetId, nextValues))
252
+ }
253
+
254
+ function updateControlValues(values: Partial<BioTemplateControlValues>): TemplateCollectionEnvelope {
255
+ return setControlValues({
256
+ ...controlValues.value,
257
+ ...values,
258
+ })
259
+ }
260
+
261
+ function resetToDefaultCollection(): TemplateCollectionEnvelope {
262
+ return setControlValues({ ...controls.initialValues })
263
+ }
264
+
265
+ function syncControlValueBindings(values: BioTemplateControlValues): void {
266
+ form.modelValue = values
267
+ sidebar.modelValue = values
268
+ sidebar.values = values
269
+ topBarSettings.settingsConfig = {
270
+ ...topBarSettings.settingsConfig,
271
+ values,
272
+ }
273
+ }
274
+
275
+ return {
276
+ presetId,
277
+ presetInfo,
278
+ presetLabel,
279
+ collection,
280
+ templates: templateCollection.templates,
281
+ templateIds: templateCollection.templateIds,
282
+ currentExperimentId: templateCollection.currentExperimentId,
283
+ hasCurrentExperiment: templateCollection.hasCurrentExperiment,
284
+ saving: templateCollection.isSaving,
285
+ error: templateCollection.error,
286
+ lastSavedAt: templateCollection.lastSavedAt,
287
+ controls,
288
+ controlSchema: controls.controls,
289
+ controlValues,
290
+ controlViewIds,
291
+ controlViewItems,
292
+ activeControlView,
293
+ form,
294
+ sidebar,
295
+ topBar,
296
+ pillNav,
297
+ topBarSettings,
298
+ bindings,
299
+ renderer,
300
+ workspace,
301
+ componentBindings,
302
+ componentImports,
303
+ componentProps,
304
+ componentPropsById,
305
+ componentPropsByComponent,
306
+ componentSnippets,
307
+ componentUsage,
308
+ getComponentProps,
309
+ setActiveControlView,
310
+ setControlValues,
311
+ updateControlValues,
312
+ applyCollection,
313
+ resetToDefaultCollection,
314
+ save: templateCollection.save,
315
+ saveCurrent: templateCollection.saveCurrent,
316
+ }
317
+ }
318
+
319
+ function humanizePresetId(value: string): string {
320
+ return value
321
+ .replace(/[-_]+/g, ' ')
322
+ .replace(/\b\w/g, match => match.toUpperCase())
323
+ }
324
+
325
+ function mergeInitialValues(
326
+ controlOptions: ControlWorkspaceOptions | undefined,
327
+ initialValues: BioTemplateControlValues | undefined,
328
+ ): ControlWorkspaceOptions | undefined {
329
+ if (initialValues === undefined) return controlOptions
330
+ return {
331
+ ...(controlOptions ?? {}),
332
+ initialValues: {
333
+ ...(controlOptions?.initialValues ?? {}),
334
+ ...initialValues,
335
+ },
336
+ }
337
+ }
@@ -0,0 +1,139 @@
1
+ import type {
2
+ BioTemplateEnvelope,
3
+ TemplateCollectionEnvelope,
4
+ } from '../templates'
5
+ import type {
6
+ ControlWorkspaceFormBinding,
7
+ ControlWorkspaceOptions,
8
+ ControlWorkspacePillNavBinding,
9
+ ControlWorkspaceSidebarBinding,
10
+ ControlWorkspaceTopBarBinding,
11
+ ControlWorkspaceTopBarSettingsBinding,
12
+ UseControlSchemaReturn,
13
+ UseControlWorkspaceReturn,
14
+ } from './useControlSchema'
15
+ import {
16
+ useControlWorkspace,
17
+ } from './useControlSchema'
18
+ import {
19
+ useBioTemplateControls,
20
+ type BioTemplateControlSchema,
21
+ type BioTemplateControlTarget,
22
+ } from './useBioTemplateControls'
23
+ import {
24
+ useBioTemplateComponents,
25
+ type BioTemplateComponentBinding,
26
+ type BioTemplateComponentImport,
27
+ type BioTemplateComponentPropsByComponent,
28
+ type BioTemplateComponentPropsBinding,
29
+ type BioTemplateComponentPropsById,
30
+ type BioTemplateComponentSnippet,
31
+ type BioTemplateComponentUsage,
32
+ type UseBioTemplateComponentsReturn,
33
+ } from './useBioTemplateComponents'
34
+
35
+ export type BioTemplateWorkspaceTarget = BioTemplateControlTarget
36
+
37
+ export interface BioTemplateRendererBinding {
38
+ target: BioTemplateEnvelope<unknown> | TemplateCollectionEnvelope
39
+ }
40
+
41
+ export interface BioTemplateWorkspaceBindings {
42
+ renderer: BioTemplateRendererBinding | null
43
+ form: ControlWorkspaceFormBinding
44
+ sidebar: ControlWorkspaceSidebarBinding
45
+ topBar: UseControlWorkspaceReturn<BioTemplateControlSchema>['bindings']['topBar']
46
+ topBarTabs: UseControlWorkspaceReturn<BioTemplateControlSchema>['bindings']['topBarTabs']
47
+ topBarSettings: ControlWorkspaceTopBarSettingsBinding
48
+ pillNav: ControlWorkspacePillNavBinding
49
+ componentBindings: BioTemplateComponentBinding[]
50
+ componentProps: BioTemplateComponentPropsBinding[]
51
+ componentPropsById: BioTemplateComponentPropsById
52
+ componentPropsByComponent: BioTemplateComponentPropsByComponent
53
+ componentSnippets: BioTemplateComponentSnippet[]
54
+ componentUsage: BioTemplateComponentUsage | null
55
+ getComponentProps: UseBioTemplateComponentsReturn['getComponentProps']
56
+ }
57
+
58
+ export interface UseBioTemplateWorkspaceReturn {
59
+ target: BioTemplateWorkspaceTarget
60
+ controls: UseControlSchemaReturn<BioTemplateControlSchema>
61
+ workspace: UseControlWorkspaceReturn<BioTemplateControlSchema>
62
+ controlSchema: BioTemplateControlSchema
63
+ components: UseBioTemplateComponentsReturn
64
+ values: UseControlWorkspaceReturn<BioTemplateControlSchema>['values']
65
+ activeView: UseControlWorkspaceReturn<BioTemplateControlSchema>['activeView']
66
+ form: ControlWorkspaceFormBinding
67
+ sidebar: ControlWorkspaceSidebarBinding
68
+ topBar: ControlWorkspaceTopBarBinding
69
+ pillNav: ControlWorkspacePillNavBinding
70
+ topBarSettings: ControlWorkspaceTopBarSettingsBinding
71
+ bindings: BioTemplateWorkspaceBindings
72
+ renderer: BioTemplateRendererBinding | null
73
+ componentBindings: BioTemplateComponentBinding[]
74
+ componentImports: BioTemplateComponentImport[]
75
+ componentProps: BioTemplateComponentPropsBinding[]
76
+ componentPropsById: BioTemplateComponentPropsById
77
+ componentPropsByComponent: BioTemplateComponentPropsByComponent
78
+ componentSnippets: BioTemplateComponentSnippet[]
79
+ componentUsage: BioTemplateComponentUsage | null
80
+ getComponentProps: UseBioTemplateComponentsReturn['getComponentProps']
81
+ }
82
+
83
+ /** One-stop wiring for BioTemplateRenderer, FormBuilder, AppSidebar, and template-aware SDK components. */
84
+ export function useBioTemplateWorkspace(
85
+ target: BioTemplateWorkspaceTarget,
86
+ options: ControlWorkspaceOptions = {}
87
+ ): UseBioTemplateWorkspaceReturn {
88
+ const controls = useBioTemplateControls(target, options)
89
+ const workspace = useControlWorkspace(controls.controls, options)
90
+ const components = useBioTemplateComponents(target)
91
+ const renderer = isTemplateObjectTarget(target) ? { target } : null
92
+ const bindings: BioTemplateWorkspaceBindings = {
93
+ renderer,
94
+ form: workspace.bindings.form,
95
+ sidebar: workspace.bindings.sidebar,
96
+ topBar: workspace.bindings.topBar,
97
+ topBarTabs: workspace.bindings.topBarTabs,
98
+ topBarSettings: workspace.bindings.topBarSettings,
99
+ pillNav: workspace.bindings.pillNav,
100
+ componentBindings: components.bindings,
101
+ componentProps: components.componentProps,
102
+ componentPropsById: components.componentPropsById,
103
+ componentPropsByComponent: components.componentPropsByComponent,
104
+ componentSnippets: components.snippets,
105
+ componentUsage: components.usage,
106
+ getComponentProps: components.getComponentProps,
107
+ }
108
+
109
+ return {
110
+ target,
111
+ controls,
112
+ workspace,
113
+ controlSchema: controls.controls,
114
+ components,
115
+ values: workspace.values,
116
+ activeView: workspace.activeView,
117
+ form: workspace.form,
118
+ sidebar: workspace.sidebar,
119
+ topBar: workspace.topBar,
120
+ pillNav: workspace.pillNav,
121
+ topBarSettings: workspace.topBarSettings,
122
+ bindings,
123
+ renderer,
124
+ componentBindings: components.bindings,
125
+ componentImports: components.imports,
126
+ componentProps: components.componentProps,
127
+ componentPropsById: components.componentPropsById,
128
+ componentPropsByComponent: components.componentPropsByComponent,
129
+ componentSnippets: components.snippets,
130
+ componentUsage: components.usage,
131
+ getComponentProps: components.getComponentProps,
132
+ }
133
+ }
134
+
135
+ function isTemplateObjectTarget(
136
+ target: BioTemplateWorkspaceTarget
137
+ ): target is BioTemplateEnvelope<unknown> | TemplateCollectionEnvelope {
138
+ return typeof target !== 'string'
139
+ }
@@ -0,0 +1,140 @@
1
+ import { computed, ref, type ComputedRef, type Ref } from 'vue'
2
+
3
+ export interface CalendarGridDay {
4
+ date: Date
5
+ isCurrentMonth: boolean
6
+ isDisabled: boolean
7
+ }
8
+
9
+ export interface UseCalendarGridOptions {
10
+ min?: () => string | undefined
11
+ max?: () => string | undefined
12
+ locale?: () => string | undefined
13
+ }
14
+
15
+ export interface UseCalendarGridReturn {
16
+ currentMonth: Ref<Date>
17
+ weekDays: readonly string[]
18
+ monthYear: ComputedRef<string>
19
+ calendarDays: ComputedRef<CalendarGridDay[]>
20
+ isDateDisabled: (date: Date) => boolean
21
+ isSameDay: (date: Date, other: Date | null | undefined) => boolean
22
+ isToday: (date: Date) => boolean
23
+ formatDateValue: (date: Date) => string
24
+ setCurrentMonthFromDate: (date: Date) => void
25
+ prevMonth: () => void
26
+ nextMonth: () => void
27
+ }
28
+
29
+ const WEEK_DAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'] as const
30
+
31
+ /** Shared calendar grid state for date and datetime pickers. */
32
+ export function useCalendarGrid(options: UseCalendarGridOptions = {}): UseCalendarGridReturn {
33
+ const currentMonth = ref(new Date())
34
+
35
+ const monthYear = computed(() => {
36
+ return currentMonth.value.toLocaleDateString(options.locale?.() ?? 'en-US', {
37
+ year: 'numeric',
38
+ month: 'long',
39
+ })
40
+ })
41
+
42
+ const calendarDays = computed<CalendarGridDay[]>(() => {
43
+ const year = currentMonth.value.getFullYear()
44
+ const month = currentMonth.value.getMonth()
45
+ const firstDay = new Date(year, month, 1)
46
+ const lastDay = new Date(year, month + 1, 0)
47
+ const days: CalendarGridDay[] = []
48
+
49
+ const startPadding = firstDay.getDay()
50
+ for (let i = startPadding - 1; i >= 0; i--) {
51
+ const date = new Date(year, month, -i)
52
+ days.push({ date, isCurrentMonth: false, isDisabled: isDateDisabled(date) })
53
+ }
54
+
55
+ for (let i = 1; i <= lastDay.getDate(); i++) {
56
+ const date = new Date(year, month, i)
57
+ days.push({ date, isCurrentMonth: true, isDisabled: isDateDisabled(date) })
58
+ }
59
+
60
+ const endPadding = 42 - days.length
61
+ for (let i = 1; i <= endPadding; i++) {
62
+ const date = new Date(year, month + 1, i)
63
+ days.push({ date, isCurrentMonth: false, isDisabled: isDateDisabled(date) })
64
+ }
65
+
66
+ return days
67
+ })
68
+
69
+ function isDateDisabled(date: Date): boolean {
70
+ const minDate = parseBoundaryDate(options.min?.())
71
+ if (minDate && startOfDay(date) < startOfDay(minDate)) return true
72
+
73
+ const maxDate = parseBoundaryDate(options.max?.())
74
+ if (maxDate && startOfDay(date) > startOfDay(maxDate)) return true
75
+
76
+ return false
77
+ }
78
+
79
+ function isSameDay(date: Date, other: Date | null | undefined): boolean {
80
+ if (!other) return false
81
+ return date.toDateString() === other.toDateString()
82
+ }
83
+
84
+ function isToday(date: Date): boolean {
85
+ return isSameDay(date, new Date())
86
+ }
87
+
88
+ function formatDateValue(date: Date): string {
89
+ const year = date.getFullYear()
90
+ const month = String(date.getMonth() + 1).padStart(2, '0')
91
+ const day = String(date.getDate()).padStart(2, '0')
92
+ return `${year}-${month}-${day}`
93
+ }
94
+
95
+ function setCurrentMonthFromDate(date: Date): void {
96
+ currentMonth.value = new Date(date.getFullYear(), date.getMonth(), 1)
97
+ }
98
+
99
+ function prevMonth(): void {
100
+ currentMonth.value = new Date(
101
+ currentMonth.value.getFullYear(),
102
+ currentMonth.value.getMonth() - 1,
103
+ 1,
104
+ )
105
+ }
106
+
107
+ function nextMonth(): void {
108
+ currentMonth.value = new Date(
109
+ currentMonth.value.getFullYear(),
110
+ currentMonth.value.getMonth() + 1,
111
+ 1,
112
+ )
113
+ }
114
+
115
+ return {
116
+ currentMonth,
117
+ weekDays: WEEK_DAYS,
118
+ monthYear,
119
+ calendarDays,
120
+ isDateDisabled,
121
+ isSameDay,
122
+ isToday,
123
+ formatDateValue,
124
+ setCurrentMonthFromDate,
125
+ prevMonth,
126
+ nextMonth,
127
+ }
128
+ }
129
+
130
+ function parseBoundaryDate(value: string | undefined): Date | null {
131
+ if (!value) return null
132
+ const date = value.includes('T') ? new Date(value) : new Date(`${value}T00:00:00`)
133
+ return Number.isNaN(date.getTime()) ? null : date
134
+ }
135
+
136
+ function startOfDay(date: Date): Date {
137
+ const copy = new Date(date)
138
+ copy.setHours(0, 0, 0, 0)
139
+ return copy
140
+ }