@morscherlab/mint-sdk 1.3.9 → 1.4.0-beta.1

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 (966) hide show
  1. package/README.md +152 -177
  2. package/dist/ActionMenu-CScINahU.js +445 -0
  3. package/dist/ActionMenu-CScINahU.js.map +1 -0
  4. package/dist/AppSidebar-BmiiPfz9.js +3514 -0
  5. package/dist/AppSidebar-BmiiPfz9.js.map +1 -0
  6. package/dist/{experiment-utils-DTANyVKV.js → BaseModal-DfRIuVoj.js} +74 -149
  7. package/dist/BaseModal-DfRIuVoj.js.map +1 -0
  8. package/dist/ConfirmDialog-CJ7hqYUP.js +102 -0
  9. package/dist/ConfirmDialog-CJ7hqYUP.js.map +1 -0
  10. package/dist/ExperimentPopover-C4sGw-is.js +359 -0
  11. package/dist/ExperimentPopover-C4sGw-is.js.map +1 -0
  12. package/dist/ExperimentSelectorModal-D-9z7cNx.js +527 -0
  13. package/dist/ExperimentSelectorModal-D-9z7cNx.js.map +1 -0
  14. package/dist/SegmentedControl-DERBN-Xd.js +129 -0
  15. package/dist/SegmentedControl-DERBN-Xd.js.map +1 -0
  16. package/dist/SettingsModal-CSLE31yg.js +666 -0
  17. package/dist/SettingsModal-CSLE31yg.js.map +1 -0
  18. package/dist/analysisArtifactTypes-Cy3D0Ipg.js.map +1 -1
  19. package/dist/auth-SliLnFre.js +65 -0
  20. package/dist/auth-SliLnFre.js.map +1 -0
  21. package/dist/components/ActionMenu.vue.d.ts +1 -1
  22. package/dist/components/AdductText.vue.d.ts +1 -1
  23. package/dist/components/AlertBox.vue.d.ts +3 -3
  24. package/dist/components/AppContainer.vue.d.ts +1 -1
  25. package/dist/components/AppSidebar.vue.d.ts +14 -94
  26. package/dist/components/AppTopBar.vue.d.ts +16 -70
  27. package/dist/components/ArtifactSaveDialog.vue.d.ts +4 -4
  28. package/dist/components/ArtifactSelectorModal.vue.d.ts +4 -4
  29. package/dist/components/AuditTrail.vue.d.ts +2 -2
  30. package/dist/components/BaseButton.vue.d.ts +11 -4
  31. package/dist/components/BaseCheckbox.vue.d.ts +9 -3
  32. package/dist/components/BaseInput.vue.d.ts +13 -9
  33. package/dist/components/BaseModal.vue.d.ts +4 -4
  34. package/dist/components/BasePill.vue.d.ts +15 -8
  35. package/dist/components/BaseRadioGroup.vue.d.ts +2 -2
  36. package/dist/components/BaseSelect.vue.d.ts +51 -19
  37. package/dist/components/BaseTabs.vue.d.ts +6 -5
  38. package/dist/components/BatchProgressList.vue.d.ts +2 -2
  39. package/dist/components/ChartContainer.vue.d.ts +2 -2
  40. package/dist/components/ChemicalFormula.vue.d.ts +2 -2
  41. package/dist/components/CollapsibleCard.vue.d.ts +3 -3
  42. package/dist/components/ComponentBindingRenderer.vue.d.ts +2 -3
  43. package/dist/components/ConcentrationInput.vue.d.ts +2 -2
  44. package/dist/components/ConfirmDialog.vue.d.ts +8 -7
  45. package/dist/components/DataFrame.vue.d.ts +32 -74
  46. package/dist/components/DatePicker.vue.d.ts +24 -2
  47. package/dist/components/DoseCalculator.vue.d.ts +1 -1
  48. package/dist/components/DoseCalculatorVolumeField.vue.d.ts +1 -1
  49. package/dist/components/EmptyState.vue.d.ts +3 -2
  50. package/dist/components/ExperimentSelectorModal.vue.d.ts +3 -3
  51. package/dist/components/FormBuilder.vue.d.ts +17 -74
  52. package/dist/components/FormulaInput.vue.d.ts +2 -2
  53. package/dist/components/GeneratedPluginView.vue.d.ts +1 -1
  54. package/dist/components/GeneratedResultRenderer.vue.d.ts +5 -1
  55. package/dist/components/{StatusIndicator.vue.d.ts → InstrumentStatusPanels.vue.d.ts} +8 -9
  56. package/dist/components/JobsStatusTray.vue.d.ts +2 -9
  57. package/dist/components/LoadingSpinner.vue.d.ts +3 -3
  58. package/dist/components/MoleculeInput.vue.d.ts +2 -2
  59. package/dist/components/NumberInput.vue.d.ts +19 -5
  60. package/dist/components/PlateEditor.vue.d.ts +11 -61
  61. package/dist/components/PlotlyChart.vue.d.ts +2 -2
  62. package/dist/components/PluginIcon.vue.d.ts +5 -1
  63. package/dist/components/PluginWorkspaceView.controls.d.ts +2 -9
  64. package/dist/components/PluginWorkspaceView.navigation.d.ts +1 -7
  65. package/dist/components/PluginWorkspaceView.props.d.ts +18 -137
  66. package/dist/components/PluginWorkspaceView.shell.d.ts +2 -10
  67. package/dist/components/PluginWorkspaceView.vue.d.ts +14 -84
  68. package/dist/components/PresenceAvatars.vue.d.ts +31 -0
  69. package/dist/components/ProgressBar.vue.d.ts +3 -2
  70. package/dist/components/ProtocolStep.presentation.d.ts +0 -1
  71. package/dist/components/SampleHierarchyTree.vue.d.ts +3 -3
  72. package/dist/components/SampleSelector.vue.d.ts +3 -3
  73. package/dist/components/ScheduleCalendar.vue.d.ts +1 -1
  74. package/dist/components/ScientificNumber.vue.d.ts +1 -1
  75. package/dist/components/SecretInput.vue.d.ts +2 -2
  76. package/dist/components/SegmentedControl.vue.d.ts +2 -2
  77. package/dist/components/SequenceInput.vue.d.ts +2 -2
  78. package/dist/components/SettingsModal.vue.d.ts +12 -20
  79. package/dist/components/SmartGroup.types.d.ts +0 -1
  80. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +1 -1
  81. package/dist/components/StaleFormBanner.vue.d.ts +20 -0
  82. package/dist/components/TagsInput.vue.d.ts +4 -3
  83. package/dist/components/TimeRangeInput.vue.d.ts +2 -2
  84. package/dist/components/VersionConflictDialog.vue.d.ts +24 -0
  85. package/dist/components/WellPlate.geometry.d.ts +0 -6
  86. package/dist/components/WellPlate.rendering.d.ts +0 -2
  87. package/dist/components/WellPlate.vue.d.ts +7 -52
  88. package/dist/components/index.d.ts +0 -90
  89. package/dist/components/{AutoGroupModal.adapter.d.ts → internal/AutoGroupModalInternal.adapter.d.ts} +6 -6
  90. package/dist/components/{AutoGroupModal.vue.d.ts → internal/AutoGroupModalInternal.vue.d.ts} +6 -6
  91. package/dist/components/{BaseToggle.vue.d.ts → internal/CheckboxSwitchInternal.vue.d.ts} +2 -2
  92. package/dist/components/internal/DatePickerDateInternal.vue.d.ts +22 -0
  93. package/dist/components/{DateTimePicker.vue.d.ts → internal/DatePickerDateTimeInternal.vue.d.ts} +2 -2
  94. package/dist/components/{TimePicker.vue.d.ts → internal/DatePickerTimeInternal.vue.d.ts} +3 -3
  95. package/dist/components/internal/FilePickerListInternal.vue.d.ts +2 -2
  96. package/dist/components/internal/FormSchemaInternal.vue.d.ts +95 -0
  97. package/dist/components/{UnitInput.vue.d.ts → internal/NumberUnitInputInternal.vue.d.ts} +6 -14
  98. package/dist/components/internal/PlateEditorBindingInternal.vue.d.ts +3 -2
  99. package/dist/components/internal/ResourcePickerListInternal.vue.d.ts +3 -3
  100. package/dist/components/{MultiSelect.vue.d.ts → internal/SelectMultipleInternal.vue.d.ts} +11 -8
  101. package/dist/components/{SearchableSelect.vue.d.ts → internal/SelectSearchableInternal.vue.d.ts} +5 -2
  102. package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +1 -15
  103. package/dist/components/internal/WorkspaceSidebarInternal.vue.d.ts +4 -4
  104. package/dist/{composables → components/internal}/autoGroup/classKey.d.ts +1 -1
  105. package/dist/{composables → components/internal}/autoGroup/classify.d.ts +1 -1
  106. package/dist/{composables → components/internal}/autoGroup/columns.d.ts +1 -1
  107. package/dist/{composables → components/internal}/autoGroup/compose.d.ts +1 -1
  108. package/dist/{composables → components/internal}/autoGroup/cooccurrence.d.ts +1 -1
  109. package/dist/{composables → components/internal}/autoGroup/csv-shim.d.ts +1 -1
  110. package/dist/{composables → components/internal}/autoGroup/fingerprint.d.ts +1 -1
  111. package/dist/{composables → components/internal}/autoGroup/template.d.ts +1 -1
  112. package/dist/{composables → components/internal}/autoGroup/tokenLength.d.ts +1 -1
  113. package/dist/components/internal/generatedJobsApi.d.ts +1 -1
  114. package/dist/{composables → components/internal}/useAutoGroup.d.ts +9 -18
  115. package/dist/composables/componentSpecs.d.ts +41 -0
  116. package/dist/composables/controlComponentBindings.d.ts +6 -0
  117. package/dist/composables/controlSchemaAdapters.d.ts +28 -2
  118. package/dist/composables/controlSchemaDoseDesign.d.ts +1 -1
  119. package/dist/composables/controlSchemaModel.d.ts +1 -1
  120. package/dist/composables/controlSchemaTypes.d.ts +35 -23
  121. package/dist/composables/{usePluginClient.d.ts → createClient.d.ts} +20 -49
  122. package/dist/composables/{useEventStream.d.ts → eventStream.d.ts} +2 -2
  123. package/dist/composables/experiment-utils.d.ts +1 -6
  124. package/dist/composables/index.d.ts +6 -59
  125. package/dist/composables/platformContextHelpers.d.ts +0 -11
  126. package/dist/composables/pluginEndpointBuilder.d.ts +2 -2
  127. package/dist/composables/pluginWorkspaceModel.d.ts +14 -97
  128. package/dist/composables/useApi.d.ts +1 -3
  129. package/dist/composables/useAppExperiment.d.ts +1 -1
  130. package/dist/composables/{useAnalysisArtifacts.d.ts → useArtifacts.d.ts} +6 -6
  131. package/dist/composables/useExperiment.d.ts +30 -0
  132. package/dist/composables/useFilePicker.d.ts +2 -2
  133. package/dist/composables/useJobCenter.d.ts +63 -0
  134. package/dist/composables/{useGeneratedAnalysis.d.ts → useJobsEndpoint.d.ts} +22 -23
  135. package/dist/composables/useMenuKeyboard.d.ts +1 -1
  136. package/dist/composables/usePlatform.d.ts +63 -0
  137. package/dist/composables/usePluginWorkspace.d.ts +6 -11
  138. package/dist/composables/usePresence.d.ts +41 -0
  139. package/dist/composables/useRackEditor.d.ts +2 -2
  140. package/dist/composables/useRealtime.d.ts +71 -0
  141. package/dist/composables/{useRequestSyncState.d.ts → useRequest.d.ts} +12 -17
  142. package/dist/composables/useToast.d.ts +7 -5
  143. package/dist/composables/useVersionedSave.d.ts +76 -0
  144. package/dist/controlSchemaModel-CP5-_nAj.js +95 -0
  145. package/dist/controlSchemaModel-CP5-_nAj.js.map +1 -0
  146. package/dist/data-C2PwI_dn.js +3811 -0
  147. package/dist/data-C2PwI_dn.js.map +1 -0
  148. package/dist/data.d.ts +32 -0
  149. package/dist/data.js +10 -0
  150. package/dist/deprecatedRootExports.d.ts +191 -0
  151. package/dist/experiment-43OJtH7R.js +673 -0
  152. package/dist/experiment-43OJtH7R.js.map +1 -0
  153. package/dist/experimentStatus-BZmU4czV.js +60 -0
  154. package/dist/experimentStatus-BZmU4czV.js.map +1 -0
  155. package/dist/host.d.ts +10 -0
  156. package/dist/host.js +26 -0
  157. package/dist/host.js.map +1 -0
  158. package/dist/index.d.ts +1 -12
  159. package/dist/index.js +65 -277
  160. package/dist/index.js.map +1 -1
  161. package/dist/install-DAID6c2-.js +668 -0
  162. package/dist/install-DAID6c2-.js.map +1 -0
  163. package/dist/install.d.ts +2 -1
  164. package/dist/install.js +1 -21
  165. package/dist/instrument.d.ts +0 -6
  166. package/dist/lab-DLwRl_Ql.js +7513 -0
  167. package/dist/lab-DLwRl_Ql.js.map +1 -0
  168. package/dist/lab.d.ts +42 -0
  169. package/dist/lab.js +4 -0
  170. package/dist/permissions.d.ts +0 -4
  171. package/dist/permissions.js +1 -20
  172. package/dist/permissions.js.map +1 -1
  173. package/dist/records-BzTcxekG.js +3070 -0
  174. package/dist/records-BzTcxekG.js.map +1 -0
  175. package/dist/runtime-D6gVat6r.js +1495 -0
  176. package/dist/runtime-D6gVat6r.js.map +1 -0
  177. package/dist/runtime.d.ts +25 -0
  178. package/dist/runtime.js +8 -0
  179. package/dist/shell-5ju97nOS.js +197 -0
  180. package/dist/shell-5ju97nOS.js.map +1 -0
  181. package/dist/shell.d.ts +16 -0
  182. package/dist/shell.js +8 -0
  183. package/dist/stores/auth.d.ts +13 -35
  184. package/dist/stores/experiment.d.ts +4 -0
  185. package/dist/stores/index.js +2 -2
  186. package/dist/styles.css +12030 -14845
  187. package/dist/types/analysisArtifactTypes.d.ts +1 -1
  188. package/dist/types/auth.d.ts +0 -8
  189. package/dist/types/componentLabTypes.d.ts +98 -34
  190. package/dist/types/componentWorkflowTypes.d.ts +0 -27
  191. package/dist/types/components.d.ts +145 -74
  192. package/dist/types/form-builder.d.ts +4 -0
  193. package/dist/types/generated/platformContext.d.ts +52 -0
  194. package/dist/types/generated-ui.d.ts +2 -2
  195. package/dist/types/index.d.ts +4 -5
  196. package/dist/types/instrument.d.ts +41 -0
  197. package/dist/types/platform.d.ts +20 -58
  198. package/dist/useDebouncedWatch-BPwyl6eS.js +73 -0
  199. package/dist/useDebouncedWatch-BPwyl6eS.js.map +1 -0
  200. package/dist/useExpansionSet-CvoNMZJi.js +68 -0
  201. package/dist/useExpansionSet-CvoNMZJi.js.map +1 -0
  202. package/dist/useExperimentSamples-CxcnxZ8h.js +366 -0
  203. package/dist/useExperimentSamples-CxcnxZ8h.js.map +1 -0
  204. package/dist/useListReorder-CcbEYxX-.js +5462 -0
  205. package/dist/useListReorder-CcbEYxX-.js.map +1 -0
  206. package/dist/useRackEditor-BD5NIo5s.js +5916 -0
  207. package/dist/useRackEditor-BD5NIo5s.js.map +1 -0
  208. package/dist/useRealtime-PalKue84.js +696 -0
  209. package/dist/useRealtime-PalKue84.js.map +1 -0
  210. package/dist/useRequest-D5JDfsgZ.js +76 -0
  211. package/dist/useRequest-D5JDfsgZ.js.map +1 -0
  212. package/dist/utils/color.d.ts +0 -5
  213. package/dist/{composables/useDoseCalculator.d.ts → utils/dose.d.ts} +10 -13
  214. package/dist/utils/experimentStatus.d.ts +9 -0
  215. package/dist/{composables/useChemicalFormula.d.ts → utils/formula.d.ts} +3 -6
  216. package/dist/utils/integrationHost.d.ts +18 -0
  217. package/dist/utils/plotlyTemplate.d.ts +2 -0
  218. package/dist/utils/pluginSecrets.d.ts +12 -12
  219. package/dist/utils/presenceAvatars.d.ts +30 -0
  220. package/dist/utils/records.d.ts +0 -2
  221. package/dist/{composables/useTimeUtils.d.ts → utils/time.d.ts} +0 -18
  222. package/package.json +20 -17
  223. package/src/__tests__/components/ActionMenu.test.ts +0 -13
  224. package/src/__tests__/components/AlertBox.test.ts +1 -1
  225. package/src/__tests__/components/AppSidebar.test.ts +119 -167
  226. package/src/__tests__/components/AppToastContainer.test.ts +2 -2
  227. package/src/__tests__/components/AppTopBar.test.ts +181 -176
  228. package/src/__tests__/components/ArtifactSaveDialog.test.ts +5 -3
  229. package/src/__tests__/components/ArtifactSelectorModal.test.ts +6 -4
  230. package/src/__tests__/components/AuditTrail.test.ts +1 -1
  231. package/src/__tests__/components/AutoGroupModal.adapter.test.ts +1 -1
  232. package/src/__tests__/components/AutoGroupModal.anatomy.test.ts +2 -2
  233. package/src/__tests__/components/AutoGroupModal.wiring.test.ts +2 -2
  234. package/src/__tests__/components/BaseButton.test.ts +51 -0
  235. package/src/__tests__/components/{BaseToggle.test.ts → BaseCheckbox.switch.test.ts} +8 -6
  236. package/src/__tests__/components/BaseInput.test.ts +13 -34
  237. package/src/__tests__/components/BaseModal.test.ts +6 -6
  238. package/src/__tests__/components/BasePill.test.ts +33 -39
  239. package/src/__tests__/components/{MultiSelect.test.ts → BaseSelect.multiple.test.ts} +16 -7
  240. package/src/__tests__/components/{SearchableSelect.test.ts → BaseSelect.searchable.test.ts} +19 -9
  241. package/src/__tests__/components/BaseSelect.test.ts +10 -0
  242. package/src/__tests__/components/BaseTabs.test.ts +13 -13
  243. package/src/__tests__/components/CollapsibleCard.test.ts +1 -1
  244. package/src/__tests__/components/ComponentBindingRenderer.test.ts +25 -73
  245. package/src/__tests__/components/ConcentrationInput.test.ts +3 -3
  246. package/src/__tests__/components/ConfirmDialog.test.ts +23 -0
  247. package/src/__tests__/components/DataFrame.test.ts +140 -142
  248. package/src/__tests__/components/DataStates.test.ts +6 -22
  249. package/src/__tests__/components/{DateTimePicker.test.ts → DatePicker.datetime.test.ts} +9 -7
  250. package/src/__tests__/components/{TimePicker.test.ts → DatePicker.time.test.ts} +18 -17
  251. package/src/__tests__/components/DoseCalculator.test.ts +12 -7
  252. package/src/__tests__/components/DoseCalculatorVolumeField.test.ts +6 -6
  253. package/src/__tests__/components/ExperimentSelectorModal.test.ts +15 -15
  254. package/src/__tests__/components/FormBuilder.test.ts +49 -167
  255. package/src/__tests__/components/FormSchemaInternal.test.ts +91 -0
  256. package/src/__tests__/components/GeneratedPathInput.test.ts +18 -13
  257. package/src/__tests__/components/GeneratedPluginView.test.ts +38 -24
  258. package/src/__tests__/components/GeneratedResultRenderer.test.ts +6 -4
  259. package/src/__tests__/components/InstrumentStatusPanels.test.ts +79 -0
  260. package/src/__tests__/components/JobsStatusTray.test.ts +4 -4
  261. package/src/__tests__/components/NumberInput.test.ts +28 -0
  262. package/src/__tests__/components/{UnitInput.test.ts → NumberInput.units.test.ts} +6 -6
  263. package/src/__tests__/components/PlateEditor.test.ts +108 -108
  264. package/src/__tests__/components/PlateEditorBindingInternal.test.ts +13 -13
  265. package/src/__tests__/components/PlotlyChart.test.ts +1 -1
  266. package/src/__tests__/components/PluginIcon.test.ts +9 -4
  267. package/src/__tests__/components/PluginWorkspaceView.controls.test.ts +16 -29
  268. package/src/__tests__/components/PluginWorkspaceView.internal.test.ts +28 -34
  269. package/src/__tests__/components/PluginWorkspaceView.navigation.test.ts +4 -19
  270. package/src/__tests__/components/PluginWorkspaceView.shell.test.ts +1 -6
  271. package/src/__tests__/components/PluginWorkspaceView.test.ts +176 -155
  272. package/src/__tests__/components/PresenceAvatars.test.ts +90 -0
  273. package/src/__tests__/components/ProtocolStep.presentation.test.ts +1 -3
  274. package/src/__tests__/components/ProtocolStepEditor.test.ts +10 -11
  275. package/src/__tests__/components/ProtocolStepParameterField.test.ts +8 -7
  276. package/src/__tests__/components/ResourcePickerListInternal.test.ts +2 -2
  277. package/src/__tests__/components/RetiredStyles.test.ts +0 -18
  278. package/src/__tests__/components/SampleSelector.test.ts +17 -17
  279. package/src/__tests__/components/SecretInput.test.ts +14 -19
  280. package/src/__tests__/components/SettingsModal.test.ts +76 -84
  281. package/src/__tests__/components/StaleFormBanner.test.ts +48 -0
  282. package/src/__tests__/components/ThemeToggle.test.ts +1 -1
  283. package/src/__tests__/components/WellPlate.decoration.test.ts +10 -8
  284. package/src/__tests__/components/WellPlate.interaction.test.ts +6 -7
  285. package/src/__tests__/components/WellPlate.keyboard.test.ts +2 -2
  286. package/src/__tests__/components/deprecationTags.test.ts +90 -0
  287. package/src/__tests__/composables/analysisArtifactTarget.test.ts +1 -12
  288. package/src/__tests__/composables/autoGroup/classKey.test.ts +1 -1
  289. package/src/__tests__/composables/autoGroup/classify.test.ts +1 -1
  290. package/src/__tests__/composables/autoGroup/columns.test.ts +1 -1
  291. package/src/__tests__/composables/autoGroup/compose.test.ts +1 -1
  292. package/src/__tests__/composables/autoGroup/cooccurrence.test.ts +1 -1
  293. package/src/__tests__/composables/autoGroup/fieldEdits.test.ts +1 -1
  294. package/src/__tests__/composables/autoGroup/fingerprint.test.ts +1 -1
  295. package/src/__tests__/composables/autoGroup/golden.test.ts +1 -1
  296. package/src/__tests__/composables/autoGroup/groupByOrder.test.ts +1 -1
  297. package/src/__tests__/composables/autoGroup/groupTree.test.ts +1 -1
  298. package/src/__tests__/composables/autoGroup/integration.test.ts +1 -1
  299. package/src/__tests__/composables/autoGroup/template.test.ts +1 -1
  300. package/src/__tests__/composables/autoGroup/tokenLength.test.ts +1 -1
  301. package/src/__tests__/composables/autoGroup/tokenize.test.ts +1 -1
  302. package/src/__tests__/composables/{usePluginClient.test.ts → createClient.test.ts} +84 -222
  303. package/src/__tests__/composables/{useEventStream.test.ts → eventStream.test.ts} +6 -6
  304. package/src/__tests__/composables/experiment-utils.test.ts +13 -14
  305. package/src/__tests__/composables/useApi.test.ts +32 -21
  306. package/src/__tests__/composables/useAppExperiment.test.ts +19 -2
  307. package/src/__tests__/composables/{useAnalysisArtifacts.test.ts → useArtifacts.test.ts} +19 -27
  308. package/src/__tests__/composables/useAutoGroup.test.ts +3 -13
  309. package/src/__tests__/composables/useControlSchema.test.ts +41 -99
  310. package/src/__tests__/composables/useExperiment.test.ts +63 -0
  311. package/src/__tests__/composables/useFileBrowser.test.ts +4 -6
  312. package/src/__tests__/composables/{useJobsStatusTray.test.ts → useJobCenter.test.ts} +31 -31
  313. package/src/__tests__/composables/{useGeneratedAnalysis.test.ts → useJobsEndpoint.test.ts} +213 -139
  314. package/src/__tests__/composables/usePlatform.test.ts +102 -0
  315. package/src/__tests__/composables/usePresence.test.ts +164 -0
  316. package/src/__tests__/composables/useRackEditor.test.ts +2 -2
  317. package/src/__tests__/composables/useRealtime.test.ts +196 -0
  318. package/src/__tests__/composables/{useRequestSyncState.test.ts → useRequest.test.ts} +32 -47
  319. package/src/__tests__/composables/useVersionedSave.test.ts +194 -0
  320. package/src/__tests__/docs/extractDocsComponents.test.ts +36 -0
  321. package/src/__tests__/docs/extractDocsParsing.test.ts +2 -2
  322. package/src/__tests__/docs/extractDocsTheme.test.ts +1 -46
  323. package/src/__tests__/docs/frontendDocsCatalog.test.ts +164 -84
  324. package/src/__tests__/styles/baseControlsRules.test.ts +1 -1
  325. package/src/__tests__/styles/darkModeRules.test.ts +0 -6
  326. package/src/__tests__/{composables/useChemicalFormula.test.ts → utils/formula.test.ts} +3 -5
  327. package/src/__tests__/utils/permissions.test.ts +1 -36
  328. package/src/__tests__/utils/plotlyTemplate.test.ts +16 -1
  329. package/src/__tests__/{composables/useTimeUtils.test.ts → utils/time.test.ts} +2 -9
  330. package/src/components/ActionMenu.vue +7 -13
  331. package/src/components/AlertBox.story.vue +25 -25
  332. package/src/components/AlertBox.vue +8 -8
  333. package/src/components/AppLayout.story.vue +33 -44
  334. package/src/components/AppLayout.vue +1 -1
  335. package/src/components/AppSidebar.story.vue +40 -73
  336. package/src/components/AppSidebar.vue +66 -147
  337. package/src/components/AppToastContainer.story.vue +1 -1
  338. package/src/components/AppTopBar.story.vue +51 -100
  339. package/src/components/AppTopBar.vue +74 -198
  340. package/src/components/ArtifactSaveDialog.story.vue +9 -9
  341. package/src/components/ArtifactSaveDialog.vue +23 -26
  342. package/src/components/ArtifactSelectorModal.story.vue +4 -4
  343. package/src/components/ArtifactSelectorModal.vue +10 -10
  344. package/src/components/AuditTrail.story.vue +4 -4
  345. package/src/components/AuditTrail.vue +3 -3
  346. package/src/components/Avatar.story.vue +2 -3
  347. package/src/components/Avatar.vue +1 -2
  348. package/src/components/BaseButton.story.vue +25 -0
  349. package/src/components/BaseButton.vue +39 -10
  350. package/src/components/BaseCheckbox.story.vue +2 -2
  351. package/src/components/{BaseToggle.story.vue → BaseCheckbox.switch.story.vue} +22 -19
  352. package/src/components/BaseCheckbox.vue +39 -7
  353. package/src/components/BaseInput.story.vue +3 -15
  354. package/src/components/{BaseTextarea.story.vue → BaseInput.textarea.story.vue} +14 -10
  355. package/src/components/BaseInput.vue +53 -26
  356. package/src/components/BaseModal.story.vue +11 -11
  357. package/src/components/BaseModal.vue +8 -8
  358. package/src/components/BasePill.story.vue +48 -28
  359. package/src/components/BasePill.vue +22 -11
  360. package/src/components/BaseRadioGroup.story.vue +4 -4
  361. package/src/components/BaseRadioGroup.vue +3 -3
  362. package/src/components/{MultiSelect.story.vue → BaseSelect.multiple.story.vue} +20 -14
  363. package/src/components/{SearchableSelect.story.vue → BaseSelect.searchable.story.vue} +4 -4
  364. package/src/components/BaseSelect.story.vue +2 -2
  365. package/src/components/BaseSelect.vue +117 -22
  366. package/src/components/BaseTabs.story.vue +20 -20
  367. package/src/components/BaseTabs.vue +17 -9
  368. package/src/components/BatchProgressList.vue +3 -3
  369. package/src/components/ChartContainer.story.vue +8 -13
  370. package/src/components/ChartContainer.vue +3 -3
  371. package/src/components/ChemicalFormula.vue +1 -2
  372. package/src/components/CollapsibleCard.vue +5 -4
  373. package/src/components/ComponentBindingRenderer.story.vue +0 -29
  374. package/src/components/ComponentBindingRenderer.vue +15 -39
  375. package/src/components/ConcentrationInput.story.vue +2 -2
  376. package/src/components/ConcentrationInput.vue +9 -9
  377. package/src/components/ConfirmDialog.story.vue +21 -21
  378. package/src/components/ConfirmDialog.vue +15 -14
  379. package/src/components/DataFrame.story.vue +28 -40
  380. package/src/components/DataFrame.vue +112 -128
  381. package/src/components/{DateTimePicker.story.vue → DatePicker.datetime.story.vue} +19 -14
  382. package/src/components/DatePicker.story.vue +2 -2
  383. package/src/components/{TimePicker.story.vue → DatePicker.time.story.vue} +15 -12
  384. package/src/components/DatePicker.vue +82 -220
  385. package/src/components/DoseCalculator.vue +13 -19
  386. package/src/components/DoseCalculatorVolumeField.vue +6 -6
  387. package/src/components/EmptyState.story.vue +17 -17
  388. package/src/components/EmptyState.vue +5 -4
  389. package/src/components/ExperimentPopover.story.vue +1 -1
  390. package/src/components/ExperimentPopover.vue +4 -4
  391. package/src/components/ExperimentSelectorModal.story.vue +5 -5
  392. package/src/components/ExperimentSelectorModal.vue +11 -13
  393. package/src/components/FilePicker.vue +1 -1
  394. package/src/components/FormBuilder.story.vue +9 -4
  395. package/src/components/FormBuilder.vue +46 -253
  396. package/src/components/FormField.story.vue +1 -2
  397. package/src/components/FormulaInput.story.vue +2 -2
  398. package/src/components/FormulaInput.vue +5 -6
  399. package/src/components/GeneratedPathInput.vue +8 -9
  400. package/src/components/GeneratedPluginView.story.vue +1 -1
  401. package/src/components/GeneratedPluginView.vue +23 -22
  402. package/src/components/GeneratedResultRenderer.vue +16 -17
  403. package/src/components/InstrumentStatusPanels.story.vue +64 -0
  404. package/src/components/InstrumentStatusPanels.vue +133 -0
  405. package/src/components/JobsStatusTray.story.vue +2 -2
  406. package/src/components/JobsStatusTray.vue +4 -19
  407. package/src/components/LoadingSpinner.story.vue +11 -11
  408. package/src/components/LoadingSpinner.vue +6 -4
  409. package/src/components/MoleculeInput.story.vue +2 -2
  410. package/src/components/MoleculeInput.vue +3 -3
  411. package/src/components/NumberInput.story.vue +55 -15
  412. package/src/components/NumberInput.vue +80 -18
  413. package/src/components/PlateEditor.story.vue +51 -43
  414. package/src/components/PlateEditor.vue +97 -128
  415. package/src/components/PlotlyChart.story.vue +1 -1
  416. package/src/components/PlotlyChart.vue +6 -4
  417. package/src/components/PluginIcon.story.vue +9 -6
  418. package/src/components/PluginIcon.vue +7 -2
  419. package/src/components/PluginWorkspaceView.controls.ts +9 -29
  420. package/src/components/PluginWorkspaceView.navigation.ts +2 -23
  421. package/src/components/PluginWorkspaceView.props.ts +17 -151
  422. package/src/components/PluginWorkspaceView.shell.ts +13 -24
  423. package/src/components/PluginWorkspaceView.story.vue +64 -62
  424. package/src/components/PluginWorkspaceView.vue +21 -78
  425. package/src/components/PresenceAvatars.story.vue +75 -0
  426. package/src/components/PresenceAvatars.vue +114 -0
  427. package/src/components/ProgressBar.story.vue +7 -7
  428. package/src/components/ProgressBar.vue +4 -3
  429. package/src/components/ProtocolStep.presentation.ts +0 -11
  430. package/src/components/ProtocolStepEditor.vue +6 -5
  431. package/src/components/ProtocolStepParameterField.vue +15 -12
  432. package/src/components/SampleSelector.colors.ts +1 -1
  433. package/src/components/SampleSelector.vue +6 -6
  434. package/src/components/ScheduleCalendar.vue +4 -4
  435. package/src/components/SecretInput.story.vue +1 -1
  436. package/src/components/SecretInput.vue +16 -25
  437. package/src/components/SegmentedControl.story.vue +7 -7
  438. package/src/components/SegmentedControl.vue +5 -3
  439. package/src/components/SequenceInput.story.vue +2 -2
  440. package/src/components/SequenceInput.vue +3 -3
  441. package/src/components/SettingsModal.story.vue +13 -14
  442. package/src/components/SettingsModal.vue +29 -47
  443. package/src/components/SmartGroup.types.ts +4 -6
  444. package/src/components/SmartGroupFieldRecipe.vue +7 -5
  445. package/src/components/StaleFormBanner.story.vue +90 -0
  446. package/src/components/StaleFormBanner.vue +83 -0
  447. package/src/components/TagsInput.story.vue +7 -7
  448. package/src/components/TagsInput.vue +7 -6
  449. package/src/components/ThemeToggle.vue +5 -30
  450. package/src/components/TimeRangeInput.story.vue +1 -1
  451. package/src/components/TimeRangeInput.vue +10 -8
  452. package/src/components/VersionConflictDialog.story.vue +60 -0
  453. package/src/components/VersionConflictDialog.vue +79 -0
  454. package/src/components/WellPlate.geometry.ts +0 -38
  455. package/src/components/WellPlate.rendering.ts +0 -13
  456. package/src/components/WellPlate.story.vue +61 -50
  457. package/src/components/WellPlate.vue +61 -87
  458. package/src/components/index.ts +3 -105
  459. package/src/components/{AutoGroupModal.adapter.ts → internal/AutoGroupModalInternal.adapter.ts} +8 -8
  460. package/src/components/{AutoGroupModal.vue → internal/AutoGroupModalInternal.vue} +23 -23
  461. package/src/components/{BaseToggle.vue → internal/CheckboxSwitchInternal.vue} +8 -8
  462. package/src/components/internal/DataStateInternal.vue +1 -1
  463. package/src/components/internal/DatePickerDateInternal.vue +243 -0
  464. package/src/components/{DateTimePicker.vue → internal/DatePickerDateTimeInternal.vue} +9 -9
  465. package/src/components/{TimePicker.vue → internal/DatePickerTimeInternal.vue} +7 -7
  466. package/src/components/internal/FilePickerListInternal.vue +8 -14
  467. package/src/components/{FormActions.vue → internal/FormActionsInternal.vue} +2 -2
  468. package/src/components/internal/FormFieldRendererInternal.vue +1 -1
  469. package/src/components/internal/FormSchemaInternal.vue +253 -0
  470. package/src/components/{UnitInput.vue → internal/NumberUnitInputInternal.vue} +28 -28
  471. package/src/components/internal/PlateEditorBindingInternal.vue +8 -7
  472. package/src/components/internal/ResourcePickerListInternal.vue +4 -4
  473. package/src/components/{MultiSelect.vue → internal/SelectMultipleInternal.vue} +21 -15
  474. package/src/components/{SearchableSelect.vue → internal/SelectSearchableInternal.vue} +24 -8
  475. package/src/components/internal/WellEditPopupInternal.vue +4 -9
  476. package/src/components/internal/WorkspaceShellInternal.vue +3 -36
  477. package/src/components/internal/WorkspaceSidebarInternal.vue +4 -25
  478. package/src/{composables → components/internal}/autoGroup/classKey.ts +1 -1
  479. package/src/{composables → components/internal}/autoGroup/classify.ts +1 -1
  480. package/src/{composables → components/internal}/autoGroup/columns.ts +1 -1
  481. package/src/{composables → components/internal}/autoGroup/compose.ts +3 -3
  482. package/src/{composables → components/internal}/autoGroup/cooccurrence.ts +1 -1
  483. package/src/{composables → components/internal}/autoGroup/csv-shim.ts +1 -1
  484. package/src/{composables → components/internal}/autoGroup/fingerprint.ts +1 -1
  485. package/src/{composables → components/internal}/autoGroup/index.ts +1 -2
  486. package/src/{composables → components/internal}/autoGroup/template.ts +1 -1
  487. package/src/{composables → components/internal}/autoGroup/tokenLength.ts +1 -1
  488. package/src/components/internal/generatedJobsApi.ts +1 -1
  489. package/src/{composables → components/internal}/useAutoGroup.ts +3 -57
  490. package/src/composables/componentSpecs.ts +62 -0
  491. package/src/composables/controlComponentBindings.ts +7 -0
  492. package/src/composables/controlSchemaAdapters.ts +45 -7
  493. package/src/composables/controlSchemaDoseDesign.ts +16 -5
  494. package/src/composables/controlSchemaModel.ts +1 -1
  495. package/src/composables/controlSchemaTypes.ts +31 -22
  496. package/src/composables/{usePluginClient.ts → createClient.ts} +52 -190
  497. package/src/composables/{useEventStream.ts → eventStream.ts} +3 -3
  498. package/src/composables/experiment-utils.ts +1 -39
  499. package/src/composables/formBuilderRegistry.ts +6 -12
  500. package/src/composables/index.ts +16 -480
  501. package/src/composables/platformContextHelpers.ts +0 -57
  502. package/src/composables/pluginEndpointBuilder.ts +8 -10
  503. package/src/composables/pluginWorkspaceModel.ts +14 -105
  504. package/src/composables/useApi.ts +18 -30
  505. package/src/composables/useAppExperiment.ts +6 -5
  506. package/src/composables/{useAnalysisArtifacts.ts → useArtifacts.ts} +18 -19
  507. package/src/composables/useControlSchema.ts +5 -9
  508. package/src/composables/useControlWorkspace.ts +4 -7
  509. package/src/composables/useExperiment.ts +49 -0
  510. package/src/composables/useExperimentData.ts +4 -4
  511. package/src/composables/useExperimentSelector.ts +5 -5
  512. package/src/composables/useFileBrowser.ts +5 -13
  513. package/src/composables/useFilePicker.ts +2 -2
  514. package/src/composables/useFormBuilder.ts +3 -4
  515. package/src/composables/useJobCenter.ts +324 -0
  516. package/src/composables/{useGeneratedAnalysis.ts → useJobsEndpoint.ts} +53 -67
  517. package/src/composables/useMenuKeyboard.ts +1 -1
  518. package/src/composables/usePlatform.ts +95 -0
  519. package/src/composables/usePlatformFilePickerAdapter.ts +2 -1
  520. package/src/composables/usePluginWorkspace.ts +62 -107
  521. package/src/composables/usePresence.ts +110 -0
  522. package/src/composables/useRackEditor.ts +3 -3
  523. package/src/composables/useRealtime.ts +194 -0
  524. package/src/composables/{useRequestSyncState.ts → useRequest.ts} +25 -48
  525. package/src/composables/useScheduleCalendarLayout.ts +1 -1
  526. package/src/composables/useToast.ts +14 -11
  527. package/src/composables/useVersionedSave.ts +165 -0
  528. package/src/data.ts +130 -0
  529. package/src/deprecatedRootExports.ts +226 -0
  530. package/src/generated/schema.ts +1 -0
  531. package/src/host.ts +27 -0
  532. package/src/index.ts +2 -71
  533. package/src/install.ts +15 -2
  534. package/src/instrument.ts +1 -6
  535. package/src/lab.ts +128 -0
  536. package/src/permissions.ts +0 -27
  537. package/src/runtime.ts +145 -0
  538. package/src/shell.ts +103 -0
  539. package/src/stores/auth.ts +26 -162
  540. package/src/stores/experiment.ts +27 -1
  541. package/src/styles/components/action-menu.css +0 -5
  542. package/src/styles/components/alert-box.css +18 -0
  543. package/src/styles/components/app-top-bar.css +7 -48
  544. package/src/styles/components/button.css +12 -0
  545. package/src/styles/components/checkbox.css +1 -1
  546. package/src/styles/components/collapsible-card.css +1 -1
  547. package/src/styles/components/confirm-dialog.css +18 -2
  548. package/src/styles/components/empty-state.css +4 -2
  549. package/src/styles/components/file-picker.css +1 -1
  550. package/src/styles/components/icon-button.css +1 -1
  551. package/src/styles/components/loading-spinner.css +9 -12
  552. package/src/styles/components/multi-select.css +6 -1
  553. package/src/styles/components/pill.css +40 -35
  554. package/src/styles/components/plugin-icon.css +9 -0
  555. package/src/styles/components/presence-avatars.css +194 -0
  556. package/src/styles/components/progress-bar.css +2 -0
  557. package/src/styles/components/searchable-select.css +3 -0
  558. package/src/styles/components/smart-group.css +1 -6
  559. package/src/styles/components/textarea.css +1 -1
  560. package/src/styles/components/toggle.css +2 -2
  561. package/src/styles/components/version-conflict.css +122 -0
  562. package/src/styles/components/well-plate.css +0 -7
  563. package/src/styles/index.css +2 -11
  564. package/src/styles/variables.css +1 -527
  565. package/src/types/analysisArtifactTypes.ts +1 -1
  566. package/src/types/auth.ts +0 -10
  567. package/src/types/componentLabTypes.ts +103 -53
  568. package/src/types/componentWorkflowTypes.ts +2 -33
  569. package/src/types/components.ts +148 -114
  570. package/src/types/form-builder.ts +4 -0
  571. package/src/types/generated/platformContext.ts +59 -0
  572. package/src/types/generated-ui.ts +2 -2
  573. package/src/types/index.ts +15 -53
  574. package/src/types/instrument.ts +27 -0
  575. package/src/types/platform.ts +25 -89
  576. package/src/utils/color.ts +1 -12
  577. package/src/utils/dose.ts +335 -0
  578. package/src/utils/experimentStatus.ts +43 -0
  579. package/src/utils/formula.ts +292 -0
  580. package/src/utils/integrationHost.ts +27 -0
  581. package/src/utils/plotlyTemplate.ts +6 -0
  582. package/src/utils/pluginSecrets.ts +23 -23
  583. package/src/utils/presenceAvatars.ts +53 -0
  584. package/src/utils/records.ts +0 -5
  585. package/src/{composables/useTimeUtils.ts → utils/time.ts} +0 -21
  586. package/dist/ResourcePickerListInternal-CFAw4vTZ.js +0 -605
  587. package/dist/ResourcePickerListInternal-CFAw4vTZ.js.map +0 -1
  588. package/dist/__tests__/composables/useBioTemplatePackWorkspace.test.d.ts +0 -1
  589. package/dist/__tests__/composables/useBioTemplatePresetWorkspace.test.d.ts +0 -1
  590. package/dist/__tests__/composables/useBioTemplateWorkspace.test.d.ts +0 -1
  591. package/dist/__tests__/composables/useChemicalFormula.test.d.ts +0 -1
  592. package/dist/__tests__/composables/useEventStream.test.d.ts +0 -1
  593. package/dist/__tests__/composables/useExperimentSave.test.d.ts +0 -1
  594. package/dist/__tests__/composables/useGeneratedAnalysis.test.d.ts +0 -1
  595. package/dist/__tests__/composables/useGroupAssignment.test.d.ts +0 -1
  596. package/dist/__tests__/composables/useJobsStatusTray.test.d.ts +0 -1
  597. package/dist/__tests__/composables/useMobileSupportGate.test.d.ts +0 -1
  598. package/dist/__tests__/composables/usePlatformContext.test.d.ts +0 -1
  599. package/dist/__tests__/composables/usePluginClient.test.d.ts +0 -1
  600. package/dist/__tests__/composables/usePresenceHeartbeat.test.d.ts +0 -1
  601. package/dist/__tests__/composables/useRequestSyncState.test.d.ts +0 -1
  602. package/dist/__tests__/composables/useRuntimeAlignment.test.d.ts +0 -1
  603. package/dist/__tests__/composables/useTemplateCollection.test.d.ts +0 -1
  604. package/dist/__tests__/composables/useTimeUtils.test.d.ts +0 -1
  605. package/dist/__tests__/docs/extractDocsTemplates.test.d.ts +0 -1
  606. package/dist/__tests__/templates/templates.test.d.ts +0 -1
  607. package/dist/__tests__/templates/templatesDeprecation.test.d.ts +0 -1
  608. package/dist/__tests__/utils/lcms.test.d.ts +0 -1
  609. package/dist/__tests__/utils/rack.test.d.ts +0 -1
  610. package/dist/components/AppAvatarMenu.vue.d.ts +0 -47
  611. package/dist/components/AppTopBar.navigation.d.ts +0 -10
  612. package/dist/components/BaseTextarea.vue.d.ts +0 -31
  613. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +0 -112
  614. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +0 -86
  615. package/dist/components/BioTemplatePresetWorkspaceView.vue.d.ts +0 -80
  616. package/dist/components/BioTemplateRenderer.vue.d.ts +0 -30
  617. package/dist/components/ControlWorkspaceView.vue.d.ts +0 -138
  618. package/dist/components/DoseDesignWorkspaceView.vue.d.ts +0 -140
  619. package/dist/components/ExperimentDataViewer.vue.d.ts +0 -54
  620. package/dist/components/ExperimentTimeline.vue.d.ts +0 -70
  621. package/dist/components/FitPanel.vue.d.ts +0 -56
  622. package/dist/components/GroupAssigner.vue.d.ts +0 -26
  623. package/dist/components/IconButton.vue.d.ts +0 -30
  624. package/dist/components/MobileSupportGate.vue.d.ts +0 -32
  625. package/dist/components/ReagentEditor.vue.d.ts +0 -31
  626. package/dist/components/ReagentList.presentation.d.ts +0 -17
  627. package/dist/components/ReagentList.vue.d.ts +0 -58
  628. package/dist/components/SampleLegend.vue.d.ts +0 -33
  629. package/dist/components/SmartGroupModal.vue.d.ts +0 -29
  630. package/dist/components/index.js +0 -5
  631. package/dist/components-BOA5e7kb.js +0 -23137
  632. package/dist/components-BOA5e7kb.js.map +0 -1
  633. package/dist/composables/flattenWorkspaceBindings.d.ts +0 -61
  634. package/dist/composables/index.js +0 -7
  635. package/dist/composables/useBioTemplateComponents.d.ts +0 -34
  636. package/dist/composables/useBioTemplateControls.d.ts +0 -10
  637. package/dist/composables/useBioTemplatePackWorkspace.d.ts +0 -56
  638. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +0 -79
  639. package/dist/composables/useBioTemplateWorkspace.d.ts +0 -39
  640. package/dist/composables/useExperimentSave.d.ts +0 -69
  641. package/dist/composables/useGroupAssignment.d.ts +0 -35
  642. package/dist/composables/useJobsStatusTray.d.ts +0 -87
  643. package/dist/composables/useMobileSupportGate.d.ts +0 -14
  644. package/dist/composables/usePlatformContext.d.ts +0 -218
  645. package/dist/composables/usePresenceHeartbeat.d.ts +0 -49
  646. package/dist/composables/useRuntimeAlignment.d.ts +0 -44
  647. package/dist/composables/useTemplateCollection.d.ts +0 -62
  648. package/dist/composables/workspaceRecipes.d.ts +0 -189
  649. package/dist/composables-izSQH8Ky.js +0 -591
  650. package/dist/composables-izSQH8Ky.js.map +0 -1
  651. package/dist/experiment-D49y_Kro.js +0 -459
  652. package/dist/experiment-D49y_Kro.js.map +0 -1
  653. package/dist/experiment-utils-DTANyVKV.js.map +0 -1
  654. package/dist/install.js.map +0 -1
  655. package/dist/lcms.d.ts +0 -38
  656. package/dist/settings-BG6v13Zq.js +0 -341
  657. package/dist/settings-BG6v13Zq.js.map +0 -1
  658. package/dist/tailwind.preset.d.ts +0 -63
  659. package/dist/tailwind.preset.js +0 -71
  660. package/dist/tailwind.preset.js.map +0 -1
  661. package/dist/templates/adapters.d.ts +0 -19
  662. package/dist/templates/assayLookups.d.ts +0 -3
  663. package/dist/templates/assayMatrixAdapters.d.ts +0 -13
  664. package/dist/templates/assayMatrixBuilder.d.ts +0 -3
  665. package/dist/templates/assayNormalizers.d.ts +0 -4
  666. package/dist/templates/builderIdUtils.d.ts +0 -4
  667. package/dist/templates/builderPresetControls.d.ts +0 -11
  668. package/dist/templates/builderReadUtils.d.ts +0 -8
  669. package/dist/templates/builders.d.ts +0 -26
  670. package/dist/templates/calibrationCurveAdapters.d.ts +0 -7
  671. package/dist/templates/calibrationCurveBuilder.d.ts +0 -3
  672. package/dist/templates/calibrationNormalizers.d.ts +0 -5
  673. package/dist/templates/catalog.d.ts +0 -192
  674. package/dist/templates/componentBindingCatalog.d.ts +0 -25
  675. package/dist/templates/componentBindingHelpers.d.ts +0 -17
  676. package/dist/templates/componentBindings.d.ts +0 -97
  677. package/dist/templates/componentDoseResponseProps.d.ts +0 -3
  678. package/dist/templates/componentGenericProps.d.ts +0 -8
  679. package/dist/templates/componentPlateHelpers.d.ts +0 -11
  680. package/dist/templates/componentPlateMapProps.d.ts +0 -3
  681. package/dist/templates/componentPropsFactory.d.ts +0 -3
  682. package/dist/templates/componentQpcrPlateProps.d.ts +0 -3
  683. package/dist/templates/componentTargetResolvers.d.ts +0 -5
  684. package/dist/templates/componentTemplateProps.d.ts +0 -3
  685. package/dist/templates/controlSchemaClone.d.ts +0 -4
  686. package/dist/templates/controlSchemaConstants.d.ts +0 -10
  687. package/dist/templates/controlSchemaMerge.d.ts +0 -3
  688. package/dist/templates/controlSchemaTargets.d.ts +0 -17
  689. package/dist/templates/controlSchemaTypes.d.ts +0 -4
  690. package/dist/templates/controlSchemas.d.ts +0 -34
  691. package/dist/templates/defaultBioTemplateBuilder.d.ts +0 -3
  692. package/dist/templates/doseResponseAdapters.d.ts +0 -6
  693. package/dist/templates/doseResponseBuilder.d.ts +0 -3
  694. package/dist/templates/elisaAssayCollectionBuilder.d.ts +0 -3
  695. package/dist/templates/flowCytometryAssayCollectionBuilder.d.ts +0 -3
  696. package/dist/templates/flowCytometryPanelBuilder.d.ts +0 -3
  697. package/dist/templates/flowNormalizers.d.ts +0 -8
  698. package/dist/templates/flowPanelAdapters.d.ts +0 -7
  699. package/dist/templates/index.d.ts +0 -15
  700. package/dist/templates/index.js +0 -2
  701. package/dist/templates/instrumentRunAdapterHelpers.d.ts +0 -8
  702. package/dist/templates/instrumentRunAdapters.d.ts +0 -19
  703. package/dist/templates/instrumentRunBuilder.d.ts +0 -3
  704. package/dist/templates/lcmsBatchCollectionBuilder.d.ts +0 -3
  705. package/dist/templates/lookup.d.ts +0 -4
  706. package/dist/templates/packs.d.ts +0 -21
  707. package/dist/templates/plateMapAdapters.d.ts +0 -5
  708. package/dist/templates/plateMapBuilder.d.ts +0 -3
  709. package/dist/templates/presetControlSchemas.d.ts +0 -534
  710. package/dist/templates/presets.d.ts +0 -106
  711. package/dist/templates/protocolAdapters.d.ts +0 -9
  712. package/dist/templates/protocolNormalizers.d.ts +0 -6
  713. package/dist/templates/protocolStepsBuilder.d.ts +0 -3
  714. package/dist/templates/qpcrAdapters.d.ts +0 -9
  715. package/dist/templates/qpcrExpressionCollectionBuilder.d.ts +0 -3
  716. package/dist/templates/qpcrPlateBuilder.d.ts +0 -3
  717. package/dist/templates/reagentAdapters.d.ts +0 -9
  718. package/dist/templates/reagentListBuilder.d.ts +0 -3
  719. package/dist/templates/runNormalizers.d.ts +0 -10
  720. package/dist/templates/sampleNormalizers.d.ts +0 -4
  721. package/dist/templates/samplePrepAdapters.d.ts +0 -7
  722. package/dist/templates/samplePrepBuilder.d.ts +0 -3
  723. package/dist/templates/sampleSheetAdapters.d.ts +0 -9
  724. package/dist/templates/sampleSheetBuilder.d.ts +0 -3
  725. package/dist/templates/targetedMetabolomicsCollectionBuilder.d.ts +0 -3
  726. package/dist/templates/targetedMetabolomicsHelpers.d.ts +0 -5
  727. package/dist/templates/templateAdapterTypes.d.ts +0 -48
  728. package/dist/templates/templateControlSchemas.d.ts +0 -400
  729. package/dist/templates/templateCreateOptions.d.ts +0 -165
  730. package/dist/templates/templateEnvelopes.d.ts +0 -17
  731. package/dist/templates/templatePackCollectionBuilder.d.ts +0 -3
  732. package/dist/templates/templatePresetCollectionBuilder.d.ts +0 -20
  733. package/dist/templates/templateQpcrTypes.d.ts +0 -42
  734. package/dist/templates/templateValidators.d.ts +0 -25
  735. package/dist/templates/timeCourseAdapters.d.ts +0 -9
  736. package/dist/templates/timeCourseBuilder.d.ts +0 -3
  737. package/dist/templates/types.d.ts +0 -304
  738. package/dist/templates/wellPlateScreenCollectionBuilder.d.ts +0 -3
  739. package/dist/templates/westernBlotAssayCollectionBuilder.d.ts +0 -3
  740. package/dist/templates-B2DB0MCM.js +0 -12304
  741. package/dist/templates-B2DB0MCM.js.map +0 -1
  742. package/dist/utils/rack.d.ts +0 -63
  743. package/dist/validation-C_eH_vIg.js +0 -7999
  744. package/dist/validation-C_eH_vIg.js.map +0 -1
  745. package/src/__tests__/components/AppAvatarMenu.test.ts +0 -186
  746. package/src/__tests__/components/AppTopBar.navigation.test.ts +0 -68
  747. package/src/__tests__/components/AppTopBarPresence.test.ts +0 -47
  748. package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +0 -159
  749. package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +0 -192
  750. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +0 -307
  751. package/src/__tests__/components/BioTemplateRenderer.test.ts +0 -96
  752. package/src/__tests__/components/ControlWorkspaceView.test.ts +0 -1100
  753. package/src/__tests__/components/DoseDesignWorkspaceView.test.ts +0 -183
  754. package/src/__tests__/components/ExperimentTimeline.test.ts +0 -108
  755. package/src/__tests__/components/FitPanel.test.ts +0 -96
  756. package/src/__tests__/components/GroupAssigner.test.ts +0 -101
  757. package/src/__tests__/components/MobileSupportGate.test.ts +0 -120
  758. package/src/__tests__/components/ReagentList.presentation.test.ts +0 -73
  759. package/src/__tests__/components/ReagentList.test.ts +0 -167
  760. package/src/__tests__/components/SampleLegend.test.ts +0 -18
  761. package/src/__tests__/components/SmartGroupModal.test.ts +0 -69
  762. package/src/__tests__/components/WellPlate.sampleTypeIndicator.test.ts +0 -58
  763. package/src/__tests__/components/iconButtonIconSizing.test.ts +0 -18
  764. package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +0 -125
  765. package/src/__tests__/composables/useBioTemplatePresetWorkspace.test.ts +0 -199
  766. package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +0 -104
  767. package/src/__tests__/composables/useExperimentSave.test.ts +0 -542
  768. package/src/__tests__/composables/useGroupAssignment.test.ts +0 -73
  769. package/src/__tests__/composables/useMobileSupportGate.test.ts +0 -74
  770. package/src/__tests__/composables/usePlatformContext.test.ts +0 -148
  771. package/src/__tests__/composables/usePresenceHeartbeat.test.ts +0 -164
  772. package/src/__tests__/composables/useRuntimeAlignment.test.ts +0 -145
  773. package/src/__tests__/composables/useTemplateCollection.test.ts +0 -147
  774. package/src/__tests__/docs/extractDocsTemplates.test.ts +0 -53
  775. package/src/__tests__/fixtures/templates/dose-response.json +0 -81
  776. package/src/__tests__/fixtures/templates/plate-map.json +0 -54
  777. package/src/__tests__/fixtures/templates/qpcr-plate.json +0 -96
  778. package/src/__tests__/fixtures/templates/sample-sheet.json +0 -71
  779. package/src/__tests__/templates/templates.test.ts +0 -1235
  780. package/src/__tests__/templates/templatesDeprecation.test.ts +0 -78
  781. package/src/__tests__/utils/lcms.test.ts +0 -73
  782. package/src/__tests__/utils/rack.test.ts +0 -120
  783. package/src/components/AppAvatarMenu.story.vue +0 -155
  784. package/src/components/AppAvatarMenu.vue +0 -154
  785. package/src/components/AppTopBar.navigation.ts +0 -60
  786. package/src/components/AutoGroupModal.story.vue +0 -458
  787. package/src/components/BaseTextarea.vue +0 -58
  788. package/src/components/BioTemplateExperimentWorkspaceView.story.vue +0 -123
  789. package/src/components/BioTemplateExperimentWorkspaceView.vue +0 -339
  790. package/src/components/BioTemplatePackWorkspaceView.story.vue +0 -107
  791. package/src/components/BioTemplatePackWorkspaceView.vue +0 -180
  792. package/src/components/BioTemplatePresetWorkspaceView.story.vue +0 -163
  793. package/src/components/BioTemplatePresetWorkspaceView.vue +0 -403
  794. package/src/components/BioTemplateRenderer.story.vue +0 -57
  795. package/src/components/BioTemplateRenderer.vue +0 -64
  796. package/src/components/ControlWorkspaceView.story.vue +0 -347
  797. package/src/components/ControlWorkspaceView.vue +0 -370
  798. package/src/components/DoseDesignWorkspaceView.story.vue +0 -77
  799. package/src/components/DoseDesignWorkspaceView.vue +0 -243
  800. package/src/components/ExperimentDataViewer.story.vue +0 -177
  801. package/src/components/ExperimentDataViewer.vue +0 -313
  802. package/src/components/ExperimentTimeline.story.vue +0 -208
  803. package/src/components/ExperimentTimeline.vue +0 -383
  804. package/src/components/FitPanel.story.vue +0 -191
  805. package/src/components/FitPanel.vue +0 -168
  806. package/src/components/FormActions.story.vue +0 -96
  807. package/src/components/GroupAssigner.story.vue +0 -83
  808. package/src/components/GroupAssigner.vue +0 -319
  809. package/src/components/IconButton.story.vue +0 -140
  810. package/src/components/IconButton.vue +0 -69
  811. package/src/components/MobileSupportGate.story.vue +0 -52
  812. package/src/components/MobileSupportGate.vue +0 -111
  813. package/src/components/ReagentEditor.story.vue +0 -153
  814. package/src/components/ReagentEditor.vue +0 -414
  815. package/src/components/ReagentList.presentation.ts +0 -106
  816. package/src/components/ReagentList.story.vue +0 -155
  817. package/src/components/ReagentList.vue +0 -438
  818. package/src/components/SampleLegend.story.vue +0 -91
  819. package/src/components/SampleLegend.vue +0 -121
  820. package/src/components/SmartGroupModal.story.vue +0 -61
  821. package/src/components/SmartGroupModal.vue +0 -61
  822. package/src/components/StatusIndicator.story.vue +0 -99
  823. package/src/components/StatusIndicator.vue +0 -36
  824. package/src/components/UnitInput.story.vue +0 -194
  825. package/src/composables/flattenWorkspaceBindings.ts +0 -104
  826. package/src/composables/useBioTemplateComponents.ts +0 -117
  827. package/src/composables/useBioTemplateControls.ts +0 -45
  828. package/src/composables/useBioTemplatePackWorkspace.ts +0 -201
  829. package/src/composables/useBioTemplatePresetWorkspace.ts +0 -329
  830. package/src/composables/useBioTemplateWorkspace.ts +0 -120
  831. package/src/composables/useChemicalFormula.ts +0 -301
  832. package/src/composables/useDoseCalculator.ts +0 -370
  833. package/src/composables/useExperimentSave.ts +0 -348
  834. package/src/composables/useGroupAssignment.ts +0 -152
  835. package/src/composables/useJobsStatusTray.ts +0 -493
  836. package/src/composables/useMobileSupportGate.ts +0 -80
  837. package/src/composables/usePlatformContext.ts +0 -299
  838. package/src/composables/usePresenceHeartbeat.ts +0 -201
  839. package/src/composables/useRuntimeAlignment.ts +0 -184
  840. package/src/composables/useTemplateCollection.ts +0 -233
  841. package/src/composables/workspaceRecipes.ts +0 -268
  842. package/src/lcms.ts +0 -119
  843. package/src/styles/components/app-avatar-menu.css +0 -121
  844. package/src/styles/components/experiment-data-viewer.css +0 -138
  845. package/src/styles/components/experiment-timeline.css +0 -572
  846. package/src/styles/components/fit-panel.css +0 -153
  847. package/src/styles/components/group-assigner.css +0 -198
  848. package/src/styles/components/mobile-support-gate.css +0 -117
  849. package/src/styles/components/reagent-editor.css +0 -501
  850. package/src/styles/components/reagent-list.css +0 -408
  851. package/src/styles/components/sample-legend.css +0 -212
  852. package/src/styles/components/status-indicator.css +0 -66
  853. package/src/styles/components/theme-toggle.css +0 -6
  854. package/src/tailwind.preset.ts +0 -66
  855. package/src/templates/adapters.ts +0 -141
  856. package/src/templates/assayLookups.ts +0 -33
  857. package/src/templates/assayMatrixAdapters.ts +0 -85
  858. package/src/templates/assayMatrixBuilder.ts +0 -60
  859. package/src/templates/assayNormalizers.ts +0 -34
  860. package/src/templates/builderIdUtils.ts +0 -20
  861. package/src/templates/builderPresetControls.ts +0 -166
  862. package/src/templates/builderReadUtils.ts +0 -55
  863. package/src/templates/builders.ts +0 -122
  864. package/src/templates/calibrationCurveAdapters.ts +0 -62
  865. package/src/templates/calibrationCurveBuilder.ts +0 -100
  866. package/src/templates/calibrationNormalizers.ts +0 -60
  867. package/src/templates/catalog.ts +0 -249
  868. package/src/templates/componentBindingCatalog.ts +0 -90
  869. package/src/templates/componentBindingHelpers.ts +0 -93
  870. package/src/templates/componentBindings.ts +0 -279
  871. package/src/templates/componentDoseResponseProps.ts +0 -41
  872. package/src/templates/componentGenericProps.ts +0 -77
  873. package/src/templates/componentPlateHelpers.ts +0 -52
  874. package/src/templates/componentPlateMapProps.ts +0 -34
  875. package/src/templates/componentPropsFactory.ts +0 -21
  876. package/src/templates/componentQpcrPlateProps.ts +0 -27
  877. package/src/templates/componentTargetResolvers.ts +0 -67
  878. package/src/templates/componentTemplateProps.ts +0 -78
  879. package/src/templates/controlSchemaClone.ts +0 -32
  880. package/src/templates/controlSchemaConstants.ts +0 -11
  881. package/src/templates/controlSchemaMerge.ts +0 -40
  882. package/src/templates/controlSchemaTargets.ts +0 -85
  883. package/src/templates/controlSchemaTypes.ts +0 -20
  884. package/src/templates/controlSchemas.ts +0 -113
  885. package/src/templates/defaultBioTemplateBuilder.ts +0 -125
  886. package/src/templates/doseResponseAdapters.ts +0 -36
  887. package/src/templates/doseResponseBuilder.ts +0 -45
  888. package/src/templates/elisaAssayCollectionBuilder.ts +0 -63
  889. package/src/templates/flowCytometryAssayCollectionBuilder.ts +0 -42
  890. package/src/templates/flowCytometryPanelBuilder.ts +0 -54
  891. package/src/templates/flowNormalizers.ts +0 -58
  892. package/src/templates/flowPanelAdapters.ts +0 -61
  893. package/src/templates/index.ts +0 -330
  894. package/src/templates/instrumentRunAdapterHelpers.ts +0 -94
  895. package/src/templates/instrumentRunAdapters.ts +0 -174
  896. package/src/templates/instrumentRunBuilder.ts +0 -98
  897. package/src/templates/lcmsBatchCollectionBuilder.ts +0 -39
  898. package/src/templates/lookup.ts +0 -18
  899. package/src/templates/packs.ts +0 -166
  900. package/src/templates/plateMapAdapters.ts +0 -38
  901. package/src/templates/plateMapBuilder.ts +0 -44
  902. package/src/templates/presetControlSchemas.ts +0 -258
  903. package/src/templates/presets.ts +0 -183
  904. package/src/templates/protocolAdapters.ts +0 -73
  905. package/src/templates/protocolNormalizers.ts +0 -37
  906. package/src/templates/protocolStepsBuilder.ts +0 -37
  907. package/src/templates/qpcrAdapters.ts +0 -108
  908. package/src/templates/qpcrExpressionCollectionBuilder.ts +0 -34
  909. package/src/templates/qpcrPlateBuilder.ts +0 -97
  910. package/src/templates/reagentAdapters.ts +0 -81
  911. package/src/templates/reagentListBuilder.ts +0 -31
  912. package/src/templates/runNormalizers.ts +0 -63
  913. package/src/templates/sampleNormalizers.ts +0 -58
  914. package/src/templates/samplePrepAdapters.ts +0 -66
  915. package/src/templates/samplePrepBuilder.ts +0 -52
  916. package/src/templates/sampleSheetAdapters.ts +0 -79
  917. package/src/templates/sampleSheetBuilder.ts +0 -24
  918. package/src/templates/targetedMetabolomicsCollectionBuilder.ts +0 -80
  919. package/src/templates/targetedMetabolomicsHelpers.ts +0 -102
  920. package/src/templates/templateAdapterTypes.ts +0 -58
  921. package/src/templates/templateControlSchemas.ts +0 -320
  922. package/src/templates/templateCreateOptions.ts +0 -208
  923. package/src/templates/templateEnvelopes.ts +0 -145
  924. package/src/templates/templatePackCollectionBuilder.ts +0 -24
  925. package/src/templates/templatePresetCollectionBuilder.ts +0 -141
  926. package/src/templates/templateQpcrTypes.ts +0 -48
  927. package/src/templates/templateValidators.ts +0 -426
  928. package/src/templates/timeCourseAdapters.ts +0 -77
  929. package/src/templates/timeCourseBuilder.ts +0 -65
  930. package/src/templates/types.ts +0 -493
  931. package/src/templates/wellPlateScreenCollectionBuilder.ts +0 -37
  932. package/src/templates/westernBlotAssayCollectionBuilder.ts +0 -69
  933. package/src/utils/rack.ts +0 -225
  934. /package/dist/__tests__/components/{AppAvatarMenu.test.d.ts → BaseButton.test.d.ts} +0 -0
  935. /package/dist/__tests__/components/{AppTopBar.navigation.test.d.ts → BaseCheckbox.switch.test.d.ts} +0 -0
  936. /package/dist/__tests__/components/{AppTopBarPresence.test.d.ts → BaseSelect.multiple.test.d.ts} +0 -0
  937. /package/dist/__tests__/components/{BaseToggle.test.d.ts → BaseSelect.searchable.test.d.ts} +0 -0
  938. /package/dist/__tests__/components/{BioTemplateExperimentWorkspaceView.test.d.ts → ConfirmDialog.test.d.ts} +0 -0
  939. /package/dist/__tests__/components/{BioTemplatePackWorkspaceView.test.d.ts → DatePicker.datetime.test.d.ts} +0 -0
  940. /package/dist/__tests__/components/{BioTemplatePresetWorkspaceView.test.d.ts → DatePicker.time.test.d.ts} +0 -0
  941. /package/dist/__tests__/components/{BioTemplateRenderer.test.d.ts → FormSchemaInternal.test.d.ts} +0 -0
  942. /package/dist/__tests__/components/{ControlWorkspaceView.test.d.ts → InstrumentStatusPanels.test.d.ts} +0 -0
  943. /package/dist/__tests__/components/{DateTimePicker.test.d.ts → NumberInput.units.test.d.ts} +0 -0
  944. /package/dist/__tests__/components/{DoseDesignWorkspaceView.test.d.ts → PresenceAvatars.test.d.ts} +0 -0
  945. /package/dist/__tests__/components/{ExperimentTimeline.test.d.ts → StaleFormBanner.test.d.ts} +0 -0
  946. /package/dist/__tests__/components/{FitPanel.test.d.ts → deprecationTags.test.d.ts} +0 -0
  947. /package/dist/__tests__/{components/GroupAssigner.test.d.ts → composables/createClient.test.d.ts} +0 -0
  948. /package/dist/__tests__/{components/MobileSupportGate.test.d.ts → composables/eventStream.test.d.ts} +0 -0
  949. /package/dist/__tests__/{components/MultiSelect.test.d.ts → composables/useArtifacts.test.d.ts} +0 -0
  950. /package/dist/__tests__/{components/ReagentList.presentation.test.d.ts → composables/useExperiment.test.d.ts} +0 -0
  951. /package/dist/__tests__/{components/ReagentList.test.d.ts → composables/useJobCenter.test.d.ts} +0 -0
  952. /package/dist/__tests__/{components/SampleLegend.test.d.ts → composables/useJobsEndpoint.test.d.ts} +0 -0
  953. /package/dist/__tests__/{components/SearchableSelect.test.d.ts → composables/usePlatform.test.d.ts} +0 -0
  954. /package/dist/__tests__/{components/SmartGroupModal.test.d.ts → composables/usePresence.test.d.ts} +0 -0
  955. /package/dist/__tests__/{components/TimePicker.test.d.ts → composables/useRealtime.test.d.ts} +0 -0
  956. /package/dist/__tests__/{components/UnitInput.test.d.ts → composables/useRequest.test.d.ts} +0 -0
  957. /package/dist/__tests__/{components/WellPlate.sampleTypeIndicator.test.d.ts → composables/useVersionedSave.test.d.ts} +0 -0
  958. /package/dist/__tests__/{components/iconButtonIconSizing.test.d.ts → utils/formula.test.d.ts} +0 -0
  959. /package/dist/__tests__/{composables/useAnalysisArtifacts.test.d.ts → utils/time.test.d.ts} +0 -0
  960. /package/dist/components/{FormActions.vue.d.ts → internal/FormActionsInternal.vue.d.ts} +0 -0
  961. /package/dist/{composables → components/internal}/autoGroup/colors.d.ts +0 -0
  962. /package/dist/{composables → components/internal}/autoGroup/index.d.ts +0 -0
  963. /package/dist/{composables → components/internal}/autoGroup/tokenize.d.ts +0 -0
  964. /package/src/{composables → components/internal}/autoGroup/colors.ts +0 -0
  965. /package/src/{composables → components/internal}/autoGroup/tokenize.ts +0 -0
  966. /package/src/{composables → components/internal}/autoGroup/vocab.json +0 -0
