@morscherlab/mint-sdk 1.0.0-beta.2 → 1.0.0-beta.4

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 (427) hide show
  1. package/README.md +225 -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/ComponentBindingRenderer.test.d.ts +1 -0
  19. package/dist/__tests__/components/ConcentrationInput.test.d.ts +1 -0
  20. package/dist/__tests__/components/ControlWorkspaceView.test.d.ts +1 -0
  21. package/dist/__tests__/components/DatePicker.test.d.ts +1 -0
  22. package/dist/__tests__/components/DateTimePicker.test.d.ts +1 -0
  23. package/dist/__tests__/components/DoseDesignWorkspaceView.test.d.ts +1 -0
  24. package/dist/__tests__/components/EmptyState.test.d.ts +1 -0
  25. package/dist/__tests__/components/ExperimentPopover.test.d.ts +1 -0
  26. package/dist/__tests__/components/FormBuilder.test.d.ts +1 -0
  27. package/dist/__tests__/components/GroupAssigner.test.d.ts +1 -0
  28. package/dist/__tests__/components/MultiSelect.test.d.ts +1 -0
  29. package/dist/__tests__/components/PluginWorkspaceView.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/SettingsModal.test.d.ts +1 -0
  36. package/dist/__tests__/components/TagsInput.test.d.ts +1 -0
  37. package/dist/__tests__/components/ThemeToggle.test.d.ts +1 -0
  38. package/dist/__tests__/components/TimePicker.test.d.ts +1 -0
  39. package/dist/__tests__/composables/experiment-utils.test.d.ts +1 -0
  40. package/dist/__tests__/composables/useApi.test.d.ts +1 -0
  41. package/dist/__tests__/composables/useBioTemplatePackWorkspace.test.d.ts +1 -0
  42. package/dist/__tests__/composables/useBioTemplatePresetWorkspace.test.d.ts +1 -0
  43. package/dist/__tests__/composables/useBioTemplateWorkspace.test.d.ts +1 -0
  44. package/dist/__tests__/composables/useCalendarGrid.test.d.ts +1 -0
  45. package/dist/__tests__/composables/useControlSchema.test.d.ts +1 -0
  46. package/dist/__tests__/composables/useDebouncedWatch.test.d.ts +1 -0
  47. package/dist/__tests__/composables/useDropdownState.test.d.ts +1 -0
  48. package/dist/__tests__/composables/useEventListener.test.d.ts +1 -0
  49. package/dist/__tests__/composables/useExpansionSet.test.d.ts +1 -0
  50. package/dist/__tests__/composables/useExperimentData.test.d.ts +1 -0
  51. package/dist/__tests__/composables/useExperimentSelector.test.d.ts +1 -0
  52. package/dist/__tests__/composables/useGroupAssignment.test.d.ts +1 -0
  53. package/dist/__tests__/composables/useListSelection.test.d.ts +1 -0
  54. package/dist/__tests__/composables/usePluginClient.test.d.ts +1 -0
  55. package/dist/__tests__/composables/usePluginConfig.test.d.ts +1 -0
  56. package/dist/__tests__/composables/useRequestSyncState.test.d.ts +1 -0
  57. package/dist/__tests__/composables/useSampleGroups.test.d.ts +1 -0
  58. package/dist/__tests__/composables/useSelectionLimit.test.d.ts +1 -0
  59. package/dist/__tests__/composables/useSortedItems.test.d.ts +1 -0
  60. package/dist/__tests__/composables/useTemplateCollection.test.d.ts +1 -0
  61. package/dist/__tests__/composables/useTextSearch.test.d.ts +1 -0
  62. package/dist/__tests__/composables/useTheme.test.d.ts +1 -0
  63. package/dist/__tests__/composables/useTimeUtils.test.d.ts +1 -0
  64. package/dist/__tests__/docs/frontendDocsCatalog.test.d.ts +1 -0
  65. package/dist/__tests__/templates/templates.test.d.ts +1 -0
  66. package/dist/{auth-DsI0rQ7_.js → auth-QQj2kkze.js} +12 -5
  67. package/dist/auth-QQj2kkze.js.map +1 -0
  68. package/dist/components/AppAvatarMenu.vue.d.ts +2 -7
  69. package/dist/components/AppContainer.vue.d.ts +1 -1
  70. package/dist/components/AppLayout.vue.d.ts +20 -1
  71. package/dist/components/AppSidebar.vue.d.ts +111 -6
  72. package/dist/components/AppTopBar.vue.d.ts +35 -22
  73. package/dist/components/BaseButton.vue.d.ts +1 -1
  74. package/dist/components/BaseCheckbox.vue.d.ts +1 -1
  75. package/dist/components/BaseInput.vue.d.ts +2 -2
  76. package/dist/components/BasePill.vue.d.ts +2 -2
  77. package/dist/components/BaseRadioGroup.vue.d.ts +3 -3
  78. package/dist/components/BaseSelect.vue.d.ts +3 -3
  79. package/dist/components/BaseTabs.vue.d.ts +2 -2
  80. package/dist/components/BaseTextarea.vue.d.ts +1 -1
  81. package/dist/components/BaseToggle.vue.d.ts +1 -1
  82. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +119 -0
  83. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +93 -0
  84. package/dist/components/BioTemplatePresetWorkspaceView.vue.d.ts +87 -0
  85. package/dist/components/BioTemplateRenderer.vue.d.ts +29 -0
  86. package/dist/components/Breadcrumb.vue.d.ts +2 -2
  87. package/dist/components/Calendar.vue.d.ts +1 -1
  88. package/dist/components/CollapsibleCard.vue.d.ts +1 -1
  89. package/dist/components/ComponentBindingRenderer.vue.d.ts +44 -0
  90. package/dist/components/ConcentrationInput.vue.d.ts +2 -2
  91. package/dist/components/ConfirmDialog.vue.d.ts +2 -2
  92. package/dist/components/ControlWorkspaceView.vue.d.ts +147 -0
  93. package/dist/components/DatePicker.vue.d.ts +1 -1
  94. package/dist/components/DateTimePicker.vue.d.ts +3 -3
  95. package/dist/components/Divider.vue.d.ts +1 -1
  96. package/dist/components/DoseDesignWorkspaceView.vue.d.ts +149 -0
  97. package/dist/components/DropdownButton.vue.d.ts +3 -3
  98. package/dist/components/EmptyState.vue.d.ts +1 -2
  99. package/dist/components/ExperimentDataViewer.vue.d.ts +1 -1
  100. package/dist/components/ExperimentTimeline.vue.d.ts +2 -2
  101. package/dist/components/FileUploader.vue.d.ts +1 -1
  102. package/dist/components/FitPanel.vue.d.ts +1 -1
  103. package/dist/components/FormActions.vue.d.ts +4 -4
  104. package/dist/components/FormBuilder.vue.d.ts +31 -17
  105. package/dist/components/FormulaInput.vue.d.ts +2 -2
  106. package/dist/components/MoleculeInput.vue.d.ts +2 -2
  107. package/dist/components/MultiSelect.vue.d.ts +3 -3
  108. package/dist/components/NumberInput.vue.d.ts +1 -1
  109. package/dist/components/PlateMapEditor.vue.d.ts +1 -1
  110. package/dist/components/PluginWorkspaceView.vue.d.ts +310 -0
  111. package/dist/components/ProgressBar.vue.d.ts +1 -1
  112. package/dist/components/ProtocolStepEditor.vue.d.ts +3 -1
  113. package/dist/components/RackEditor.vue.d.ts +2 -2
  114. package/dist/components/SampleLegend.vue.d.ts +2 -2
  115. package/dist/components/ScheduleCalendar.vue.d.ts +2 -2
  116. package/dist/components/SegmentedControl.vue.d.ts +2 -2
  117. package/dist/components/SequenceInput.vue.d.ts +3 -3
  118. package/dist/components/SettingsModal.vue.d.ts +14 -6
  119. package/dist/components/StatusIndicator.vue.d.ts +1 -1
  120. package/dist/components/TagsInput.vue.d.ts +3 -2
  121. package/dist/components/TimePicker.vue.d.ts +3 -3
  122. package/dist/components/TimeRangeInput.vue.d.ts +1 -1
  123. package/dist/components/UnitInput.vue.d.ts +2 -2
  124. package/dist/components/WellPlate.vue.d.ts +6 -6
  125. package/dist/components/index.d.ts +9 -8
  126. package/dist/components/index.js +3 -3
  127. package/dist/components/{SettingsButton.vue.d.ts → internal/ActionItemInternal.vue.d.ts} +11 -9
  128. package/dist/components/{AppPageSelector.vue.d.ts → internal/AppPageSelectorInternal.vue.d.ts} +3 -6
  129. package/dist/components/{AppPillNav.vue.d.ts → internal/AppPillNavInternal.vue.d.ts} +4 -2
  130. package/dist/components/internal/CalendarGridPanelInternal.vue.d.ts +25 -0
  131. package/dist/components/{FormFieldRenderer.vue.d.ts → internal/FormFieldRendererInternal.vue.d.ts} +2 -2
  132. package/dist/components/{FormSection.vue.d.ts → internal/FormSectionRenderer.vue.d.ts} +7 -7
  133. package/dist/components/{WellEditPopup.vue.d.ts → internal/WellEditPopupInternal.vue.d.ts} +1 -1
  134. package/dist/{components-_XqPEhP9.js → components-BkGF4B4y.js} +9760 -8471
  135. package/dist/components-BkGF4B4y.js.map +1 -0
  136. package/dist/composables/experiment-utils.d.ts +8 -0
  137. package/dist/composables/index.d.ts +22 -5
  138. package/dist/composables/index.js +4 -3
  139. package/dist/composables/platformContextHelpers.d.ts +14 -0
  140. package/dist/composables/useAppExperiment.d.ts +31 -2
  141. package/dist/composables/useBioTemplateComponents.d.ts +22 -0
  142. package/dist/composables/useBioTemplateControls.d.ts +6 -0
  143. package/dist/composables/useBioTemplatePackWorkspace.d.ts +46 -0
  144. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +75 -0
  145. package/dist/composables/useBioTemplateWorkspace.d.ts +51 -0
  146. package/dist/composables/useCalendarGrid.d.ts +26 -0
  147. package/dist/composables/useControlSchema.d.ts +343 -0
  148. package/dist/composables/useDebouncedWatch.d.ts +20 -0
  149. package/dist/composables/useDropdownState.d.ts +19 -0
  150. package/dist/composables/useEventListener.d.ts +13 -0
  151. package/dist/composables/useExpansionSet.d.ts +21 -0
  152. package/dist/composables/useExperimentData.d.ts +10 -0
  153. package/dist/composables/useExperimentSave.d.ts +31 -2
  154. package/dist/composables/useExperimentSelector.d.ts +20 -0
  155. package/dist/composables/useForm.d.ts +2 -0
  156. package/dist/composables/useGroupAssignment.d.ts +31 -0
  157. package/dist/composables/useListSelection.d.ts +35 -0
  158. package/dist/composables/usePlatformContext.d.ts +21 -3
  159. package/dist/composables/usePluginClient.d.ts +112 -0
  160. package/dist/composables/usePluginConfig.d.ts +12 -0
  161. package/dist/composables/useRequestSyncState.d.ts +34 -0
  162. package/dist/composables/useSampleGroups.d.ts +32 -0
  163. package/dist/composables/useSelectionLimit.d.ts +17 -0
  164. package/dist/composables/useSortedItems.d.ts +32 -0
  165. package/dist/composables/useTemplateCollection.d.ts +58 -0
  166. package/dist/composables/useTextSearch.d.ts +18 -0
  167. package/dist/composables/useTimeUtils.d.ts +8 -0
  168. package/dist/{composables-tiZqLu1M.js → composables-CHsME9H1.js} +240 -146
  169. package/dist/composables-CHsME9H1.js.map +1 -0
  170. package/dist/index.d.ts +6 -4
  171. package/dist/index.js +6 -5
  172. package/dist/install.d.ts +7 -2
  173. package/dist/install.js +2 -2
  174. package/dist/install.js.map +1 -1
  175. package/dist/stores/index.js +1 -1
  176. package/dist/stores/settings.d.ts +4 -1
  177. package/dist/styles.css +4746 -5514
  178. package/dist/templates/adapters.d.ts +43 -0
  179. package/dist/templates/builders.d.ts +63 -0
  180. package/dist/templates/catalog.d.ts +188 -0
  181. package/dist/templates/componentBindings.d.ts +71 -0
  182. package/dist/templates/controlSchemas.d.ts +25 -0
  183. package/dist/templates/index.d.ts +15 -0
  184. package/dist/templates/index.js +2 -0
  185. package/dist/templates/lookup.d.ts +4 -0
  186. package/dist/templates/packs.d.ts +18 -0
  187. package/dist/templates/presets.d.ts +90 -0
  188. package/dist/templates/types.d.ts +531 -0
  189. package/dist/templates-B5jmTWuk.js +9388 -0
  190. package/dist/templates-B5jmTWuk.js.map +1 -0
  191. package/dist/types/components.d.ts +26 -23
  192. package/dist/types/form-builder.d.ts +6 -8
  193. package/dist/types/index.d.ts +2 -2
  194. package/dist/types/platform.d.ts +7 -1
  195. package/dist/useScheduleDrag-BgzpQT53.js +4414 -0
  196. package/dist/useScheduleDrag-BgzpQT53.js.map +1 -0
  197. package/dist/utils/formModelSync.d.ts +5 -0
  198. package/dist/utils/items.d.ts +8 -0
  199. package/dist/utils/options.d.ts +6 -0
  200. package/dist/utils/pluginIcon.d.ts +9 -0
  201. package/package.json +7 -2
  202. package/src/__tests__/components/ActionItem.test.ts +99 -0
  203. package/src/__tests__/components/AppAvatarMenu.test.ts +27 -0
  204. package/src/__tests__/components/AppLayout.test.ts +44 -0
  205. package/src/__tests__/components/AppPageSelector.test.ts +134 -0
  206. package/src/__tests__/components/AppPillNav.test.ts +125 -0
  207. package/src/__tests__/components/AppPluginSwitcher.test.ts +44 -0
  208. package/src/__tests__/components/AppSidebar.test.ts +496 -0
  209. package/src/__tests__/components/AppToastContainer.test.ts +37 -0
  210. package/src/__tests__/components/AppTopBar.test.ts +455 -9
  211. package/src/__tests__/components/BaseRadioGroup.test.ts +25 -0
  212. package/src/__tests__/components/BaseSelect.test.ts +21 -0
  213. package/src/__tests__/components/BaseTabs.test.ts +25 -0
  214. package/src/__tests__/components/BatchProgressList.test.ts +52 -0
  215. package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +159 -0
  216. package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +175 -0
  217. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +306 -0
  218. package/src/__tests__/components/BioTemplateRenderer.test.ts +71 -0
  219. package/src/__tests__/components/Breadcrumb.test.ts +23 -0
  220. package/src/__tests__/components/CalendarGridPanel.test.ts +36 -0
  221. package/src/__tests__/components/ComponentBindingRenderer.test.ts +161 -0
  222. package/src/__tests__/components/ConcentrationInput.test.ts +45 -0
  223. package/src/__tests__/components/ControlWorkspaceView.test.ts +1102 -0
  224. package/src/__tests__/components/DataFrame.test.ts +11 -0
  225. package/src/__tests__/components/DatePicker.test.ts +45 -0
  226. package/src/__tests__/components/DateTimePicker.test.ts +48 -0
  227. package/src/__tests__/components/DoseDesignWorkspaceView.test.ts +185 -0
  228. package/src/__tests__/components/DropdownButton.test.ts +23 -0
  229. package/src/__tests__/components/EmptyState.test.ts +23 -0
  230. package/src/__tests__/components/ExperimentPopover.test.ts +56 -0
  231. package/src/__tests__/components/FormBuilder.test.ts +296 -0
  232. package/src/__tests__/components/GroupAssigner.test.ts +30 -0
  233. package/src/__tests__/components/MultiSelect.test.ts +48 -0
  234. package/src/__tests__/components/PluginWorkspaceView.test.ts +548 -0
  235. package/src/__tests__/components/ProtocolStepEditor.test.ts +33 -0
  236. package/src/__tests__/components/ReagentList.test.ts +82 -0
  237. package/src/__tests__/components/SampleHierarchyTree.test.ts +53 -0
  238. package/src/__tests__/components/SampleSelector.test.ts +60 -0
  239. package/src/__tests__/components/SegmentedControl.test.ts +24 -0
  240. package/src/__tests__/components/SettingsModal.test.ts +296 -0
  241. package/src/__tests__/components/TagsInput.test.ts +75 -0
  242. package/src/__tests__/components/ThemeToggle.test.ts +47 -0
  243. package/src/__tests__/components/TimePicker.test.ts +38 -0
  244. package/src/__tests__/composables/experiment-utils.test.ts +30 -0
  245. package/src/__tests__/composables/useApi.test.ts +30 -0
  246. package/src/__tests__/composables/useAppExperiment.test.ts +100 -1
  247. package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +125 -0
  248. package/src/__tests__/composables/useBioTemplatePresetWorkspace.test.ts +199 -0
  249. package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +104 -0
  250. package/src/__tests__/composables/useCalendarGrid.test.ts +38 -0
  251. package/src/__tests__/composables/useControlSchema.test.ts +1033 -0
  252. package/src/__tests__/composables/useDebouncedWatch.test.ts +93 -0
  253. package/src/__tests__/composables/useDropdownState.test.ts +95 -0
  254. package/src/__tests__/composables/useEventListener.test.ts +116 -0
  255. package/src/__tests__/composables/useExpansionSet.test.ts +62 -0
  256. package/src/__tests__/composables/useExperimentData.test.ts +4 -0
  257. package/src/__tests__/composables/useExperimentSave.test.ts +203 -8
  258. package/src/__tests__/composables/useExperimentSelector.test.ts +164 -0
  259. package/src/__tests__/composables/useForm.test.ts +58 -0
  260. package/src/__tests__/composables/useFormBuilder.test.ts +77 -0
  261. package/src/__tests__/composables/useGroupAssignment.test.ts +73 -0
  262. package/src/__tests__/composables/useListSelection.test.ts +66 -0
  263. package/src/__tests__/composables/usePluginClient.test.ts +541 -0
  264. package/src/__tests__/composables/usePluginConfig.test.ts +5 -0
  265. package/src/__tests__/composables/useRequestSyncState.test.ts +92 -0
  266. package/src/__tests__/composables/useSampleGroups.test.ts +66 -0
  267. package/src/__tests__/composables/useSelectionLimit.test.ts +41 -0
  268. package/src/__tests__/composables/useSortedItems.test.ts +87 -0
  269. package/src/__tests__/composables/useTemplateCollection.test.ts +147 -0
  270. package/src/__tests__/composables/useTextSearch.test.ts +55 -0
  271. package/src/__tests__/composables/useTheme.test.ts +91 -0
  272. package/src/__tests__/composables/useTimeUtils.test.ts +35 -0
  273. package/src/__tests__/docs/frontendDocsCatalog.test.ts +324 -0
  274. package/src/__tests__/fixtures/templates/dose-response.json +81 -0
  275. package/src/__tests__/fixtures/templates/plate-map.json +54 -0
  276. package/src/__tests__/fixtures/templates/qpcr-plate.json +96 -0
  277. package/src/__tests__/fixtures/templates/sample-sheet.json +71 -0
  278. package/src/__tests__/templates/templates.test.ts +1055 -0
  279. package/src/components/AppAvatarMenu.vue +15 -69
  280. package/src/components/AppLayout.story.vue +64 -25
  281. package/src/components/AppLayout.vue +83 -2
  282. package/src/components/AppPluginSwitcher.vue +41 -145
  283. package/src/components/AppSidebar.story.vue +203 -1
  284. package/src/components/AppSidebar.vue +320 -25
  285. package/src/components/{ToastNotification.story.vue → AppToastContainer.story.vue} +6 -6
  286. package/src/components/{ToastNotification.vue → AppToastContainer.vue} +1 -1
  287. package/src/components/AppTopBar.story.vue +7 -33
  288. package/src/components/AppTopBar.vue +104 -300
  289. package/src/components/BaseModal.vue +3 -5
  290. package/src/components/BaseRadioGroup.vue +7 -3
  291. package/src/components/BaseSelect.vue +11 -7
  292. package/src/components/BaseTabs.vue +6 -4
  293. package/src/components/BatchProgressList.vue +5 -8
  294. package/src/components/BioTemplateExperimentWorkspaceView.story.vue +123 -0
  295. package/src/components/BioTemplateExperimentWorkspaceView.vue +343 -0
  296. package/src/components/BioTemplatePackWorkspaceView.story.vue +107 -0
  297. package/src/components/BioTemplatePackWorkspaceView.vue +177 -0
  298. package/src/components/BioTemplatePresetWorkspaceView.story.vue +163 -0
  299. package/src/components/BioTemplatePresetWorkspaceView.vue +401 -0
  300. package/src/components/BioTemplateRenderer.story.vue +57 -0
  301. package/src/components/BioTemplateRenderer.vue +57 -0
  302. package/src/components/Breadcrumb.vue +14 -8
  303. package/src/components/ComponentBindingRenderer.story.vue +57 -0
  304. package/src/components/ComponentBindingRenderer.vue +308 -0
  305. package/src/components/ConcentrationInput.vue +27 -64
  306. package/src/components/ControlWorkspaceView.story.vue +347 -0
  307. package/src/components/ControlWorkspaceView.vue +378 -0
  308. package/src/components/DataFrame.vue +34 -50
  309. package/src/components/DatePicker.vue +59 -192
  310. package/src/components/DateTimePicker.vue +50 -171
  311. package/src/components/DoseDesignWorkspaceView.story.vue +77 -0
  312. package/src/components/DoseDesignWorkspaceView.vue +255 -0
  313. package/src/components/DropdownButton.vue +14 -32
  314. package/src/components/EmptyState.vue +4 -2
  315. package/src/components/ExperimentPopover.vue +7 -28
  316. package/src/components/ExperimentSelectorModal.vue +6 -5
  317. package/src/components/FormBuilder.story.vue +190 -0
  318. package/src/components/FormBuilder.vue +124 -27
  319. package/src/components/GroupAssigner.vue +24 -56
  320. package/src/components/MultiSelect.vue +17 -12
  321. package/src/components/PlateMapEditor.vue +3 -8
  322. package/src/components/PluginIcon.vue +2 -22
  323. package/src/components/PluginWorkspaceView.story.vue +334 -0
  324. package/src/components/PluginWorkspaceView.vue +708 -0
  325. package/src/components/ProtocolStepEditor.vue +13 -22
  326. package/src/components/ReagentList.vue +25 -33
  327. package/src/components/SampleHierarchyTree.vue +12 -23
  328. package/src/components/SampleSelector.vue +42 -122
  329. package/src/components/SegmentedControl.vue +7 -3
  330. package/src/components/SettingsModal.story.vue +88 -1
  331. package/src/components/SettingsModal.vue +120 -29
  332. package/src/components/TagsInput.vue +29 -14
  333. package/src/components/ThemeToggle.vue +9 -7
  334. package/src/components/TimePicker.vue +19 -41
  335. package/src/components/Tooltip.vue +7 -12
  336. package/src/components/WellPlate.vue +6 -12
  337. package/src/components/index.ts +9 -8
  338. package/src/components/internal/ActionItemInternal.vue +82 -0
  339. package/src/components/internal/AppPageSelectorInternal.vue +128 -0
  340. package/src/components/internal/AppPillNavInternal.vue +194 -0
  341. package/src/components/internal/CalendarGridPanelInternal.vue +120 -0
  342. package/src/components/{FormFieldRenderer.vue → internal/FormFieldRendererInternal.vue} +4 -12
  343. package/src/components/{FormSection.vue → internal/FormSectionRenderer.vue} +6 -18
  344. package/src/components/{WellEditPopup.vue → internal/WellEditPopupInternal.vue} +5 -10
  345. package/src/composables/experiment-utils.ts +26 -0
  346. package/src/composables/index.ts +229 -3
  347. package/src/composables/platformContextHelpers.ts +74 -0
  348. package/src/composables/useApi.ts +9 -2
  349. package/src/composables/useAppExperiment.ts +85 -13
  350. package/src/composables/useBioTemplateComponents.ts +105 -0
  351. package/src/composables/useBioTemplateControls.ts +41 -0
  352. package/src/composables/useBioTemplatePackWorkspace.ts +185 -0
  353. package/src/composables/useBioTemplatePresetWorkspace.ts +326 -0
  354. package/src/composables/useBioTemplateWorkspace.ts +141 -0
  355. package/src/composables/useCalendarGrid.ts +140 -0
  356. package/src/composables/useControlSchema.ts +1362 -0
  357. package/src/composables/useDebouncedWatch.ts +119 -0
  358. package/src/composables/useDropdownState.ts +83 -0
  359. package/src/composables/useEventListener.ts +111 -0
  360. package/src/composables/useExpansionSet.ts +117 -0
  361. package/src/composables/useExperimentData.ts +20 -11
  362. package/src/composables/useExperimentSave.ts +202 -50
  363. package/src/composables/useExperimentSelector.ts +86 -72
  364. package/src/composables/useForm.ts +49 -4
  365. package/src/composables/useFormBuilder.ts +93 -42
  366. package/src/composables/useGroupAssignment.ts +148 -0
  367. package/src/composables/useListSelection.ts +158 -0
  368. package/src/composables/usePluginClient.ts +466 -0
  369. package/src/composables/usePluginConfig.ts +34 -13
  370. package/src/composables/useRequestSyncState.ts +126 -0
  371. package/src/composables/useSampleGroups.ts +126 -0
  372. package/src/composables/useSelectionLimit.ts +57 -0
  373. package/src/composables/useSortedItems.ts +118 -0
  374. package/src/composables/useTemplateCollection.ts +229 -0
  375. package/src/composables/useTextSearch.ts +60 -0
  376. package/src/composables/useTheme.ts +2 -28
  377. package/src/composables/useTimeUtils.ts +26 -2
  378. package/src/composables/useWellPlateEditor.ts +13 -9
  379. package/src/index.ts +11 -348
  380. package/src/install.ts +11 -4
  381. package/src/stores/settings.ts +13 -9
  382. package/src/styles/components/app-layout.css +82 -0
  383. package/src/styles/components/app-page-selector.css +23 -0
  384. package/src/styles/components/app-pill-nav.css +77 -0
  385. package/src/styles/components/app-sidebar.css +119 -0
  386. package/src/styles/components/app-top-bar.css +0 -201
  387. package/src/styles/components/concentration-input.css +3 -142
  388. package/src/styles/components/empty-state.css +0 -16
  389. package/src/styles/components/theme-toggle.css +3 -66
  390. package/src/styles/index.css +0 -2
  391. package/src/templates/adapters.ts +785 -0
  392. package/src/templates/builders.ts +2149 -0
  393. package/src/templates/catalog.ts +245 -0
  394. package/src/templates/componentBindings.ts +653 -0
  395. package/src/templates/controlSchemas.ts +718 -0
  396. package/src/templates/index.ts +318 -0
  397. package/src/templates/lookup.ts +18 -0
  398. package/src/templates/packs.ts +156 -0
  399. package/src/templates/presets.ts +146 -0
  400. package/src/templates/types.ts +668 -0
  401. package/src/types/components.ts +39 -27
  402. package/src/types/form-builder.ts +7 -2
  403. package/src/types/index.ts +13 -3
  404. package/src/types/platform.ts +7 -1
  405. package/src/utils/formModelSync.ts +52 -0
  406. package/src/utils/items.ts +28 -0
  407. package/src/utils/options.ts +23 -0
  408. package/src/utils/pluginIcon.ts +30 -0
  409. package/dist/__tests__/composables/usePluginApi.test.d.ts +0 -13
  410. package/dist/auth-DsI0rQ7_.js.map +0 -1
  411. package/dist/components/GroupingModal.vue.d.ts +0 -12
  412. package/dist/components-_XqPEhP9.js.map +0 -1
  413. package/dist/composables/usePluginApi.d.ts +0 -29
  414. package/dist/composables-tiZqLu1M.js.map +0 -1
  415. package/dist/useScheduleDrag-CA9sGNJG.js +0 -7181
  416. package/dist/useScheduleDrag-CA9sGNJG.js.map +0 -1
  417. package/src/__tests__/composables/usePluginApi.test.ts +0 -81
  418. package/src/components/AppPageSelector.vue +0 -159
  419. package/src/components/AppPillNav.vue +0 -66
  420. package/src/components/GroupingModal.story.vue +0 -52
  421. package/src/components/GroupingModal.vue +0 -422
  422. package/src/components/SettingsButton.story.vue +0 -58
  423. package/src/components/SettingsButton.vue +0 -76
  424. package/src/composables/usePluginApi.ts +0 -39
  425. package/src/styles/components/grouping-modal.css +0 -323
  426. package/src/styles/components/settings-button.css +0 -94
  427. /package/dist/components/{ToastNotification.vue.d.ts → AppToastContainer.vue.d.ts} +0 -0
