@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
@@ -1,4 +1,4 @@
1
- import { ref, computed, type ComputedRef } from 'vue'
1
+ import { ref, computed, toRaw, type ComputedRef } from 'vue'
2
2
  import type {
3
3
  PlateMapEditorState,
4
4
  PlateMap,
@@ -73,6 +73,10 @@ function generateSampleId(): string {
73
73
  return `sample-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`
74
74
  }
75
75
 
76
+ function cloneValue<T>(value: T): T {
77
+ return structuredClone(toRaw(value))
78
+ }
79
+
76
80
  /** Manages multi-plate well-plate state with sample assignment, selection, and undo/redo history. */
77
81
  export function useWellPlateEditor(
78
82
  initialState?: Partial<PlateMapEditorState>,
@@ -107,8 +111,8 @@ export function useWellPlateEditor(
107
111
 
108
112
  function saveToHistory() {
109
113
  const entry: HistoryEntry = {
110
- plates: structuredClone(internalState.value.plates),
111
- samples: structuredClone(internalState.value.samples),
114
+ plates: cloneValue(internalState.value.plates),
115
+ samples: cloneValue(internalState.value.samples),
112
116
  }
113
117
 
114
118
  if (historyIndex.value < history.value.length - 1) {
@@ -255,8 +259,8 @@ export function useWellPlateEditor(
255
259
  const entry = history.value[historyIndex.value]
256
260
  historyIndex.value--
257
261
 
258
- internalState.value.plates = structuredClone(entry.plates)
259
- internalState.value.samples = structuredClone(entry.samples)
262
+ internalState.value.plates = cloneValue(entry.plates)
263
+ internalState.value.samples = cloneValue(entry.samples)
260
264
 
261
265
  const activePlateExists = internalState.value.plates.some(p => p.id === internalState.value.activePlateId)
262
266
  if (!activePlateExists) {
@@ -271,8 +275,8 @@ export function useWellPlateEditor(
271
275
  historyIndex.value++
272
276
  const entry = history.value[historyIndex.value]
273
277
 
274
- internalState.value.plates = structuredClone(entry.plates)
275
- internalState.value.samples = structuredClone(entry.samples)
278
+ internalState.value.plates = cloneValue(entry.plates)
279
+ internalState.value.samples = cloneValue(entry.samples)
276
280
  internalState.value.selectedWells = []
277
281
  }
278
282
 
@@ -369,11 +373,11 @@ export function useWellPlateEditor(
369
373
  function loadState(state: Partial<PlateMapEditorState>) {
370
374
  saveToHistory()
371
375
  if (state.plates && state.plates.length > 0) {
372
- internalState.value.plates = structuredClone(state.plates)
376
+ internalState.value.plates = cloneValue(state.plates)
373
377
  internalState.value.activePlateId = state.activePlateId ?? state.plates[0].id
374
378
  }
375
379
  if (state.samples) {
376
- internalState.value.samples = structuredClone(state.samples)
380
+ internalState.value.samples = cloneValue(state.samples)
377
381
  }
378
382
  internalState.value.selectedWells = state.selectedWells ?? []
379
383
  internalState.value.activeSampleId = state.activeSampleId
package/src/index.ts CHANGED
@@ -17,6 +17,7 @@ export {
17
17
  ColorSlider,
18
18
  BaseTabs,
19
19
  BaseModal,
20
+ FormBuilder,
20
21
  FormField,
21
22
  DatePicker,
22
23
  TimePicker,
@@ -24,11 +25,9 @@ export {
24
25
  NumberInput,
25
26
  FileUploader,
26
27
  AlertBox,
27
- ToastNotification,
28
28
  AppToastContainer,
29
29
  IconButton,
30
30
  ThemeToggle,
31
- SettingsButton,
32
31
  CollapsibleCard,
33
32
  AppTopBar,
34
33
  AppPageSelector,
@@ -37,7 +36,9 @@ export {
37
36
  AppPluginSwitcher,
38
37
  AppSidebar,
39
38
  AppLayout,
39
+ ControlWorkspaceView,
40
40
  AppContainer,
41
+ PluginIcon,
41
42
  Skeleton,
42
43
  // Biological experiment components
43
44
  WellPlate,
@@ -47,7 +48,6 @@ export {
47
48
  ExperimentTimeline,
48
49
  // Sample management components
49
50
  SampleSelector,
50
- GroupingModal,
51
51
  AutoGroupModal,
52
52
  GroupAssigner,
53
53
  // Lab/Experiment components
@@ -100,8 +100,21 @@ export {
100
100
  ExperimentSelectorModal,
101
101
  ExperimentPopover,
102
102
  FitPanel,
103
+ BioTemplateRenderer,
104
+ BioTemplateExperimentWorkspaceView,
105
+ BioTemplatePackWorkspaceView,
106
+ BioTemplatePresetWorkspaceView,
103
107
  } from './components'
104
108
 
109
+ /** @deprecated Use AppToastContainer instead. */
110
+ export { ToastNotification } from './components'
111
+
112
+ /** @deprecated Use AppTopBar settingsConfig or SettingsModal instead. */
113
+ export { SettingsButton } from './components'
114
+
115
+ /** @deprecated Use AutoGroupModal instead. */
116
+ export { GroupingModal } from './components'
117
+
105
118
  // Composables
106
119
  export {
107
120
  useApi,
@@ -127,6 +140,14 @@ export {
127
140
  type ConcentrationUnit,
128
141
  type VolumeValue,
129
142
  type VolumeUnit,
143
+ type DilutionParams,
144
+ type DilutionResult,
145
+ type SerialDilutionParams,
146
+ type SerialDilutionStep,
147
+ type SerialDilutionResult,
148
+ type ConversionResult,
149
+ type WellConcentration,
150
+ type UseDoseCalculatorReturn,
130
151
  type StepTemplate,
131
152
  type FormulaParseResult,
132
153
  type FormulaPart,
@@ -146,6 +167,16 @@ export {
146
167
  compareTime,
147
168
  // Schedule drag
148
169
  useScheduleDrag,
170
+ // DOM events
171
+ useEventListener,
172
+ type EventListenerEnabled,
173
+ type EventFor,
174
+ type EventListenerStop,
175
+ type EventMapFor,
176
+ type EventTargetGetter,
177
+ type EventTargetLike,
178
+ type UseEventListenerObjectOptions,
179
+ type UseEventListenerOptions,
149
180
  // Plugin config
150
181
  usePluginConfig,
151
182
  type UsePluginConfigReturn,
@@ -177,7 +208,169 @@ export {
177
208
  useExperimentSave,
178
209
  type UseExperimentSaveOptions,
179
210
  type UseExperimentSaveReturn,
180
- // Plugin API (auto base URL detection)
211
+ // Template collection persistence
212
+ useTemplateCollection,
213
+ type TemplateCollectionInput,
214
+ type UseTemplateCollectionOptions,
215
+ type UseTemplateCollectionReturn,
216
+ useRequestSyncState,
217
+ type RequestSyncRunOptions,
218
+ type RequestSyncSuccessKind,
219
+ type UseRequestSyncStateReturn,
220
+ useSelectionLimit,
221
+ type SelectionLimitSource,
222
+ type UseSelectionLimitOptions,
223
+ type UseSelectionLimitReturn,
224
+ useListSelection,
225
+ type ListSelectionSource,
226
+ type ListSelectionValue,
227
+ type UseListSelectionOptions,
228
+ type UseListSelectionReturn,
229
+ type WidenListSelectionValue,
230
+ useGroupAssignment,
231
+ type GroupAssignmentSource,
232
+ type GroupAssignmentState,
233
+ type GroupAssignmentZone,
234
+ type UseGroupAssignmentOptions,
235
+ type UseGroupAssignmentReturn,
236
+ useSampleGroups,
237
+ type DisplaySampleSubGroup,
238
+ type SampleGroupSource,
239
+ type SampleMajorGroup,
240
+ type UseSampleGroupsOptions,
241
+ type UseSampleGroupsReturn,
242
+ useExpansionSet,
243
+ type ExpansionSetSource,
244
+ type UseExpansionSetOptions,
245
+ type UseExpansionSetReturn,
246
+ compareSortValues,
247
+ useSortedItems,
248
+ type CompareSortValuesOptions,
249
+ type SortComparator,
250
+ type SortComparatorContext,
251
+ type SortDescriptor,
252
+ type SortedItemsSource,
253
+ type SortOrder,
254
+ type UseSortedItemsOptions,
255
+ type UseSortedItemsReturn,
256
+ candidateMatchesSearch,
257
+ normalizeSearchQuery,
258
+ useTextSearch,
259
+ type TextSearchCandidate,
260
+ type TextSearchSource,
261
+ type UseTextSearchOptions,
262
+ type UseTextSearchReturn,
263
+ // Schema-driven controls
264
+ controlsToFormSchema,
265
+ controlsToSectionFormSchema,
266
+ controlsToSectionFormSchemas,
267
+ controlsToSidebarPanels,
268
+ controlsToSettingsSchema,
269
+ controlsToTopBarSettingsConfig,
270
+ controlsToTopBarTabs,
271
+ controlsToViewIds,
272
+ controlsToViewItems,
273
+ controlValuesToComponentProps,
274
+ defineControlModel,
275
+ defineDoseDesignControlModel,
276
+ defineDoseCalculatorControlProps,
277
+ defineControls,
278
+ defineWellPlateControlProps,
279
+ defineWellPlateDoseControlProps,
280
+ getDefaultControlView,
281
+ getControlDefaults,
282
+ useControlSchema,
283
+ useControlWorkspace,
284
+ type ControlDefinition,
285
+ type ControlWorkspaceAppTopBarPillBinding,
286
+ type ControlWorkspaceAppTopBarTabsBinding,
287
+ type ControlWorkspaceComponentBindings,
288
+ type ControlComponentPropSource,
289
+ type ControlComponentPropsByIdMap,
290
+ type ControlComponentPropsMap,
291
+ type DoseDesignControlModelOptions,
292
+ type DoseCalculatorControlPropsOptions,
293
+ type ControlFormSchema,
294
+ type ControlInput,
295
+ type ControlModel,
296
+ type ControlModelBinding,
297
+ type ControlModelSectionConfig,
298
+ type ControlModelViewConfig,
299
+ type ControlOption,
300
+ type ControlOptionValue,
301
+ type ControlPrimitive,
302
+ type ControlSchema,
303
+ type ControlSchemaOptions,
304
+ type ControlShorthand,
305
+ type ControlWorkspaceOptions,
306
+ type ControlFormBinding,
307
+ type ControlSettingsBinding,
308
+ type ControlSidebarBinding,
309
+ type ControlSectionConfig,
310
+ type ControlSidebarConfig,
311
+ type ControlTopBarSettingsBinding,
312
+ type ControlViewConfig,
313
+ type ControlValues,
314
+ type UseControlSchemaReturn,
315
+ type ControlWorkspaceFormBinding,
316
+ type ControlWorkspacePillNavBinding,
317
+ type ControlWorkspaceSidebarBinding,
318
+ type ControlWorkspaceTopBarBinding,
319
+ type ControlWorkspaceTopBarSettingsBinding,
320
+ type UseControlWorkspaceReturn,
321
+ type WellPlateControlPropsOptions,
322
+ type WellPlateDoseControlPropsOptions,
323
+ useBioTemplateControls,
324
+ getBioTemplateControlSchema,
325
+ requireBioTemplateControlSchema,
326
+ type BioTemplateControlSchema,
327
+ type BioTemplateControlTarget,
328
+ useBioTemplateComponents,
329
+ getBioTemplateComponentProps,
330
+ getBioTemplateComponentBindings,
331
+ toBioTemplateComponentProps,
332
+ toBioTemplateComponentPropsByComponent,
333
+ toBioTemplateComponentPropsById,
334
+ type BioTemplateComponentBinding,
335
+ type BioTemplateComponentPropsByComponent,
336
+ type BioTemplateComponentPropsBinding,
337
+ type BioTemplateComponentPropsById,
338
+ type BioTemplateComponentPropsLookupOptions,
339
+ type BioTemplateComponentTarget,
340
+ type UseBioTemplateComponentsReturn,
341
+ useBioTemplateWorkspace,
342
+ type BioTemplateRendererBinding,
343
+ type BioTemplateWorkspaceBindings,
344
+ type BioTemplateWorkspaceTarget,
345
+ type UseBioTemplateWorkspaceReturn,
346
+ useBioTemplatePresetWorkspace,
347
+ type BioTemplatePresetWorkspaceBindings,
348
+ type UseBioTemplatePresetWorkspaceOptions,
349
+ type UseBioTemplatePresetWorkspaceReturn,
350
+ useBioTemplatePackWorkspace,
351
+ type UseBioTemplatePackWorkspaceOptions,
352
+ type UseBioTemplatePackWorkspaceReturn,
353
+ // Generated plugin clients
354
+ buildPluginEndpointUrl,
355
+ createPluginClient,
356
+ resolvePluginBaseUrl,
357
+ usePluginClient,
358
+ usePluginSettings,
359
+ useCurrentExperiment,
360
+ type BuildPluginEndpointUrlOptions,
361
+ type PluginContract,
362
+ type PluginEndpointContract,
363
+ type PluginEndpointDefinition,
364
+ type PluginHttpMethod,
365
+ type PluginNavItemContract,
366
+ type CreatePluginClientOptions,
367
+ type UseCurrentExperimentOptions,
368
+ type UseCurrentExperimentReturn,
369
+ } from './composables'
370
+
371
+ // Legacy plugin API compatibility
372
+ /** @deprecated Use generated plugin clients from `mint sdk generate` instead. */
373
+ export {
181
374
  usePluginApi,
182
375
  type UsePluginApiOptions,
183
376
  } from './composables'
@@ -198,6 +391,9 @@ export {
198
391
  type Hsl,
199
392
  } from './utils/color'
200
393
 
394
+ // Biology data templates
395
+ export * from './templates'
396
+
201
397
  // Types
202
398
  export type {
203
399
  // Component types
@@ -209,18 +405,27 @@ export type {
209
405
  AlertType,
210
406
  Toast,
211
407
  TabItem,
408
+ TabItemInput,
409
+ OptionPrimitive,
212
410
  SelectOption,
411
+ SelectOptionInput,
213
412
  RadioOption,
413
+ RadioOptionInput,
214
414
  FormFieldProps,
215
415
  SidebarToolSection,
216
416
  CollapsibleState,
217
417
  TopBarVariant,
218
418
  TopBarPage,
419
+ TopBarPageInput,
219
420
  TopBarTab,
421
+ TopBarTabInput,
220
422
  TopBarTabOption,
423
+ TopBarTabOptionInput,
221
424
  TopBarSettingsConfig,
222
425
  PillNavItem,
426
+ PillNavItemInput,
223
427
  PageSelectorItem,
428
+ PageSelectorItemInput,
224
429
  PluginSwitcherPlugin,
225
430
  PluginSwitcherInfo,
226
431
  AccountMenuItem,
@@ -261,10 +466,12 @@ export type {
261
466
  FileUploaderMode,
262
467
  // SegmentedControl types
263
468
  SegmentedOption,
469
+ SegmentedOptionInput,
264
470
  SegmentedControlVariant,
265
471
  SegmentedControlSize,
266
472
  // MultiSelect types
267
473
  MultiSelectOption,
474
+ MultiSelectOptionInput,
268
475
  MultiSelectSize,
269
476
  // Pill types
270
477
  PillVariant,
@@ -295,12 +502,29 @@ export type {
295
502
  EmptyStateSize,
296
503
  // Breadcrumb types
297
504
  BreadcrumbItem,
505
+ BreadcrumbItemInput,
298
506
  // Tooltip types
299
507
  TooltipPosition,
300
508
  // ConfirmDialog types
301
509
  ConfirmVariant,
302
510
  // SettingsModal types
303
511
  SettingsTab,
512
+ SettingsTabInput,
513
+ SettingsModalLayout,
514
+ SettingsGroup,
515
+ SettingsModalSchema,
516
+ // FormBuilder types
517
+ FormFieldType,
518
+ FieldCondition,
519
+ FieldValidation,
520
+ FormFieldSchema,
521
+ FormOptionInput,
522
+ FormSectionSchema,
523
+ FormStepSchema,
524
+ FormSchema,
525
+ FieldEnhancement,
526
+ FormEnhancements,
527
+ UseFormBuilderReturn,
304
528
  // ScientificNumber types
305
529
  NumberNotation,
306
530
  // TimePicker types
package/src/install.ts CHANGED
@@ -1,6 +1,13 @@
1
- import type { App, Plugin } from 'vue'
2
1
  import * as components from './components'
3
2
 
3
+ type ComponentRegistryApp = {
4
+ component: (name: string, component: any) => unknown
5
+ }
6
+
7
+ export interface MINTSdkPlugin {
8
+ install(app: ComponentRegistryApp): void
9
+ }
10
+
4
11
  /**
5
12
  * Vue plugin that registers all MINT SDK components globally.
6
13
  *
@@ -14,8 +21,8 @@ import * as components from './components'
14
21
  * app.use(MINTSdk)
15
22
  * ```
16
23
  */
17
- export const MINTSdk: Plugin = {
18
- install(app: App) {
24
+ export const MINTSdk: MINTSdkPlugin = {
25
+ install(app) {
19
26
  for (const [name, component] of Object.entries(components)) {
20
27
  // Check if it's a valid Vue component (has setup, render, or template)
21
28
  if (
@@ -23,7 +30,7 @@ export const MINTSdk: Plugin = {
23
30
  typeof component === 'object' &&
24
31
  ('setup' in component || 'render' in component || '__name' in component)
25
32
  ) {
26
- app.component(name, component as Parameters<typeof app.component>[1])
33
+ app.component(name, component)
27
34
  }
28
35
  }
29
36
  },
@@ -82,6 +82,11 @@ function saveSettings(settings: SettingsState): void {
82
82
  }
83
83
  }
84
84
 
85
+ function getSystemPrefersDark(): boolean {
86
+ if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return false
87
+ return window.matchMedia('(prefers-color-scheme: dark)').matches
88
+ }
89
+
85
90
  export const useSettingsStore = defineStore('mint-settings', () => {
86
91
  // State
87
92
  const serverHost = ref(defaultSettings.serverHost)
@@ -90,6 +95,7 @@ export const useSettingsStore = defineStore('mint-settings', () => {
90
95
  const wsAutoReconnect = ref(defaultSettings.wsAutoReconnect)
91
96
  const wsReconnectInterval = ref(defaultSettings.wsReconnectInterval)
92
97
  const theme = ref<ThemeMode>(defaultSettings.theme)
98
+ const systemPrefersDark = ref(getSystemPrefersDark())
93
99
  const colorPalette = ref<ColorPalette>(defaultSettings.colorPalette)
94
100
  const tableDensity = ref<TableDensity>(defaultSettings.tableDensity)
95
101
 
@@ -139,9 +145,8 @@ export const useSettingsStore = defineStore('mint-settings', () => {
139
145
  }
140
146
 
141
147
  function applyTheme() {
142
- const dark = theme.value === 'system'
143
- ? window.matchMedia('(prefers-color-scheme: dark)').matches
144
- : theme.value === 'dark'
148
+ if (typeof document === 'undefined') return
149
+ const dark = theme.value === 'system' ? systemPrefersDark.value : theme.value === 'dark'
145
150
  document.documentElement.classList.toggle('dark', dark)
146
151
  }
147
152
 
@@ -150,8 +155,9 @@ export const useSettingsStore = defineStore('mint-settings', () => {
150
155
  persistSettings()
151
156
  })
152
157
 
153
- if (typeof window !== 'undefined') {
154
- window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
158
+ if (typeof window !== 'undefined' && typeof window.matchMedia === 'function') {
159
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (event) => {
160
+ systemPrefersDark.value = event.matches
155
161
  if (theme.value === 'system') {
156
162
  applyTheme()
157
163
  }
@@ -191,10 +197,7 @@ export const useSettingsStore = defineStore('mint-settings', () => {
191
197
  }
192
198
 
193
199
  function isDark(): boolean {
194
- if (theme.value === 'system') {
195
- return window.matchMedia('(prefers-color-scheme: dark)').matches
196
- }
197
- return theme.value === 'dark'
200
+ return theme.value === 'system' ? systemPrefersDark.value : theme.value === 'dark'
198
201
  }
199
202
 
200
203
  return {
@@ -204,6 +207,7 @@ export const useSettingsStore = defineStore('mint-settings', () => {
204
207
  wsAutoReconnect,
205
208
  wsReconnectInterval,
206
209
  theme,
210
+ systemPrefersDark,
207
211
  colorPalette,
208
212
  tableDensity,
209
213
  initialize,
@@ -69,6 +69,17 @@
69
69
  height: 0.875rem;
70
70
  }
71
71
 
72
+ .mint-page-selector__icon--metadata {
73
+ background: transparent;
74
+ color: inherit;
75
+ }
76
+
77
+ .mint-page-selector__trigger-metadata-icon.mint-plugin-icon--sm {
78
+ width: 1.5rem;
79
+ height: 1.5rem;
80
+ border-radius: 0.375rem;
81
+ }
82
+
72
83
  .mint-page-selector__icon-fallback {
73
84
  font-size: 0.6875rem;
74
85
  font-weight: 600;
@@ -175,11 +186,23 @@
175
186
  color: var(--color-primary);
176
187
  }
177
188
 
189
+ .mint-page-selector__item-icon--metadata,
190
+ .mint-page-selector__item--active .mint-page-selector__item-icon--metadata {
191
+ background: transparent;
192
+ color: inherit;
193
+ }
194
+
178
195
  .mint-page-selector__item-icon svg {
179
196
  width: 0.8125rem;
180
197
  height: 0.8125rem;
181
198
  }
182
199
 
200
+ .mint-page-selector__metadata-icon.mint-plugin-icon--sm {
201
+ width: 1.375rem;
202
+ height: 1.375rem;
203
+ border-radius: 0.3125rem;
204
+ }
205
+
183
206
  .mint-page-selector__item-label {
184
207
  flex: 1;
185
208
  }
@@ -12,9 +12,9 @@
12
12
  .mint-pill-nav__item {
13
13
  display: inline-flex;
14
14
  align-items: center;
15
+ gap: 0.375rem;
15
16
  border: 0;
16
- /* 1px optical centering offset for 13px text. See CLAUDE.md § Optical Centering. */
17
- padding: 0.3125rem 0.875rem 0.4375rem;
17
+ padding: 0.375rem 0.875rem;
18
18
  border-radius: 9999px;
19
19
  font-size: 0.8125rem;
20
20
  font-weight: 500;
@@ -55,3 +55,9 @@
55
55
  outline: none;
56
56
  box-shadow: var(--focus-ring);
57
57
  }
58
+
59
+ .mint-pill-nav__icon {
60
+ width: 0.875rem;
61
+ height: 0.875rem;
62
+ flex-shrink: 0;
63
+ }
@@ -255,6 +255,34 @@
255
255
  cursor: not-allowed;
256
256
  }
257
257
 
258
+ .mint-topbar-dropdown-item__page {
259
+ display: flex;
260
+ align-items: flex-start;
261
+ gap: 0.625rem;
262
+ width: 100%;
263
+ }
264
+
265
+ .mint-topbar-dropdown-item__icon {
266
+ width: 1rem;
267
+ height: 1rem;
268
+ flex-shrink: 0;
269
+ margin-top: 0.125rem;
270
+ }
271
+
272
+ .mint-topbar-dropdown-item__icon.mint-plugin-icon--sm {
273
+ width: 1.375rem;
274
+ height: 1.375rem;
275
+ border-radius: 0.3125rem;
276
+ margin-top: -0.0625rem;
277
+ }
278
+
279
+ .mint-topbar-dropdown-item__copy {
280
+ display: flex;
281
+ min-width: 0;
282
+ flex-direction: column;
283
+ align-items: flex-start;
284
+ }
285
+
258
286
  .mint-topbar-dropdown-item__label {
259
287
  font-weight: 500;
260
288
  }
@@ -278,8 +306,7 @@
278
306
  display: inline-flex;
279
307
  align-items: center;
280
308
  gap: 0.25rem;
281
- /* Asymmetric top/bottom padding Fira Sans optical centering. */
282
- padding: 0.3125rem 0.875rem 0.4375rem;
309
+ padding: 0.375rem 0.875rem;
283
310
  border: 0;
284
311
  background: transparent;
285
312
  border-radius: 9999px;
@@ -321,6 +348,12 @@
321
348
  transition: transform 0.15s ease;
322
349
  }
323
350
 
351
+ .mint-topbar-tab-icon {
352
+ width: 0.875rem;
353
+ height: 0.875rem;
354
+ flex-shrink: 0;
355
+ }
356
+
324
357
  .mint-topbar-tab-chevron--open {
325
358
  transform: rotate(180deg);
326
359
  }
@@ -133,24 +133,20 @@
133
133
  }
134
134
 
135
135
  /* Sizes */
136
- /* Optical centering: Fira Sans' cap-letter midpoint sits above the em-box center.
137
- Old rule (pre-0.16) compensated with a 2px upward shift; user testing showed
138
- that read as "too high" across sizes. New rule: 1px upward shift universally.
139
- See CLAUDE.md § Optical Centering. */
140
136
  .mint-button--sm {
141
- padding: 0.3125rem 0.75rem 0.4375rem;
137
+ padding: 0.375rem 0.75rem;
142
138
  font-size: 0.875rem;
143
139
  min-height: var(--form-height-sm);
144
140
  }
145
141
 
146
142
  .mint-button--md {
147
- padding: 0.4375rem 1rem 0.5625rem;
143
+ padding: 0.5rem 1rem;
148
144
  font-size: 0.875rem;
149
145
  min-height: var(--form-height-md);
150
146
  }
151
147
 
152
148
  .mint-button--lg {
153
- padding: 0.6875rem 1.5rem 0.8125rem;
149
+ padding: 0.75rem 1.5rem;
154
150
  font-size: 1rem;
155
151
  min-height: var(--form-height-lg);
156
152
  }