@@ -13,14 +13,14 @@
13
13
  *
14
14
  * @example
15
15
  * ```vue
16
- * <PlateEditor v-model:active-rack-id="activeId" :model-value="racks" slots fill-series @well-edit="save" />
16
+ * <PlateEditor v-model:active-rack="activeId" :spec="definePlateEditor({ slots: true, fillSeries: true })" :model-value="racks" @well-edit="save" />
17
17
  * ```
18
18
  */
19
19
  import { computed, onBeforeUnmount, onMounted, ref, watch, type ComponentPublicInstance } from 'vue'
20
20
  import { Download, Move, Plus, Redo2, Trash2, Undo2, Upload, X } from 'lucide-vue-next'
21
21
  import type {
22
22
  ActionMenuItem,
23
- PlateEditorClearConfirm,
23
+ PlateEditorSpec,
24
24
  Rack,
25
25
  SampleType,
26
26
  SlotPosition,
@@ -30,7 +30,6 @@ import type {
30
30
  WellLegendItem,
31
31
  WellPlateFormat,
32
32
  WellPlateSelectionMode,
33
- WellPlateSize,
34
33
  WellSampleDropData,
35
34
  WellSampleDropParser,
36
35
  } from '../types'
@@ -40,90 +39,61 @@ import { useRovingFocus } from '../composables/useRovingFocus'
40
39
  import { PLATE_CONFIGS, WELL_PLATE_SIZE_CONFIGS } from './WellPlate.geometry'
41
40
  import { parseDroppedSampleJson } from './WellPlate.sampleDrop'
42
41
  import { DEFAULT_WELL_LEGEND_ITEMS } from './WellPlate.legend'
42
+ import { applySpecDefaults, defineWellPlate } from '../composables/componentSpecs'
43
43
  import { sampleTypeMarker } from '../utils/sampleTypeMarker'
44
44
  import WellPlate from './WellPlate.vue'
45
45
  import WellEditPopupInternal from './internal/WellEditPopupInternal.vue'
46
46
  import ActionMenu from './ActionMenu.vue'
47
+ import BaseButton from './BaseButton.vue'
47
48
  import SegmentedControl from './SegmentedControl.vue'
48
- import IconButton from './IconButton.vue'
49
49
  import ConfirmDialog from './ConfirmDialog.vue'
50
- import BaseTextarea from './BaseTextarea.vue'
50
+ import BaseInput from './BaseInput.vue'
51
51
 
52
52
  interface Props {
53
+ /** Structure built with definePlateEditor(). Optional: every option has a default. */
54
+ spec?: PlateEditorSpec
53
55
  /** The plates. Never mutated; changes arrive as emitted intents. */
54
56
  modelValue: Rack[]
55
- activeRackId?: string
56
- /** Formats offered by the format control; one entry hides it. */
57
- formats?: WellPlateFormat[]
58
- /** R/G/B/Y slot buttons: `true` for all four, a list for a subset. */
59
- slots?: boolean | SlotPosition[]
60
- /** Reorder plate tabs by drag or Alt+←/→. */
61
- reorder?: boolean
62
- /** Show the Drag toggle that moves / swaps wells (`well-move`). */
63
- wellDrag?: boolean
64
- /** Groups for the selection bar; a well's `group` holds the group id and colors it. */
65
- groups?: SampleType[] | false
66
- /** Fields of the single-well inspector; `false` turns the inspector off. */
67
- wellFields?: WellEditField[] | false
68
- /** Accept dropped samples: `true` reads JSON payloads, a parser may return `null` to reject. */
69
- sampleDrop?: boolean | WellSampleDropParser
70
- /** Show an Import button: a chosen file emits `import`, pasted text `import-text` (see `importMode`). */
71
- import?: boolean
72
- /** What `import` offers: a file picker, a paste dialog whose text `import-text` emits unparsed, or both. */
73
- importMode?: 'file' | 'paste' | 'both'
74
- /** The file picker's `accept` filter for `import`, e.g. `'.csv'`. */
75
- importAccept?: string
76
- /** Export formats offered in the Import / Export menu; each emits `export`. */
77
- export?: string[] | false
78
- /** Clear-plate button: ask first, clear with an Undo button, or hide it. */
79
- clear?: 'confirm' | 'undo' | false
80
- /** Text and variant of the `clear="confirm"` dialog; unset fields keep the defaults. */
81
- clearConfirm?: PlateEditorClearConfirm
82
- /** Show Undo / Redo (also shown when `clear` is `'undo'`); they only emit intents. */
83
- history?: boolean
57
+ /** Id of the active plate. Bind with `v-model:active-rack`; unbound, the tabs keep their own choice. */
58
+ activeRack?: string
84
59
  canUndo?: boolean
85
60
  canRedo?: boolean
86
- /** Show the Fill Series button. */
87
- fillSeries?: boolean
88
- /** On a full plate: disable Fill Series, or keep it enabled and still emit `fill-series` (e.g. to show a toast). */
89
- fillSeriesWhenFull?: 'disable' | 'emit'
90
- maxRacks?: number
91
- minRacks?: number
92
61
  /** No editing controls; well clicks still emit `well-click`. */
93
62
  readonly?: boolean
94
- size?: WellPlateSize
95
63
  /** Footer text while nothing is selected; replaces the built-in selection hint. */
96
64
  hint?: string
97
65
  }
98
66
 
99
67
  const props = withDefaults(defineProps<Props>(), {
100
- activeRackId: undefined,
101
- formats: () => [54, 96],
68
+ spec: () => ({}),
69
+ activeRack: undefined,
70
+ canUndo: false,
71
+ canRedo: false,
72
+ readonly: false,
73
+ })
74
+
75
+ const config = computed(() => applySpecDefaults({
76
+ formats: [54, 96],
102
77
  slots: false,
103
78
  reorder: true,
104
79
  wellDrag: false,
105
80
  groups: false,
106
- wellFields: () => ['label', 'sampleType', 'injectionVolume', 'injectionCount', 'customMethod'],
81
+ wellFields: ['label', 'sampleType', 'injectionVolume', 'injectionCount', 'customMethod'],
107
82
  sampleDrop: false,
108
83
  import: false,
109
84
  importMode: 'file',
110
- importAccept: undefined,
111
85
  export: false,
112
86
  clear: 'confirm',
113
- clearConfirm: undefined,
114
87
  history: false,
115
- canUndo: false,
116
- canRedo: false,
117
88
  fillSeries: false,
118
89
  fillSeriesWhenFull: 'disable',
119
90
  maxRacks: 10,
120
91
  minRacks: 1,
121
- readonly: false,
122
92
  size: 'xs',
123
- })
93
+ }, props.spec))
124
94
 