@@ -27,23 +27,23 @@ export { default as FileUploader } from './FileUploader.vue'
27
27
 
28
28
  // Feedback components
29
29
  export { default as AlertBox } from './AlertBox.vue'
30
- export { default as ToastNotification } from './ToastNotification.vue'
31
- export { default as AppToastContainer } from './ToastNotification.vue'
30
+ export { default as AppToastContainer } from './AppToastContainer.vue'
32
31
 
33
32
  // Action components
34
33
  export { default as IconButton } from './IconButton.vue'
35
34
  export { default as ThemeToggle } from './ThemeToggle.vue'
36
- export { default as SettingsButton } from './SettingsButton.vue'
37
35
 
38
36
  // Layout components
39
37
  export { default as CollapsibleCard } from './CollapsibleCard.vue'
40
38
  export { default as AppTopBar } from './AppTopBar.vue'
41
- export { default as AppPageSelector } from './AppPageSelector.vue'
42
- export { default as AppPillNav } from './AppPillNav.vue'
43
39
  export { default as AppAvatarMenu } from './AppAvatarMenu.vue'
44
40
  export { default as AppPluginSwitcher } from './AppPluginSwitcher.vue'
45
41
  export { default as AppSidebar } from './AppSidebar.vue'
46
42
  export { default as AppLayout } from './AppLayout.vue'
43
+ export { default as PluginWorkspaceView } from './PluginWorkspaceView.vue'
44
+ export { default as ComponentBindingRenderer } from './ComponentBindingRenderer.vue'
45
+ export { default as ControlWorkspaceView } from './ControlWorkspaceView.vue'
46
+ export { default as DoseDesignWorkspaceView } from './DoseDesignWorkspaceView.vue'
47
47
  export { default as AppContainer } from './AppContainer.vue'
48
48
  export { default as PluginIcon } from './PluginIcon.vue'
49
49
 
@@ -62,6 +62,10 @@ export { default as ChartContainer } from './ChartContainer.vue'
62
62
  export { default as SettingsModal } from './SettingsModal.vue'
63
63
 
64
64
  // Biological experiment components
65
+ export { default as BioTemplateRenderer } from './BioTemplateRenderer.vue'
66
+ export { default as BioTemplateExperimentWorkspaceView } from './BioTemplateExperimentWorkspaceView.vue'
67
+ export { default as BioTemplatePackWorkspaceView } from './BioTemplatePackWorkspaceView.vue'
68
+ export { default as BioTemplatePresetWorkspaceView } from './BioTemplatePresetWorkspaceView.vue'
65
69
  export { default as WellPlate } from './WellPlate.vue'
66
70
  export { default as RackEditor } from './RackEditor.vue'