125
95
  const emit = defineEmits<{
126
- 'update:activeRackId': [rackId: string]
96
+ 'update:activeRack': [rackId: string]
127
97
  'rack-add': []
128
98
  'rack-remove': [rackId: string]
129
99
  'rack-reorder': [rackIds: string[]]
@@ -172,17 +142,17 @@ defineSlots<{
172
142
  'toolbar-extra'?: () => unknown
173
143
  }>()
174
144
 
175
- // --- Active plate: a bound activeRackId wins; unbound, the tabs keep their own choice ---
145
+ // --- Active plate: a bound activeRack wins; unbound, the tabs keep their own choice ---
176
146
  const localActiveId = ref<string>()
177
147
 
178
148
  const activeRack = computed<Rack | undefined>(() => {
179
- const id = props.activeRackId ?? localActiveId.value
149
+ const id = props.activeRack ?? localActiveId.value
180
150
  return props.modelValue.find(rack => rack.id === id) ?? props.modelValue[0]
181
151
  })
182
152
 
183
153
  function selectRack(rackId: string) {
184
154
  localActiveId.value = rackId
185
- emit('update:activeRackId', rackId)
155
+ emit('update:activeRack', rackId)
186
156
  }
187
157
 
188
158
  function filledCount(rack: Rack): number {
@@ -207,7 +177,7 @@ const reorder = useListReorder<Rack>({
207
177
  items: () => props.modelValue,
208
178
  getId: rack => rack.id,
209
179
  getLabel: rack => rack.name,
210
- disabled: () => !props.reorder || props.readonly,
180
+ disabled: () => !config.value.reorder || props.readonly,
211
181
  getElement: id => tabRefs.get(id),
212
182
  itemNoun: 'Plate',
213
183
  onReorder: ({ fromIndex, toIndex }) => {
@@ -220,14 +190,14 @@ function handleTabKeydown(event: KeyboardEvent, rack: Rack, index: number) {
220
190
  else handleTabArrows(event)
221
191
  }
222
192
 
223
- const canReorder = computed(() => props.reorder && !props.readonly)
224
- const canAdd = computed(() => !props.readonly && props.modelValue.length < props.maxRacks)
225
- const canRemove = computed(() => !props.readonly && props.modelValue.length > props.minRacks)
193
+ const canReorder = computed(() => config.value.reorder && !props.readonly)
194
+ const canAdd = computed(() => !props.readonly && props.modelValue.length < config.value.maxRacks)
195
+ const canRemove = computed(() => !props.readonly && props.modelValue.length > config.value.minRacks)
226
196
 
227
197
  // --- Toolbar ---
228
- const formatOptions = computed(() => props.formats.map(format => ({ value: format, label: String(format) })))
198
+ const formatOptions = computed(() => config.value.formats.map(format => ({ value: format, label: String(format) })))
229
199
  const slotOptions = computed<readonly SlotPosition[]>(() =>
230
- props.slots === true ? SLOT_ORDER : props.slots || [],
200
+ config.value.slots === true ? SLOT_ORDER : config.value.slots || [],
231
201
  )
232
202
  const dragMode = ref(false)
233
203
  const confirmOpen = ref(false)
@@ -249,7 +219,7 @@ function toggleDrag() {
249
219
  function requestClear() {
250
220
  const rack = activeRack.value
251
221
  if (!rack) return
252
- if (props.clear === 'confirm') confirmOpen.value = true
222
+ if (config.value.clear === 'confirm') confirmOpen.value = true
253
223
  else emit('clear', rack.id)
254
224
  }
255
225
 
@@ -266,12 +236,12 @@ function handleFile(event: Event) {
266
236
  input.value = ''
267
237
  }
268
238
 
269
- const importFile = computed(() => props.import && props.importMode !== 'paste')
270
- const importPaste = computed(() => props.import && props.importMode !== 'file')
271
- const exportFormats = computed(() => props.export || [])
239
+ const importFile = computed(() => config.value.import && config.value.importMode !== 'paste')
240
+ const importPaste = computed(() => config.value.import && config.value.importMode !== 'file')
241
+ const exportFormats = computed(() => config.value.export || [])
272
242
  const ioLabel = computed(() => {
273
243
  if (!exportFormats.value.length) return 'Import'
274
- return props.import ? 'Import / Export' : 'Export'
244
+ return config.value.import ? 'Import / Export' : 'Export'
275
245
  })
276
246
  const ioItems = computed<ActionMenuItem[]>(() => [
277
247
  ...(importFile.value ? [{ id: 'import', label: 'Import file…' }] : []),
@@ -296,7 +266,7 @@ function handleIo(item: ActionMenuItem) {
296
266
  else emit('export', item.id.slice('export:'.length))
297
267
  }
298
268
 
299
- const showHistory = computed(() => !props.readonly && (props.history || props.clear === 'undo'))
269
+ const showHistory = computed(() => !props.readonly && (config.value.history || config.value.clear === 'undo'))
300
270
 
301
271
  // Scoped to the editor, and text fields keep their own undo.
302
272
  function handleRootKeydown(event: KeyboardEvent) {
@@ -318,7 +288,7 @@ watch(() => [props.canUndo, props.canRedo], () => {
318
288
  })
319
289
 
320
290
  // --- Plate ---
321
- const groupList = computed(() => props.groups || [])
291
+ const groupList = computed(() => config.value.groups || [])
322
292
  const groupColor = (group: SampleType, index: number) =>
323
293
  group.color ?? SAMPLE_GROUP_TOKENS[index % SAMPLE_GROUP_TOKENS.length]
324
294
 
@@ -326,8 +296,8 @@ const sampleColors = computed<Record<string, string>>(() =>
326
296
  Object.fromEntries(groupList.value.map((group, index) => [group.id, groupColor(group, index)])),
327
297
  )
328
298
  const legendItems = computed<WellLegendItem[] | undefined>(() =>
329
- props.groups
330
- ? props.groups.map((group, index) => ({ type: group.id, label: group.name, color: groupColor(group, index) }))
299
+ config.value.groups
300
+ ? config.value.groups.map((group, index) => ({ type: group.id, label: group.name, color: groupColor(group, index) }))
331
301
  : undefined,
332
302
  )
333
303
 
@@ -353,7 +323,7 @@ onBeforeUnmount(() => resizeObserver?.disconnect())
353
323
  // ponytail: plate width from the size table (table border-spacing counted per column); 'fill' counts as 0.
354
324
  const plateWidth = computed(() => {
355
325
  const { cols } = PLATE_CONFIGS[activeRack.value?.format ?? 96]
356
- const size = WELL_PLATE_SIZE_CONFIGS[props.size]
326
+ const size = WELL_PLATE_SIZE_CONFIGS[config.value.size]
357
327
  const px = (value: string) => (value.endsWith('px') ? parseFloat(value) : 0)
358
328
  return px(size.headerWidth) + cols * px(size.cellWidth) + (cols + 2) * px(size.gap)
359
329
  })
@@ -366,30 +336,46 @@ const railItems = computed(() => {
366
336
  const items = legendItems.value ?? DEFAULT_WELL_LEGEND_ITEMS
367
337
  return items.map(item => ({
368
338
  ...item,
369
- count: wells.filter(well => (props.groups ? well.group : well.sampleType) === item.type).length,
370
- swatch: props.groups ? { backgroundColor: item.color } : sampleTypeMarker(item.type, item.color).style,
371
- glyph: props.groups ? '' : sampleTypeMarker(item.type, item.color).glyph,
339
+ count: wells.filter(well => (config.value.groups ? well.group : well.sampleType) === item.type).length,
340
+ swatch: config.value.groups ? { backgroundColor: item.color } : sampleTypeMarker(item.type, item.color).style,
341
+ glyph: config.value.groups ? '' : sampleTypeMarker(item.type, item.color).glyph,
372
342
  }))
373
343
  })
374
344
 
375
- const inspectorOn = computed(() => Boolean(props.wellFields) && !props.readonly && !dragMode.value)
345
+ const inspectorOn = computed(() => Boolean(config.value.wellFields) && !props.readonly && !dragMode.value)
376
346
 
377
347
  const selectionMode = computed<WellPlateSelectionMode>(() => {
378
348
  if (props.readonly) return 'none'
379
349
  if (dragMode.value) return 'drag'
380
350
  // Without groups the selection only feeds the inspector; with neither, nothing acts on it.
381
- if (!props.groups && !inspectorOn.value) return 'none'
351
+ if (!config.value.groups && !inspectorOn.value) return 'none'
382
352
  // A Ctrl/Cmd-click toggles a well in every mode. Beside the rail a plain click selects
383
353
  // one well and the inspector opens there; in the popover mode it opens the popover.
384
354
  // Groups add the rectangle drag, except where a plain click edits.
385
- return props.groups && (railOn.value || !inspectorOn.value) ? 'rectangle' : 'multiple'
355
+ return config.value.groups && (railOn.value || !inspectorOn.value) ? 'rectangle' : 'multiple'
386
356
  })
387
357
 
388
358
  const dropParser = computed<WellSampleDropParser | undefined>(() => {
389
- if (typeof props.sampleDrop === 'function') return props.sampleDrop
390
- return props.sampleDrop ? event => (event.dataTransfer ? parseDroppedSampleJson(event.dataTransfer) : null) : undefined
359
+ if (typeof config.value.sampleDrop === 'function') return config.value.sampleDrop
360
+ return config.value.sampleDrop ? event => (event.dataTransfer ? parseDroppedSampleJson(event.dataTransfer) : null) : undefined
391
361
  })
392
362
 
363
+ const plateSpec = computed(() => defineWellPlate({
364
+ format: activeRack.value?.format,
365
+ selectionMode: selectionMode.value,
366
+ editable: inspectorOn.value && !railOn.value,
367
+ editFields: config.value.wellFields || undefined,
368
+ defaultInjectionVolume: activeRack.value?.injectionVolume,
369
+ size: config.value.size,
370
+ sampleColors: sampleColors.value,
371
+ legendItems: legendItems.value,
372
+ allowSampleDrop: Boolean(config.value.sampleDrop) && !props.readonly,
373
+ sampleDropParser: dropParser.value,
374
+ showWellLabels: config.value.size !== 'xs',
375
+ showBadges: true,
376
+ showLegend: !railOn.value,
377
+ }))
378
+
393
379
  const selection = ref<string[]>([])
394
380
  function setSelection(wellIds: string[]) {
395
381
  selection.value = wellIds
@@ -404,7 +390,7 @@ watch(
404
390
 
405
391
  // Without groups a selection beside the rail is the inspected well; it closes with the rail
406
392
  // instead of reopening, and stealing focus, when the rail comes back.
407
- watch(railOn, () => { if (!props.groups && selection.value.length) setSelection([]) })
393
+ watch(railOn, () => { if (!config.value.groups && selection.value.length) setSelection([]) })
408
394
 
409
395
  function handleSelection(wellIds: string[]) {
410
396
  if (selectionMode.value === 'none' || dragMode.value) return
@@ -414,7 +400,7 @@ function handleSelection(wellIds: string[]) {
414
400
  function handleWellEdit(wellId: string, data: WellEditData) {
415
401
  const rack = activeRack.value
416
402
  if (!rack) return
417
- const fields = props.wellFields || []
403
+ const fields = config.value.wellFields || []
418
404
  // An unnamed sample is an empty well, unless its group still names it; blanks and QCs stand alone.
419
405
  const grouped = groupList.value.some(group => group.id === rack.wells[wellId]?.group)
420
406
  const sample = !data.sampleType || data.sampleType === 'sample'
@@ -449,7 +435,7 @@ function assign(groupId: string | undefined) {
449
435
  const hint = computed(() => {
450
436
  if (dragMode.value) return 'Drag a filled well onto another to move or swap it.'
451
437
  if (props.hint) return props.hint
452
- if (!props.groups) return ''
438
+ if (!config.value.groups) return ''
453
439
  if (railOn.value) {
454
440
  return inspectorOn.value
455
441
  ? 'Click a well to edit it on the right. Drag across wells, Ctrl-click to add one or Shift-click for a range.'
@@ -518,27 +504,22 @@ const hint = computed(() => {
518
504
  </span>
519
505
  </div>
520
506
 
521
- <IconButton
507
+ <BaseButton
522
508
  v-if="canAdd"
523
509
  class="mint-plate-editor__add"
524
510
  variant="ghost"
525
511
  size="sm"
512
+ :icon="Plus"
526
513
  label="Add plate"
527
514
  @click="emit('rack-add')"
528
- >
529
- <Plus :size="16" aria-hidden="true" />
530
- </IconButton>
515
+ />
531
516
 
532
517
  <div class="mint-plate-editor__tabbar-end">
533
518
  <template v-if="showHistory">
534
- <IconButton variant="ghost" size="sm" label="Undo" title="Undo (Ctrl+Z)" data-history="undo" :disabled="!canUndo" @click="emit('undo')">
535
- <Undo2 :size="16" aria-hidden="true" />
536
- </IconButton>
537
- <IconButton variant="ghost" size="sm" label="Redo" title="Redo (Ctrl+Shift+Z)" data-history="redo" :disabled="!canRedo" @click="emit('redo')">
538
- <Redo2 :size="16" aria-hidden="true" />
539
- </IconButton>
519
+ <BaseButton variant="ghost" size="sm" :icon="Undo2" label="Undo" title="Undo (Ctrl+Z)" data-history="undo" :disabled="!canUndo" @click="emit('undo')" />
520
+ <BaseButton variant="ghost" size="sm" :icon="Redo2" label="Redo" title="Redo (Ctrl+Shift+Z)" data-history="redo" :disabled="!canRedo" @click="emit('redo')" />
540
521
  </template>
541
- <template v-if="!readonly && ($props.import || exportFormats.length)">
522
+ <template v-if="!readonly && (config.import || exportFormats.length)">
542
523
  <span v-if="showHistory" class="mint-plate-editor__divider" aria-hidden="true" />
543
524
  <ActionMenu v-if="exportFormats.length || ioItems.length > 1" :label="ioLabel" :items="ioItems" @select="handleIo">
544
525
  <template #trigger="{ open, toggle, keydown }">
@@ -557,7 +538,7 @@ const hint = computed(() => {
557
538
  <Upload :size="14" aria-hidden="true" />
558
539
  Import
559
540
  </button>
560
- <input v-if="importFile" ref="fileInput" type="file" class="mint-plate-editor__file" :accept="importAccept" tabindex="-1" aria-hidden="true" @change="handleFile">
541
+ <input v-if="importFile" ref="fileInput" type="file" class="mint-plate-editor__file" :accept="config.importAccept" tabindex="-1" aria-hidden="true" @change="handleFile">
561
542
  </template>
562
543
  <slot name="tab-extra" />
563
544
  </div>
@@ -565,7 +546,7 @@ const hint = computed(() => {
565
546
 
566
547
  <!-- Toolbar for the active plate -->
567
548
  <div v-if="showToolbar && activeRack" class="mint-plate-editor__toolbar">
568
- <div v-if="formats.length > 1" class="mint-plate-editor__field mint-plate-editor__field--format">
549
+ <div v-if="config.formats.length > 1" class="mint-plate-editor__field mint-plate-editor__field--format">
569
550
  <span class="mint-plate-editor__label">Format</span>
570
551
  <SegmentedControl
571
552
  :model-value="activeRack.format"
@@ -598,18 +579,18 @@ const hint = computed(() => {
598
579
 
599
580
  <div class="mint-plate-editor__toolbar-end">
600
581
  <button
601
- v-if="fillSeries"
582
+ v-if="config.fillSeries"
602
583
  type="button"
603
584
  class="mint-plate-editor__action"
604
585
  data-action="fill-series"
605
- :disabled="isFull && fillSeriesWhenFull === 'disable'"
586
+ :disabled="isFull && config.fillSeriesWhenFull === 'disable'"
606
587
  :title="isFull ? 'Plate is full' : 'Name every empty well in order'"
607
588
  @click="emit('fill-series', activeRack.id)"
608
589
  >
609
590
  Fill Series
610
591
  </button>
611
592
  <button
612
- v-if="wellDrag"
593
+ v-if="config.wellDrag"
613
594
  type="button"
614
595
  :class="['mint-plate-editor__action', { 'mint-plate-editor__action--on': dragMode }]"
615
596
  data-action="drag"
@@ -621,7 +602,7 @@ const hint = computed(() => {
621
602
  Drag
622
603
  </button>
623
604
  <button
624
- v-if="clear"
605
+ v-if="config.clear"
625
606
  type="button"
626
607
  class="mint-plate-editor__action mint-plate-editor__action--danger"
627
608
  :disabled="isEmpty"
@@ -642,21 +623,9 @@ const hint = computed(() => {
642
623
  <WellPlate
643
624
  :key="activeRack.id"
644
625
  :model-value="selection"
645
- :format="activeRack.format"
626
+ :spec="plateSpec"
646
627
  :wells="activeRack.wells"
647
- :selection-mode="selectionMode"
648
- :editable="inspectorOn && !railOn"
649
- :edit-fields="wellFields || undefined"
650
- :default-injection-volume="activeRack.injectionVolume"
651
628
  :readonly="readonly"
652
- :size="size"
653
- :sample-colors="sampleColors"
654
- :legend-items="legendItems"
655
- :allow-sample-drop="Boolean(sampleDrop) && !readonly"
656
- :sample-drop-parser="dropParser"
657
- :show-well-labels="size !== 'xs'"
658
- show-badges
659
- :show-legend="!railOn"
660
629
  @well-click="(wellId: string) => emit('well-click', activeRack!.id, wellId)"
661
630
  @selection-change="handleSelection"
662
631
  @well-edit="handleWellEdit"
@@ -670,15 +639,15 @@ const hint = computed(() => {
670
639
  </WellPlate>
671
640
 
672
641
  <!-- Selection bar, or a hint while nothing is selected -->
673
- <div v-if="!readonly && (groups || wellDrag)" class="mint-plate-editor__footer">
674
- <div v-if="selection.length && groups" class="mint-plate-editor__selection" role="toolbar" aria-label="Selected wells">
642
+ <div v-if="!readonly && (config.groups || config.wellDrag)" class="mint-plate-editor__footer">
643
+ <div v-if="selection.length && config.groups" class="mint-plate-editor__selection" role="toolbar" aria-label="Selected wells">
675
644
  <span class="mint-plate-editor__selection-count">
676
645
  <span class="mint-plate-editor__mono">{{ selection.length }}</span> selected
677
646
  </span>
678
647
  <span class="mint-plate-editor__divider" aria-hidden="true" />
679
648
  <span class="mint-plate-editor__label">Group</span>
680
649
  <button
681
- v-for="(group, index) in groups"
650
+ v-for="(group, index) in config.groups"
682
651
  :key="group.id"
683
652
  type="button"
684
653
  class="mint-plate-editor__group"
@@ -719,7 +688,7 @@ const hint = computed(() => {
719
688
  :rack-id="activeRack.id"
720
689
  :well-id="railWellId"
721
690
  :well-data="activeRack.wells[railWellId]"
722
- :edit-fields="wellFields || []"
691
+ :edit-fields="config.wellFields || []"
723
692
  :default-injection-volume="activeRack.injectionVolume"
724
693
  :position="railPosition()"
725
694
  :save="(data: WellEditData) => handleWellEdit(railWellId!, data)"
@@ -731,7 +700,7 @@ const hint = computed(() => {
731
700
  inline
732
701
  :well-id="railWellId"
733
702
  :well-data="activeRack.wells[railWellId]"
734
- :edit-fields="wellFields || undefined"
703
+ :edit-fields="config.wellFields || undefined"
735
704
  :default-injection-volume="activeRack.injectionVolume"
736
705
  :marker-colors="sampleColors"
737
706
  :group-label="railGroupLabel"
@@ -743,11 +712,11 @@ const hint = computed(() => {
743
712
  </slot>
744
713
  </template>
745
714
  <template v-else>
746
- <span class="mint-plate-editor__rail-title">{{ groups ? 'Groups' : 'Sample types' }}</span>
715
+ <span class="mint-plate-editor__rail-title">{{ config.groups ? 'Groups' : 'Sample types' }}</span>
747
716
  <ul class="mint-plate-editor__rail-list">
748
717
  <li v-for="item in railItems" :key="item.type" class="mint-plate-editor__rail-row">
749
718
  <span
750
- :class="['mint-plate-editor__rail-swatch', { 'mint-plate-editor__rail-swatch--marker': !groups }]"
719
+ :class="['mint-plate-editor__rail-swatch', { 'mint-plate-editor__rail-swatch--marker': !config.groups }]"
751
720
  :style="item.swatch"
752
721
  aria-hidden="true"
753
722
  >{{ item.glyph }}</span>
@@ -756,7 +725,7 @@ const hint = computed(() => {
756
725
  </li>
757
726
  </ul>
758
727
  <button
759
- v-if="groups && !readonly"
728
+ v-if="config.groups && !readonly"
760
729
  type="button"
761
730
  class="mint-plate-editor__rail-add"
762
731
  data-action="group-add"
@@ -770,25 +739,25 @@ const hint = computed(() => {
770
739
  </div>
771
740
 
772
741
  <ConfirmDialog
773
- v-if="clear === 'confirm'"
774
- v-model="confirmOpen"
775
- :title="clearConfirm?.title ?? 'Clear plate'"
776
- :message="clearConfirm?.message ?? `Clear all ${activeRack ? filledCount(activeRack) : 0} wells on ${activeRack?.name ?? 'this plate'}?`"
777
- :confirm-label="clearConfirm?.confirmLabel ?? 'Clear'"
778
- :variant="clearConfirm?.variant"
742
+ v-if="config.clear === 'confirm'"
743
+ v-model:open="confirmOpen"
744
+ :title="config.clearConfirm?.title ?? 'Clear plate'"
745
+ :message="config.clearConfirm?.message ?? `Clear all ${activeRack ? filledCount(activeRack) : 0} wells on ${activeRack?.name ?? 'this plate'}?`"
746
+ :confirm-label="config.clearConfirm?.confirmLabel ?? 'Clear'"
747
+ :tone="config.clearConfirm?.tone"
779
748
  @confirm="confirmClear"
780
749
  />
781
750
 
782
751
  <ConfirmDialog
783
752
  v-if="importPaste"
784
- v-model="pasteOpen"
753
+ v-model:open="pasteOpen"
785
754
  title="Paste wells"
786
755
  message="Paste the rows to import, e.g. copied from a spreadsheet."
787
756
  confirm-label="Import"
788
- variant="info"
757
+ tone="info"
789
758
  @confirm="confirmPaste"
790
759
  >
791
- <BaseTextarea v-model="pasteText" :rows="8" aria-label="Pasted rows" />
760
+ <BaseInput type="textarea" v-model="pasteText" :rows="8" aria-label="Pasted rows" />
792
761
  </ConfirmDialog>
793
762
 
794
763
  <div role="status" aria-live="polite" :style="reorder.announcerStyle">{{ reorder.announcement.value }}</div>
@@ -83,7 +83,7 @@ const layout: Partial<Plotly.Layout> = {
83
83
  title="Metabolite response"
84
84
  :data="[]"
85
85
  empty
86
- empty-message="No measurements are available."
86
+ empty-text="No measurements are available."
87
87
  />
88
88
  </div>
89
89
  </Variant>
@@ -20,7 +20,7 @@ import { computed, nextTick, onBeforeUnmount, onMounted, ref, toRaw, watch } fro
20
20
 
21
21
  import type { ChartLegendItem } from '../types'
22
22
  import { SAMPLE_GROUP_TOKENS } from '../utils/color'
23
- import { mintPlotlyTemplate } from '../utils/plotlyTemplate'
23
+ import { mintPlotlyTemplate, resolveCssColor } from '../utils/plotlyTemplate'
24
24
  import ChartContainer from './ChartContainer.vue'
25
25
 
26
26
  interface Props {
@@ -31,7 +31,7 @@ interface Props {
31
31
  description?: string
32
32
  loading?: boolean
33
33
  empty?: boolean
34
- emptyMessage?: string
34
+ emptyText?: string
35
35
  ariaLabel?: string
36
36
  /** Use a custom Plotly build instead of the SDK's lazy-loaded default bundle. */
37
37
  plotly?: typeof PlotlyType
@@ -56,7 +56,7 @@ const props = withDefaults(defineProps<Props>(), {
56
56
  config: () => ({}),
57
57
  loading: false,
58
58
  empty: false,
59
- emptyMessage: 'No data available',
59
+ emptyText: 'No data available',
60
60
  ariaLabel: 'Interactive Plotly chart',
61
61
  active: true,
62
62
  clickEvents: false,
@@ -184,6 +184,8 @@ function themedLayout(): Partial<PlotlyType.Layout> {
184
184
  ...template,
185
185
  ...(legendTraces.value.length ? { showlegend: false } : {}),
186
186
  ...layout,
187
+ // Plotly cannot read `var(--…)`; resolve a caller colorway's tokens on every render.
188
+ ...(layout.colorway ? { colorway: layout.colorway.map(color => (typeof color === 'string' ? resolveCssColor(color, chartElement.value ?? undefined) : color)) } : {}),
187
189
  font: { ...template.font, ...layout.font },
188
190
  xaxis: { ...template.xaxis, ...layout.xaxis },
189
191
  yaxis: { ...template.yaxis, ...layout.yaxis },
@@ -298,7 +300,7 @@ onBeforeUnmount(() => {
298
300
  :description="description"
299
301
  :loading="loading"
300
302
  :empty="empty"
301
- :empty-message="emptyMessage"
303
+ :empty-text="emptyText"
302
304
  :variant="variant"
303
305
  :legend-items="legendItems"
304
306
  @legend-toggle="toggleTrace"
@@ -1,6 +1,7 @@
1
1
  <script setup lang="ts">
2
2
  import { reactive } from 'vue'
3
3
  import PluginIcon from './PluginIcon.vue'
4
+ import type { Tone } from '../types'
4
5
 
5
6
  const SAMPLE_PATH = 'M13 10V3L4 14h7v7l9-11h-7z'
6
7
  const SAMPLE_STRUCTURED = JSON.stringify({
@@ -33,7 +34,8 @@ function initState() {
33
34
  icon: SAMPLE_PATH,
34
35
  size: 'md' as 'sm' | 'md' | 'topbar' | 'lg',
35
36
  variant: 'solid' as 'solid' | 'tinted',
36
- tone: '',
37
+ tone: '' as '' | Tone,
38
+ color: '',
37
39
  })
38
40
  }
39
41
  </script>
@@ -43,14 +45,15 @@ function initState() {
43
45
  <Variant title="Playground" :init-state="initState">
44
46
  <template #default="{ state }">
45
47
  <div style="padding: 2rem; max-width: 600px;">
46
- <PluginIcon :icon="state.icon" :size="state.size" :variant="state.variant" :tone="state.tone || undefined" />
48
+ <PluginIcon :icon="state.icon" :size="state.size" :variant="state.variant" :tone="state.tone || undefined" :color="state.color || undefined" />
47
49
  </div>
48
50
  </template>
49
51
  <template #controls="{ state }">
50
52
  <HstText v-model="state.icon" title="icon" />
51
53
  <HstSelect v-model="state.size" title="size" :options="['sm', 'md', 'topbar', 'lg']" />
52
54
  <HstSelect v-model="state.variant" title="variant" :options="['solid', 'tinted']" />
53
- <HstText v-model="state.tone" title="tone (hex)" />
55
+ <HstSelect v-model="state.tone" title="tone" :options="['', 'neutral', 'primary', 'cta', 'success', 'warning', 'error', 'info']" />
56
+ <HstText v-model="state.color" title="color (CSS color)" />
54
57
  </template>
55
58
  </Variant>
56
59
 
@@ -94,9 +97,9 @@ function initState() {
94
97
 
95
98
  <Variant title="Tone overrides">
96
99
  <div style="padding: 2rem; display: flex; gap: 1rem; align-items: center;">
97
- <PluginIcon :icon="SAMPLE_PATH" size="lg" variant="solid" tone="#0EA5E9" />
98
- <PluginIcon :icon="SAMPLE_PATH" size="lg" variant="solid" tone="#F97316" />
99
- <PluginIcon :icon="SAMPLE_PATH" size="lg" variant="solid" tone="#22C55E" />
100
+ <PluginIcon :icon="SAMPLE_PATH" size="lg" variant="solid" color="#0EA5E9" />
101
+ <PluginIcon :icon="SAMPLE_PATH" size="lg" variant="solid" color="#F97316" />
102
+ <PluginIcon :icon="SAMPLE_PATH" size="lg" variant="solid" color="#22C55E" />
100
103
  </div>
101
104
  </Variant>
102
105
  </Story>
@@ -9,6 +9,7 @@
9
9
  * http://, protocol-relative, and data:image/svg+xml URLs are deliberately rejected
10
10
  * (mixed-content + XSS, see spec 2026-05-04-plugin-icon-component-design.md). */
11
11
  import { computed } from 'vue'
12
+ import type { Tone } from '../types'
12
13
  import { detectPluginIcon, type DetectedPluginIcon, type StructuredPluginIcon } from '../utils/pluginIcon'
13
14
 
14
15
  defineOptions({ name: 'PluginIcon' })
@@ -17,7 +18,10 @@ interface Props {
17
18
  icon?: string
18
19
  size?: 'sm' | 'md' | 'topbar' | 'lg'
19
20
  variant?: 'solid' | 'tinted'
20
- tone?: string
21
+ /** Semantic color; without it the chip uses the primary color. */
22
+ tone?: Tone
23
+ /** Custom chip color (any CSS color, such as a plugin's manifest color); replaces the tone. */
24
+ color?: string
21
25
  }
22
26
 
23
27
  const props = withDefaults(defineProps<Props>(), {
@@ -76,10 +80,11 @@ const rootClasses = computed(() => [
76
80
  'mint-plugin-icon',
77
81
  `mint-plugin-icon--${props.size}`,
78
82
  `mint-plugin-icon--${props.variant}`,
83
+ props.tone ? `mint-plugin-icon--${props.tone}` : '',
79
84
  ])
80
85
 
81
86
  const rootStyle = computed(() =>
82
- props.tone ? { '--mint-plugin-icon-tone': props.tone } : undefined,
87
+ props.color ? { '--mint-plugin-icon-tone': props.color } : undefined,
83
88
  )
84
89
  </script>
85
90