67
71
  export { default as SampleLegend } from './SampleLegend.vue'
@@ -70,7 +74,6 @@ export { default as ExperimentTimeline } from './ExperimentTimeline.vue'
70
74
 
71
75
  // Sample management components
72
76
  export { default as SampleSelector } from './SampleSelector.vue'
73
- export { default as GroupingModal } from './GroupingModal.vue'
74
77
  export { default as AutoGroupModal } from './AutoGroupModal.vue'
75
78
  export { default as GroupAssigner } from './GroupAssigner.vue'
76
79
 
@@ -99,9 +102,7 @@ export { default as BatchProgressList } from './BatchProgressList.vue'
99
102
 
100
103
  // Form builder components
101
104
  export { default as FormBuilder } from './FormBuilder.vue'
102
- export { default as FormSection } from './FormSection.vue'
103
105
  export { default as FormActions } from './FormActions.vue'
104
- export { default as FormFieldRenderer } from './FormFieldRenderer.vue'
105
106
 
106
107
  // Experiment data display components
107
108
  export { default as ExperimentDataViewer } from './ExperimentDataViewer.vue'
@@ -0,0 +1,82 @@
1
+ <script setup lang="ts">
2
+ /** Private routable action primitive for SDK nav and menu components. */
3
+ defineOptions({ inheritAttrs: false })
4
+
5
+ interface Props {
6
+ href?: string
7
+ to?: string | Record<string, unknown>
8
+ disabled?: boolean
9
+ type?: 'button' | 'submit' | 'reset'
10
+ }
11
+
12
+ const props = withDefaults(defineProps<Props>(), {
13
+ disabled: false,
14
+ type: 'button',
15
+ })
16
+
17
+ const emit = defineEmits<{
18
+ click: [event: MouseEvent]
19
+ }>()
20
+
21
+ type RouterNavigate = (event?: MouseEvent) => unknown
22
+
23
+ function blockDisabledEvent(event: MouseEvent) {
24
+ event.preventDefault()
25
+ event.stopImmediatePropagation()
26
+ }
27
+
28
+ function handleClick(event: MouseEvent) {
29
+ if (props.disabled) {
30
+ blockDisabledEvent(event)
31
+ return
32
+ }
33
+ emit('click', event)
34
+ }
35
+
36
+ function handleRouterClick(event: MouseEvent, navigate: RouterNavigate) {
37
+ if (props.disabled) {
38
+ blockDisabledEvent(event)
39
+ return
40
+ }
41
+ emit('click', event)
42
+ void navigate(event)
43
+ }
44
+ </script>
45
+
46
+ <template>
47
+ <a
48
+ v-if="href"
49
+ v-bind="$attrs"
50
+ :href="disabled ? undefined : href"
51
+ :aria-disabled="disabled || undefined"
52
+ :tabindex="disabled ? -1 : undefined"
53
+ @click="handleClick"
54
+ >
55
+ <slot />
56
+ </a>
57
+ <router-link
58
+ v-else-if="to"
59
+ :to="to"
60
+ custom
61
+ v-slot="{ href: routerHref, navigate }"
62
+ >
63
+ <a
64
+ v-bind="$attrs"
65
+ :href="disabled ? undefined : routerHref"
66
+ :aria-disabled="disabled || undefined"
67
+ :tabindex="disabled ? -1 : undefined"
68
+ @click="handleRouterClick($event, navigate)"
69
+ >
70
+ <slot />
71
+ </a>
72
+ </router-link>
73
+ <button
74
+ v-else
75
+ v-bind="$attrs"
76
+ :type="type"
77
+ :disabled="disabled"
78
+ @click="handleClick"
79
+ >
80
+ <slot />
81
+ </button>
82
+ </template>
@@ -0,0 +1,128 @@
1
+ <script setup lang="ts">
2
+ /** Dropdown trigger that switches between named pages, closing on outside click or Escape. */
3
+ import { computed } from 'vue'
4
+ import { useDropdownState } from '../../composables/useDropdownState'
5
+ import type { PageSelectorItem, PageSelectorItemInput } from '../../types/components'
6
+ import { normalizeItemInput } from '../../utils/items'
7
+ import { isPluginIconFormat } from '../../utils/pluginIcon'
8
+ import ActionItemInternal from './ActionItemInternal.vue'
9
+ import PluginIcon from '../PluginIcon.vue'
10
+
11
+ interface Props {
12
+ pages: PageSelectorItemInput[]
13
+ currentPageId?: string
14
+ placeholder?: string
15
+ minWidth?: string
16
+ }
17
+
18
+ const props = withDefaults(defineProps<Props>(), {
19
+ placeholder: 'Go to…',
20
+ minWidth: '11.25rem',
21
+ })
22
+
23
+ const emit = defineEmits<{
24
+ select: [page: PageSelectorItem]
25
+ }>()
26
+
27
+ const { isOpen, rootRef, close, toggle } = useDropdownState()
28
+ const normalizedPages = computed<PageSelectorItem[]>(() => props.pages.map(normalizeItemInput))
29
+
30
+ const current = computed<PageSelectorItem | undefined>(() =>
31
+ normalizedPages.value.find((p) => p.id === props.currentPageId) ?? normalizedPages.value[0],
32
+ )
33
+
34
+ function handleSelect(page: PageSelectorItem) {
35
+ if (page.disabled) return
36
+ if (page.href || page.to) {
37
+ close()
38
+ return
39
+ }
40
+ emit('select', page)
41
+ close()
42
+ }
43
+ </script>
44
+
45
+ <template>
46
+ <div ref="rootRef" class="mint-page-selector" :style="{ minWidth }">
47
+ <button
48
+ type="button"
49
+ class="mint-page-selector__trigger"
50
+ :class="{ 'mint-page-selector__trigger--open': isOpen }"
51
+ :aria-expanded="isOpen"
52
+ aria-haspopup="menu"
53
+ @click.stop="toggle"
54
+ >
55
+ <span
56
+ v-if="current"
57
+ class="mint-page-selector__icon"
58
+ :class="{ 'mint-page-selector__icon--metadata': isPluginIconFormat(current.icon) }"
59
+ >
60
+ <slot name="icon" :page="current">
61
+ <PluginIcon
62
+ v-if="isPluginIconFormat(current.icon)"
63
+ class="mint-page-selector__trigger-metadata-icon"
64
+ :icon="current.icon"
65
+ size="sm"
66
+ variant="tinted"
67
+ />
68
+ <span v-else class="mint-page-selector__icon-fallback">{{ current.label.charAt(0) }}</span>
69
+ </slot>
70
+ </span>
71
+ <span class="mint-page-selector__label">{{ current?.label ?? placeholder }}</span>
72
+ <span class="mint-page-selector__chevron-wrap" aria-hidden="true">
73
+ <svg
74
+ class="mint-page-selector__chevron"
75
+ :class="{ 'mint-page-selector__chevron--open': isOpen }"
76
+ viewBox="0 0 24 24"
77
+ fill="none"
78
+ stroke="currentColor"
79
+ stroke-width="2"
80
+ stroke-linecap="round"
81
+ stroke-linejoin="round"
82
+ >
83
+ <path d="m6 9 6 6 6-6" />
84
+ </svg>
85
+ </span>
86
+ </button>
87
+
88
+ <div v-if="isOpen" class="mint-page-selector__menu" role="menu">
89
+ <div class="mint-page-selector__menu-title">Go to</div>
90
+ <ActionItemInternal
91
+ v-for="page in normalizedPages"
92
+ :key="page.id"
93
+ :href="page.href"
94
+ :to="page.to"
95
+ :disabled="page.disabled"
96
+ :class="[
97
+ 'mint-page-selector__item',
98
+ { 'mint-page-selector__item--active': page.id === current?.id },
99
+ { 'mint-page-selector__item--disabled': page.disabled },
100
+ ]"
101
+ role="menuitem"
102
+ @click="handleSelect(page)"
103
+ >
104
+ <span
105
+ class="mint-page-selector__item-icon"
106
+ :class="{ 'mint-page-selector__item-icon--metadata': isPluginIconFormat(page.icon) }"
107
+ >
108
+ <slot name="item-icon" :page="page">
109
+ <PluginIcon
110
+ v-if="isPluginIconFormat(page.icon)"
111
+ class="mint-page-selector__metadata-icon"
112
+ :icon="page.icon"
113
+ size="sm"
114
+ variant="tinted"
115
+ />
116
+ <span v-else class="mint-page-selector__icon-fallback">{{ page.label.charAt(0) }}</span>
117
+ </slot>
118
+ </span>
119
+ <span class="mint-page-selector__item-label">{{ page.label }}</span>
120
+ <span v-if="page.hint" class="mint-page-selector__item-hint">{{ page.hint }}</span>
121
+ </ActionItemInternal>
122
+ </div>
123
+ </div>
124
+ </template>
125
+
126
+ <style>
127
+ @import '../../styles/components/app-page-selector.css';
128
+ </style>
@@ -0,0 +1,194 @@
1
+ <script setup lang="ts">
2
+ /** Horizontal pill-style navigation bar that emits select events and supports href, router-link, button, or dropdown items. */
3
+ import { computed, ref } from 'vue'
4
+ import type { PillNavItem, PillNavItemInput, PillNavOption, PillNavOptionInput } from '../../types/components'
5
+ import { normalizeItemInput } from '../../utils/items'
6
+ import { useEventListener } from '../../composables/useEventListener'
7
+ import ActionItemInternal from './ActionItemInternal.vue'
8
+
9
+ interface Props {
10
+ items: PillNavItemInput[]
11
+ currentItemId?: string
12
+ }
13
+
14
+ const props = defineProps<Props>()
15
+
16
+ const emit = defineEmits<{
17
+ select: [item: PillNavItem]
18
+ 'option-select': [option: PillNavOption, item: PillNavItem]
19
+ }>()
20
+
21
+ const openItemId = ref<string | null>(null)
22
+ const itemRefs = ref<Map<string, HTMLElement>>(new Map())
23
+
24
+ const normalizedItems = computed<PillNavItem[]>(() => props.items.map(normalizePillNavItem))
25
+
26
+ function handleClick(item: PillNavItem) {
27
+ if (item.disabled) return
28
+ if (item.children?.length) {
29
+ toggleDropdown(item.id)
30
+ return
31
+ }
32
+ if (item.href || item.to) return
33
+ emit('select', item)
34
+ }
35
+
36
+ function handleOptionClick(option: PillNavOption, item: PillNavItem) {
37
+ if (option.disabled) return
38
+ if (!option.href && !option.to) emit('option-select', option, item)
39
+ openItemId.value = null
40
+ }
41
+
42
+ function normalizePillNavItem(item: PillNavItemInput): PillNavItem {
43
+ const normalized = normalizeItemInput<Omit<PillNavItem, 'children'> & { children?: PillNavOptionInput[] }>(item)
44
+ return {
45
+ ...normalized,
46
+ children: normalized.children?.map(normalizeItemInput),
47
+ }
48
+ }
49
+
50
+ function toggleDropdown(itemId: string) {
51
+ openItemId.value = openItemId.value === itemId ? null : itemId
52
+ }
53
+
54
+ function setItemRef(el: HTMLElement | null, itemId: string) {
55
+ if (el) {
56
+ itemRefs.value.set(itemId, el)
57
+ } else {
58
+ itemRefs.value.delete(itemId)
59
+ }
60
+ }
61
+
62
+ function handleClickOutside(event: MouseEvent) {
63
+ const target = event.target as Node
64
+ const clickedInside = Array.from(itemRefs.value.values()).some(el => el.contains(target))
65
+ if (!clickedInside) openItemId.value = null
66
+ }
67
+
68
+ const hasActiveChild = (item: PillNavItem) =>
69
+ item.children?.some(child => child.id === props.currentItemId) ?? false
70
+
71
+ function isSvgIcon(icon: PillNavItem['icon']): icon is string | string[] {
72
+ if (!icon) return false
73
+ return Array.isArray(icon) || icon.startsWith('M') || icon.startsWith('m')
74
+ }
75
+
76
+ useEventListener(() => document, 'click', handleClickOutside)
77
+ </script>
78
+
79
+ <template>
80
+ <nav class="mint-pill-nav" aria-label="Primary">
81
+ <div
82
+ v-for="item in normalizedItems"
83
+ :key="item.id"
84
+ :ref="(el) => setItemRef(el as HTMLElement | null, item.id)"
85
+ class="mint-pill-nav__item-wrap"
86
+ >
87
+ <button
88
+ v-if="item.children?.length"
89
+ type="button"
90
+ :class="[
91
+ 'mint-pill-nav__item',
92
+ { 'mint-pill-nav__item--active': item.id === currentItemId || hasActiveChild(item) },
93
+ { 'mint-pill-nav__item--disabled': item.disabled },
94
+ ]"
95
+ :disabled="item.disabled"
96
+ :aria-expanded="openItemId === item.id"
97
+ aria-haspopup="menu"
98
+ @click.stop="handleClick(item)"
99
+ >
100
+ <svg
101
+ v-if="isSvgIcon(item.icon)"
102
+ class="mint-pill-nav__icon"
103
+ viewBox="0 0 24 24"
104
+ fill="none"
105
+ stroke="currentColor"
106
+ stroke-width="2"
107
+ stroke-linecap="round"
108
+ stroke-linejoin="round"
109
+ aria-hidden="true"
110
+ >
111
+ <template v-if="Array.isArray(item.icon)">
112
+ <path v-for="(d, index) in item.icon" :key="index" :d="d" />
113
+ </template>
114
+ <path v-else :d="item.icon" />
115
+ </svg>
116
+ {{ item.label }}
117
+ <svg
118
+ class="mint-pill-nav__chevron"
119
+ :class="{ 'mint-pill-nav__chevron--open': openItemId === item.id }"
120
+ viewBox="0 0 24 24"
121
+ fill="none"
122
+ stroke="currentColor"
123
+ stroke-width="2"
124
+ stroke-linecap="round"
125
+ stroke-linejoin="round"
126
+ aria-hidden="true"
127
+ >
128
+ <path d="m6 9 6 6 6-6" />
129
+ </svg>
130
+ </button>
131
+
132
+ <ActionItemInternal
133
+ v-else
134
+ :href="item.href"
135
+ :to="item.to"
136
+ :disabled="item.disabled"
137
+ :class="[
138
+ 'mint-pill-nav__item',
139
+ { 'mint-pill-nav__item--active': item.id === currentItemId },
140
+ { 'mint-pill-nav__item--disabled': item.disabled },
141
+ ]"
142
+ @click="handleClick(item)"
143
+ >
144
+ <svg
145
+ v-if="isSvgIcon(item.icon)"
146
+ class="mint-pill-nav__icon"
147
+ viewBox="0 0 24 24"
148
+ fill="none"
149
+ stroke="currentColor"
150
+ stroke-width="2"
151
+ stroke-linecap="round"
152
+ stroke-linejoin="round"
153
+ aria-hidden="true"
154
+ >
155
+ <template v-if="Array.isArray(item.icon)">
156
+ <path v-for="(d, index) in item.icon" :key="index" :d="d" />
157
+ </template>
158
+ <path v-else :d="item.icon" />
159
+ </svg>
160
+ {{ item.label }}
161
+ </ActionItemInternal>
162
+
163
+ <div
164
+ v-if="item.children?.length && openItemId === item.id"
165
+ class="mint-pill-nav__dropdown"
166
+ role="menu"
167
+ >
168
+ <ActionItemInternal
169
+ v-for="option in item.children"
170
+ :key="option.id"
171
+ :href="option.href"
172
+ :to="option.to"
173
+ :disabled="option.disabled"
174
+ :class="[
175
+ 'mint-pill-nav__dropdown-item',
176
+ { 'mint-pill-nav__dropdown-item--active': option.id === currentItemId },
177
+ { 'mint-pill-nav__dropdown-item--disabled': option.disabled },
178
+ ]"
179
+ role="menuitem"
180
+ @click="handleOptionClick(option, item)"
181
+ >
182
+ <span class="mint-pill-nav__dropdown-label">{{ option.label }}</span>
183
+ <span v-if="option.description" class="mint-pill-nav__dropdown-description">
184
+ {{ option.description }}
185
+ </span>
186
+ </ActionItemInternal>
187
+ </div>
188
+ </div>
189
+ </nav>
190
+ </template>
191
+
192
+ <style>
193
+ @import '../../styles/components/app-pill-nav.css';
194
+ </style>
@@ -0,0 +1,120 @@
1
+ <script setup lang="ts">
2
+ /** Shared calendar grid panel used by date-oriented picker components. */
3
+ import type { CalendarGridDay } from '../../composables/useCalendarGrid'
4
+
5
+ interface Props {
6
+ weekDays: readonly string[]
7
+ monthYear: string
8
+ days: CalendarGridDay[]
9
+ selectedDate?: Date | null
10
+ locale?: string
11
+ previousLabel?: string
12
+ nextLabel?: string
13
+ }
14
+
15
+ const props = withDefaults(defineProps<Props>(), {
16
+ selectedDate: null,
17
+ locale: 'en-US',
18
+ previousLabel: 'Previous month',
19
+ nextLabel: 'Next month',
20
+ })
21
+
22
+ const emit = defineEmits<{
23
+ 'previous-month': []
24
+ 'next-month': []
25
+ select: [day: CalendarGridDay]
26
+ }>()
27
+
28
+ function isSameDay(date: Date, other: Date | null | undefined): boolean {
29
+ if (!other) return false
30
+ return date.toDateString() === other.toDateString()
31
+ }
32
+
33
+ function isToday(date: Date): boolean {
34
+ return isSameDay(date, new Date())
35
+ }
36
+
37
+ function dayAriaLabel(date: Date): string {
38
+ return date.toLocaleDateString(props.locale, {
39
+ weekday: 'long',
40
+ year: 'numeric',
41
+ month: 'long',
42
+ day: 'numeric',
43
+ })
44
+ }
45
+ </script>
46
+
47
+ <template>
48
+ <div class="mint-calendar-grid-panel">
49
+ <div class="mint-date-picker__header">
50
+ <button
51
+ type="button"
52
+ class="mint-date-picker__nav-btn"
53
+ :aria-label="previousLabel"
54
+ @click="emit('previous-month')"
55
+ >
56
+ <svg
57
+ viewBox="0 0 24 24"
58
+ fill="none"
59
+ stroke="currentColor"
60
+ stroke-width="2"
61
+ stroke-linecap="round"
62
+ stroke-linejoin="round"
63
+ aria-hidden="true"
64
+ >
65
+ <path d="m15 18-6-6 6-6" />
66
+ </svg>
67
+ </button>
68
+ <span class="mint-date-picker__month-year">{{ monthYear }}</span>
69
+ <button
70
+ type="button"
71
+ class="mint-date-picker__nav-btn"
72
+ :aria-label="nextLabel"
73
+ @click="emit('next-month')"
74
+ >
75
+ <svg
76
+ viewBox="0 0 24 24"
77
+ fill="none"
78
+ stroke="currentColor"
79
+ stroke-width="2"
80
+ stroke-linecap="round"
81
+ stroke-linejoin="round"
82
+ aria-hidden="true"
83
+ >
84
+ <path d="m9 18 6-6-6-6" />
85
+ </svg>
86
+ </button>
87
+ </div>
88
+
89
+ <div class="mint-date-picker__weekdays">
90
+ <div
91
+ v-for="day in weekDays"
92
+ :key="day"
93
+ class="mint-date-picker__weekday"
94
+ >
95
+ {{ day }}
96
+ </div>
97
+ </div>
98
+
99
+ <div class="mint-date-picker__grid">
100
+ <button
101
+ v-for="(day, index) in days"
102
+ :key="index"
103
+ type="button"
104
+ :disabled="day.isDisabled"
105
+ :aria-label="dayAriaLabel(day.date)"
106
+ :aria-selected="isSameDay(day.date, selectedDate)"
107
+ :class="[
108
+ 'mint-date-picker__day',
109
+ !day.isCurrentMonth ? 'mint-date-picker__day--other-month' : '',
110
+ day.isDisabled ? 'mint-date-picker__day--disabled' : '',
111
+ isSameDay(day.date, selectedDate) ? 'mint-date-picker__day--selected' : '',
112
+ isToday(day.date) && !isSameDay(day.date, selectedDate) ? 'mint-date-picker__day--today' : '',
113
+ ]"
114
+ @click="emit('select', day)"
115
+ >
116
+ {{ day.date.getDate() }}
117
+ </button>
118
+ </div>
119
+ </div>
120
+ </template>
@@ -1,17 +1,9 @@
1
1
  <script setup lang="ts">
2
- /**
3
- * Renders a single form field inside a FormField wrapper.
4
- *
5
- * Resolves the SDK component for the field type from the registry, shows
6
- * validation errors only after the field has been touched, and handles the
7
- * FileUploader's event-based upload pattern via `handleUpload`. Consumers can
8
- * override rendering via the `field:<name>` slot.
9
- */
10
2
  import { computed } from 'vue'
11
- import type { FormFieldSchema } from '../types/form-builder'
12
- import type { UseFormReturn } from '../composables/useForm'
13
- import { getFieldRegistryEntry } from '../composables/formBuilderRegistry'
14
- import FormField from './FormField.vue'
3
+ import type { FormFieldSchema } from '../../types/form-builder'
4
+ import type { UseFormReturn } from '../../composables/useForm'
5
+ import { getFieldRegistryEntry } from '../../composables/formBuilderRegistry'
6
+ import FormField from '../FormField.vue'
15
7
 
16
8
  interface Props {
17
9
  field: FormFieldSchema
@@ -1,18 +1,8 @@
1
1
  <script setup lang="ts">
2
- /**
3
- * Renders a single `FormSectionSchema` inside a FormBuilder.
4
- *
5
- * Filters out hidden fields before rendering, applies the section's column
6
- * grid and per-field `colSpan`, and switches between a collapsible
7
- * (`CollapsibleCard`) and a static layout based on `section.collapsible`.
8
- * The entire section is hidden when all its fields are hidden. Consumers can
9
- * replace the section body via `section:<id>` or inject content after it via
10
- * `section:<id>:after`, and override individual fields via `field:<name>`.
11
- */
12
2
  import { computed } from 'vue'
13
- import type { FormSectionSchema, UseFormBuilderReturn } from '../types/form-builder'
14
- import CollapsibleCard from './CollapsibleCard.vue'
15
- import FormFieldRenderer from './FormFieldRenderer.vue'
3
+ import type { FormSectionSchema, UseFormBuilderReturn } from '../../types/form-builder'
4
+ import CollapsibleCard from '../CollapsibleCard.vue'
5
+ import FormFieldRendererInternal from './FormFieldRendererInternal.vue'
16
6
 
17
7
  interface Props {
18
8
  section: FormSectionSchema
@@ -33,7 +23,6 @@ const gridStyle = computed(() => ({
33
23
  <template>
34
24
  <div v-if="visibleFields.length > 0" class="mint-form-section">
35
25
  <slot :name="`section:${section.id}`" :section="section" :form="builder.form">
36
- <!-- Collapsible variant -->
37
26
  <CollapsibleCard
38
27
  v-if="section.collapsible"
39
28
  :title="section.title"
@@ -47,7 +36,7 @@ const gridStyle = computed(() => ({
47
36
  :style="field.colSpan ? { gridColumn: `span ${field.colSpan}` } : undefined"
48
37
  >
49
38
  <slot :name="`field:${field.name}`" :field="field" :form="builder.form" :field-props="builder.form.getFieldProps(field.name)">
50
- <FormFieldRenderer
39
+ <FormFieldRendererInternal
51
40
  :field="field"
52
41
  :resolved-props="builder.getResolvedFieldProps(field)"
53
42
  :form="builder.form"
@@ -57,7 +46,6 @@ const gridStyle = computed(() => ({
57
46
  </div>
58
47
  </CollapsibleCard>
59
48
 
60
- <!-- Static variant -->
61
49
  <div v-else class="mint-form-section--static">
62
50
  <div v-if="section.title || section.description" class="mint-form-section__header">
63
51
  <h3 v-if="section.title" class="mint-form-section__title">{{ section.title }}</h3>
@@ -70,7 +58,7 @@ const gridStyle = computed(() => ({
70
58
  :style="field.colSpan ? { gridColumn: `span ${field.colSpan}` } : undefined"
71
59
  >
72
60
  <slot :name="`field:${field.name}`" :field="field" :form="builder.form" :field-props="builder.form.getFieldProps(field.name)">
73
- <FormFieldRenderer
61
+ <FormFieldRendererInternal
74
62
  :field="field"
75
63
  :resolved-props="builder.getResolvedFieldProps(field)"
76
64
  :form="builder.form"
@@ -86,5 +74,5 @@ const gridStyle = computed(() => ({
86
74
  </template>
87
75
 
88
76
  <style>
89
- @import '../styles/components/form-builder.css';
77
+ @import '../../styles/components/form-builder.css';
90
78
  </style>