@morscherlab/mint-sdk 1.3.11 → 1.4.0-beta.10

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 (1056) hide show
  1. package/README.md +152 -177
  2. package/dist/AlertBox-B2Bgr3ei.js +276 -0
  3. package/dist/AlertBox-B2Bgr3ei.js.map +1 -0
  4. package/dist/AppSidebar-mvm--GxN.js +3565 -0
  5. package/dist/AppSidebar-mvm--GxN.js.map +1 -0
  6. package/dist/ConfirmDialog-nbJj51is.js +102 -0
  7. package/dist/ConfirmDialog-nbJj51is.js.map +1 -0
  8. package/dist/ExperimentPopover-5T1fAq2L.js +337 -0
  9. package/dist/ExperimentPopover-5T1fAq2L.js.map +1 -0
  10. package/dist/ExperimentSelectorModal-65peG4Up.js +544 -0
  11. package/dist/ExperimentSelectorModal-65peG4Up.js.map +1 -0
  12. package/dist/SegmentedControl-BtnnjWzs.js +129 -0
  13. package/dist/SegmentedControl-BtnnjWzs.js.map +1 -0
  14. package/dist/SettingsModal-DO3IZ7qz.js +666 -0
  15. package/dist/SettingsModal-DO3IZ7qz.js.map +1 -0
  16. package/dist/analysisArtifactTypes-Cy3D0Ipg.js.map +1 -1
  17. package/dist/auth-SliLnFre.js +65 -0
  18. package/dist/auth-SliLnFre.js.map +1 -0
  19. package/dist/components/ActionMenu.vue.d.ts +1 -1
  20. package/dist/components/AdductText.vue.d.ts +1 -1
  21. package/dist/components/AlertBox.vue.d.ts +3 -3
  22. package/dist/components/AppContainer.vue.d.ts +1 -1
  23. package/dist/components/AppSidebar.vue.d.ts +15 -95
  24. package/dist/components/AppTopBar.vue.d.ts +16 -70
  25. package/dist/components/ArtifactSaveDialog.vue.d.ts +13 -5
  26. package/dist/components/ArtifactSelectorModal.vue.d.ts +4 -4
  27. package/dist/components/AuditTrail.vue.d.ts +2 -2
  28. package/dist/components/BaseButton.vue.d.ts +11 -4
  29. package/dist/components/BaseCheckbox.vue.d.ts +9 -3
  30. package/dist/components/BaseInput.vue.d.ts +13 -9
  31. package/dist/components/BaseModal.vue.d.ts +4 -4
  32. package/dist/components/BasePill.vue.d.ts +15 -8
  33. package/dist/components/BaseRadioGroup.vue.d.ts +2 -2
  34. package/dist/components/BaseSelect.vue.d.ts +51 -19
  35. package/dist/components/BaseTabs.vue.d.ts +6 -5
  36. package/dist/components/BatchProgressList.vue.d.ts +2 -2
  37. package/dist/components/ChartContainer.vue.d.ts +4 -2
  38. package/dist/components/ChemicalFormula.vue.d.ts +2 -2
  39. package/dist/components/CollapsibleCard.vue.d.ts +3 -3
  40. package/dist/components/ComponentBindingRenderer.vue.d.ts +2 -3
  41. package/dist/components/ConcentrationInput.vue.d.ts +2 -2
  42. package/dist/components/ConfirmDialog.vue.d.ts +8 -7
  43. package/dist/components/DataFrame.vue.d.ts +32 -74
  44. package/dist/components/DatePicker.vue.d.ts +24 -2
  45. package/dist/components/DoseCalculator.vue.d.ts +1 -1
  46. package/dist/components/DoseCalculatorVolumeField.vue.d.ts +1 -1
  47. package/dist/components/EmptyState.vue.d.ts +3 -2
  48. package/dist/components/ExperimentPopover.vue.d.ts +18 -0
  49. package/dist/components/ExperimentSelectorModal.vue.d.ts +3 -7
  50. package/dist/components/FilePicker.vue.d.ts +1 -1
  51. package/dist/components/FileUploader.vue.d.ts +2 -2
  52. package/dist/components/FormBuilder.vue.d.ts +17 -74
  53. package/dist/components/FormulaInput.vue.d.ts +2 -2
  54. package/dist/components/GeneratedPluginView.vue.d.ts +1 -1
  55. package/dist/components/GeneratedResultRenderer.vue.d.ts +5 -1
  56. package/dist/components/{StatusIndicator.vue.d.ts → InstrumentStatusPanels.vue.d.ts} +8 -9
  57. package/dist/components/JobsStatusTray.vue.d.ts +2 -9
  58. package/dist/components/LoadingSpinner.vue.d.ts +3 -3
  59. package/dist/components/MoleculeInput.vue.d.ts +2 -2
  60. package/dist/components/NumberInput.vue.d.ts +19 -5
  61. package/dist/components/PlateEditor.vue.d.ts +11 -61
  62. package/dist/components/PlotlyChart.vue.d.ts +2 -2
  63. package/dist/components/PluginIcon.vue.d.ts +5 -1
  64. package/dist/components/PluginWorkspaceView.controls.d.ts +2 -9
  65. package/dist/components/PluginWorkspaceView.navigation.d.ts +1 -7
  66. package/dist/components/PluginWorkspaceView.props.d.ts +18 -137
  67. package/dist/components/PluginWorkspaceView.shell.d.ts +2 -10
  68. package/dist/components/PluginWorkspaceView.vue.d.ts +14 -84
  69. package/dist/components/PresenceAvatars.vue.d.ts +31 -0
  70. package/dist/components/ProgressBar.vue.d.ts +3 -2
  71. package/dist/components/ProtocolStep.presentation.d.ts +0 -1
  72. package/dist/components/SampleHierarchyTree.vue.d.ts +3 -3
  73. package/dist/components/SampleSelector.vue.d.ts +8 -8
  74. package/dist/components/ScheduleCalendar.vue.d.ts +1 -1
  75. package/dist/components/ScientificNumber.vue.d.ts +1 -1
  76. package/dist/components/SecretInput.vue.d.ts +2 -2
  77. package/dist/components/SegmentedControl.vue.d.ts +2 -2
  78. package/dist/components/SequenceInput.vue.d.ts +2 -2
  79. package/dist/components/SequenceProgressBar.vue.d.ts +3 -0
  80. package/dist/components/SettingsModal.vue.d.ts +12 -20
  81. package/dist/components/SmartGroup.types.d.ts +0 -1
  82. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +1 -1
  83. package/dist/components/StaleFormBanner.vue.d.ts +20 -0
  84. package/dist/components/StepWizard.vue.d.ts +3 -0
  85. package/dist/components/TagsInput.vue.d.ts +4 -3
  86. package/dist/components/TimeRangeInput.vue.d.ts +2 -2
  87. package/dist/components/VersionConflictDialog.vue.d.ts +24 -0
  88. package/dist/components/WellPlate.geometry.d.ts +0 -6
  89. package/dist/components/WellPlate.rendering.d.ts +0 -2
  90. package/dist/components/WellPlate.vue.d.ts +7 -52
  91. package/dist/components/index.d.ts +0 -90
  92. package/dist/components/{AutoGroupModal.adapter.d.ts → internal/AutoGroupModalInternal.adapter.d.ts} +6 -6
  93. package/dist/components/{AutoGroupModal.vue.d.ts → internal/AutoGroupModalInternal.vue.d.ts} +6 -6
  94. package/dist/components/{BaseToggle.vue.d.ts → internal/CheckboxSwitchInternal.vue.d.ts} +2 -2
  95. package/dist/components/{MultiSelect.vue.d.ts → internal/DatePickerDateInternal.vue.d.ts} +11 -9
  96. package/dist/components/{DateTimePicker.vue.d.ts → internal/DatePickerDateTimeInternal.vue.d.ts} +2 -2
  97. package/dist/components/{TimePicker.vue.d.ts → internal/DatePickerTimeInternal.vue.d.ts} +4 -4
  98. package/dist/components/internal/FilePickerListInternal.vue.d.ts +2 -2
  99. package/dist/components/internal/FormSchemaInternal.vue.d.ts +95 -0
  100. package/dist/components/{UnitInput.vue.d.ts → internal/NumberUnitInputInternal.vue.d.ts} +6 -14
  101. package/dist/components/internal/PlateEditorBindingInternal.vue.d.ts +3 -2
  102. package/dist/components/internal/ResourcePickerListInternal.vue.d.ts +5 -10
  103. package/dist/components/internal/SelectMultipleInternal.vue.d.ts +27 -0
  104. package/dist/components/{SearchableSelect.vue.d.ts → internal/SelectSearchableInternal.vue.d.ts} +5 -2
  105. package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +1 -15
  106. package/dist/components/internal/WorkspaceSidebarInternal.vue.d.ts +4 -4
  107. package/dist/{composables → components/internal}/autoGroup/classKey.d.ts +1 -1
  108. package/dist/{composables → components/internal}/autoGroup/classify.d.ts +1 -1
  109. package/dist/{composables → components/internal}/autoGroup/columns.d.ts +1 -1
  110. package/dist/{composables → components/internal}/autoGroup/compose.d.ts +1 -1
  111. package/dist/{composables → components/internal}/autoGroup/cooccurrence.d.ts +1 -1
  112. package/dist/{composables → components/internal}/autoGroup/csv-shim.d.ts +1 -1
  113. package/dist/{composables → components/internal}/autoGroup/fingerprint.d.ts +1 -1
  114. package/dist/{composables → components/internal}/autoGroup/template.d.ts +1 -1
  115. package/dist/{composables → components/internal}/autoGroup/tokenLength.d.ts +1 -1
  116. package/dist/components/internal/generatedJobsApi.d.ts +1 -1
  117. package/dist/{composables → components/internal}/useAutoGroup.d.ts +9 -18
  118. package/dist/composables/componentSpecs.d.ts +41 -0
  119. package/dist/composables/controlComponentBindings.d.ts +6 -0
  120. package/dist/composables/controlSchemaAdapters.d.ts +28 -2
  121. package/dist/composables/controlSchemaDoseDesign.d.ts +1 -1
  122. package/dist/composables/controlSchemaModel.d.ts +1 -1
  123. package/dist/composables/controlSchemaTypes.d.ts +35 -23
  124. package/dist/composables/{usePluginClient.d.ts → createClient.d.ts} +22 -49
  125. package/dist/composables/{useEventStream.d.ts → eventStream.d.ts} +2 -2
  126. package/dist/composables/experiment-utils.d.ts +1 -6
  127. package/dist/composables/index.d.ts +7 -59
  128. package/dist/composables/platformContextHelpers.d.ts +0 -11
  129. package/dist/composables/pluginEndpointBuilder.d.ts +2 -2
  130. package/dist/composables/pluginIdentity.d.ts +24 -0
  131. package/dist/composables/pluginWorkspaceModel.d.ts +16 -99
  132. package/dist/composables/useApi.d.ts +1 -3
  133. package/dist/composables/useAppExperiment.d.ts +9 -1
  134. package/dist/composables/{useAnalysisArtifacts.d.ts → useArtifacts.d.ts} +6 -6
  135. package/dist/composables/useCalendarGrid.d.ts +1 -1
  136. package/dist/composables/useExperiment.d.ts +30 -0
  137. package/dist/composables/useExperimentSelector.d.ts +6 -2
  138. package/dist/composables/useFilePicker.d.ts +2 -2
  139. package/dist/composables/useJobCenter.d.ts +63 -0
  140. package/dist/composables/{useGeneratedAnalysis.d.ts → useJobsEndpoint.d.ts} +22 -23
  141. package/dist/composables/useMenuKeyboard.d.ts +1 -1
  142. package/dist/composables/usePlatform.d.ts +64 -0
  143. package/dist/composables/usePluginWorkspace.d.ts +6 -11
  144. package/dist/composables/usePresence.d.ts +41 -0
  145. package/dist/composables/useRackEditor.d.ts +2 -2
  146. package/dist/composables/useRealtime.d.ts +71 -0
  147. package/dist/composables/{useRequestSyncState.d.ts → useRequest.d.ts} +12 -17
  148. package/dist/composables/useToast.d.ts +7 -5
  149. package/dist/composables/useVersionedSave.d.ts +76 -0
  150. package/dist/controlSchemaModel-B8CTXagP.js +95 -0
  151. package/dist/controlSchemaModel-B8CTXagP.js.map +1 -0
  152. package/dist/data-CgILxDLW.js +3865 -0
  153. package/dist/data-CgILxDLW.js.map +1 -0
  154. package/dist/data.d.ts +32 -0
  155. package/dist/data.js +10 -0
  156. package/dist/deprecatedRootExports.d.ts +191 -0
  157. package/dist/experiment-43OJtH7R.js +673 -0
  158. package/dist/experiment-43OJtH7R.js.map +1 -0
  159. package/dist/experimentStatus-Cqp6qNrR.js +60 -0
  160. package/dist/experimentStatus-Cqp6qNrR.js.map +1 -0
  161. package/dist/host.d.ts +10 -0
  162. package/dist/host.js +26 -0
  163. package/dist/host.js.map +1 -0
  164. package/dist/index.d.ts +1 -12
  165. package/dist/index.js +65 -277
  166. package/dist/index.js.map +1 -1
  167. package/dist/install-CsPFJSx3.js +669 -0
  168. package/dist/install-CsPFJSx3.js.map +1 -0
  169. package/dist/install.d.ts +2 -1
  170. package/dist/install.js +1 -21
  171. package/dist/instrument.d.ts +0 -6
  172. package/dist/lab-MHzp-_J8.js +7494 -0
  173. package/dist/lab-MHzp-_J8.js.map +1 -0
  174. package/dist/lab.d.ts +42 -0
  175. package/dist/lab.js +5 -0
  176. package/dist/permissions.d.ts +0 -4
  177. package/dist/permissions.js +1 -20
  178. package/dist/permissions.js.map +1 -1
  179. package/dist/records-B6gpM_3e.js +3268 -0
  180. package/dist/records-B6gpM_3e.js.map +1 -0
  181. package/dist/runtime-8bs8EogX.js +1491 -0
  182. package/dist/runtime-8bs8EogX.js.map +1 -0
  183. package/dist/runtime.d.ts +25 -0
  184. package/dist/runtime.js +8 -0
  185. package/dist/shell-CywENwBT.js +197 -0
  186. package/dist/shell-CywENwBT.js.map +1 -0
  187. package/dist/shell.d.ts +16 -0
  188. package/dist/shell.js +8 -0
  189. package/dist/stores/auth.d.ts +13 -35
  190. package/dist/stores/experiment.d.ts +4 -0
  191. package/dist/stores/index.js +2 -2
  192. package/dist/styles.css +12161 -15036
  193. package/dist/types/analysisArtifactTypes.d.ts +1 -1
  194. package/dist/types/auth.d.ts +0 -8
  195. package/dist/types/componentLabTypes.d.ts +98 -34
  196. package/dist/types/componentWorkflowTypes.d.ts +2 -27
  197. package/dist/types/components.d.ts +145 -74
  198. package/dist/types/form-builder.d.ts +4 -0
  199. package/dist/types/generated/platformContext.d.ts +53 -0
  200. package/dist/types/generated-ui.d.ts +6 -2
  201. package/dist/types/index.d.ts +4 -5
  202. package/dist/types/instrument.d.ts +41 -0
  203. package/dist/types/platform.d.ts +20 -58
  204. package/dist/useDebouncedWatch-BPwyl6eS.js +73 -0
  205. package/dist/useDebouncedWatch-BPwyl6eS.js.map +1 -0
  206. package/dist/{experiment-utils-DTANyVKV.js → useDropdownState-8yWMu-7_.js} +127 -144
  207. package/dist/useDropdownState-8yWMu-7_.js.map +1 -0
  208. package/dist/useExpansionSet-CvoNMZJi.js +68 -0
  209. package/dist/useExpansionSet-CvoNMZJi.js.map +1 -0
  210. package/dist/useExperimentSamples-DHnxKFAF.js +366 -0
  211. package/dist/useExperimentSamples-DHnxKFAF.js.map +1 -0
  212. package/dist/useListReorder-BitdUhxn.js +5294 -0
  213. package/dist/useListReorder-BitdUhxn.js.map +1 -0
  214. package/dist/useRackEditor-DiwCt77M.js +5930 -0
  215. package/dist/useRackEditor-DiwCt77M.js.map +1 -0
  216. package/dist/useRealtime-C3iy9QkU.js +699 -0
  217. package/dist/useRealtime-C3iy9QkU.js.map +1 -0
  218. package/dist/useRequest-D506eHi8.js +244 -0
  219. package/dist/useRequest-D506eHi8.js.map +1 -0
  220. package/dist/utils/color.d.ts +0 -5
  221. package/dist/{composables/useDoseCalculator.d.ts → utils/dose.d.ts} +10 -13
  222. package/dist/utils/experimentStatus.d.ts +9 -0
  223. package/dist/{composables/useChemicalFormula.d.ts → utils/formula.d.ts} +3 -6
  224. package/dist/utils/integrationHost.d.ts +18 -0
  225. package/dist/utils/plotlyTemplate.d.ts +2 -0
  226. package/dist/utils/pluginSecrets.d.ts +12 -12
  227. package/dist/utils/presenceAvatars.d.ts +30 -0
  228. package/dist/utils/records.d.ts +0 -2
  229. package/dist/{composables/useTimeUtils.d.ts → utils/time.d.ts} +7 -18
  230. package/package.json +20 -17
  231. package/src/__tests__/components/ActionMenu.test.ts +0 -13
  232. package/src/__tests__/components/AlertBox.test.ts +1 -1
  233. package/src/__tests__/components/AppSidebar.test.ts +119 -167
  234. package/src/__tests__/components/AppToastContainer.test.ts +2 -2
  235. package/src/__tests__/components/AppTopBar.test.ts +230 -176
  236. package/src/__tests__/components/AppTopBarPillNav.test.ts +35 -0
  237. package/src/__tests__/components/ArtifactSaveDialog.test.ts +83 -3
  238. package/src/__tests__/components/ArtifactSelectorModal.test.ts +6 -4
  239. package/src/__tests__/components/AuditTrail.test.ts +1 -1
  240. package/src/__tests__/components/AutoGroupModal.adapter.test.ts +1 -1
  241. package/src/__tests__/components/AutoGroupModal.anatomy.test.ts +2 -2
  242. package/src/__tests__/components/AutoGroupModal.wiring.test.ts +2 -2
  243. package/src/__tests__/components/BaseButton.test.ts +51 -0
  244. package/src/__tests__/components/{BaseToggle.test.ts → BaseCheckbox.switch.test.ts} +8 -6
  245. package/src/__tests__/components/BaseInput.test.ts +13 -34
  246. package/src/__tests__/components/BaseModal.test.ts +6 -6
  247. package/src/__tests__/components/BasePill.test.ts +33 -39
  248. package/src/__tests__/components/BaseSelect.multiple.test.ts +118 -0
  249. package/src/__tests__/components/{SearchableSelect.test.ts → BaseSelect.searchable.test.ts} +19 -9
  250. package/src/__tests__/components/BaseSelect.test.ts +11 -0
  251. package/src/__tests__/components/BaseTabs.test.ts +13 -13
  252. package/src/__tests__/components/BatchProgressList.test.ts +16 -0
  253. package/src/__tests__/components/CalendarGridPanel.test.ts +2 -2
  254. package/src/__tests__/components/ChartContainer.test.ts +11 -0
  255. package/src/__tests__/components/ChemicalFormula.test.ts +6 -3
  256. package/src/__tests__/components/CollapsibleCard.test.ts +1 -1
  257. package/src/__tests__/components/ComponentBindingRenderer.test.ts +25 -73
  258. package/src/__tests__/components/ConcentrationInput.test.ts +3 -3
  259. package/src/__tests__/components/ConfirmDialog.test.ts +23 -0
  260. package/src/__tests__/components/DataFrame.test.ts +140 -142
  261. package/src/__tests__/components/DataStates.test.ts +6 -22
  262. package/src/__tests__/components/{DateTimePicker.test.ts → DatePicker.datetime.test.ts} +15 -7
  263. package/src/__tests__/components/DatePicker.test.ts +21 -0
  264. package/src/__tests__/components/{TimePicker.test.ts → DatePicker.time.test.ts} +20 -19
  265. package/src/__tests__/components/DoseCalculator.test.ts +12 -7
  266. package/src/__tests__/components/DoseCalculatorVolumeField.test.ts +6 -6
  267. package/src/__tests__/components/EmptyState.test.ts +1 -1
  268. package/src/__tests__/components/ExperimentPopover.test.ts +125 -16
  269. package/src/__tests__/components/ExperimentSelectorModal.test.ts +134 -28
  270. package/src/__tests__/components/FormBuilder.test.ts +49 -167
  271. package/src/__tests__/components/FormSchemaInternal.test.ts +91 -0
  272. package/src/__tests__/components/GeneratedPathInput.test.ts +18 -13
  273. package/src/__tests__/components/GeneratedPluginView.test.ts +60 -25
  274. package/src/__tests__/components/GeneratedResultRenderer.test.ts +6 -4
  275. package/src/__tests__/components/InstrumentStateBadge.test.ts +4 -4
  276. package/src/__tests__/components/InstrumentStatusPanels.test.ts +79 -0
  277. package/src/__tests__/components/JobsStatusTray.test.ts +4 -4
  278. package/src/__tests__/components/NumberInput.test.ts +28 -0
  279. package/src/__tests__/components/{UnitInput.test.ts → NumberInput.units.test.ts} +6 -6
  280. package/src/__tests__/components/PlateEditor.test.ts +108 -108
  281. package/src/__tests__/components/PlateEditorBindingInternal.test.ts +13 -13
  282. package/src/__tests__/components/PlotlyChart.test.ts +1 -1
  283. package/src/__tests__/components/PluginIcon.test.ts +9 -4
  284. package/src/__tests__/components/PluginWorkspaceView.controls.test.ts +16 -29
  285. package/src/__tests__/components/PluginWorkspaceView.internal.test.ts +28 -34
  286. package/src/__tests__/components/PluginWorkspaceView.navigation.test.ts +4 -19
  287. package/src/__tests__/components/PluginWorkspaceView.shell.test.ts +1 -6
  288. package/src/__tests__/components/PluginWorkspaceView.test.ts +183 -155
  289. package/src/__tests__/components/PresenceAvatars.test.ts +90 -0
  290. package/src/__tests__/components/ProtocolStep.presentation.test.ts +1 -3
  291. package/src/__tests__/components/ProtocolStepEditor.test.ts +10 -11
  292. package/src/__tests__/components/ProtocolStepParameterField.test.ts +8 -7
  293. package/src/__tests__/components/ResourcePickerListInternal.test.ts +2 -22
  294. package/src/__tests__/components/RetiredStyles.test.ts +0 -18
  295. package/src/__tests__/components/SampleSelector.test.ts +30 -25
  296. package/src/__tests__/components/SecretInput.test.ts +14 -19
  297. package/src/__tests__/components/SequenceProgressBar.test.ts +12 -0
  298. package/src/__tests__/components/SettingsModal.test.ts +76 -84
  299. package/src/__tests__/components/StaleFormBanner.test.ts +48 -0
  300. package/src/__tests__/components/StepWizard.test.ts +11 -0
  301. package/src/__tests__/components/ThemeToggle.test.ts +1 -1
  302. package/src/__tests__/components/WellPlate.decoration.test.ts +20 -11
  303. package/src/__tests__/components/WellPlate.interaction.test.ts +6 -7
  304. package/src/__tests__/components/WellPlate.keyboard.test.ts +2 -2
  305. package/src/__tests__/components/deprecationTags.test.ts +90 -0
  306. package/src/__tests__/composables/analysisArtifactTarget.test.ts +1 -12
  307. package/src/__tests__/composables/autoGroup/classKey.test.ts +1 -1
  308. package/src/__tests__/composables/autoGroup/classify.test.ts +1 -1
  309. package/src/__tests__/composables/autoGroup/columns.test.ts +1 -1
  310. package/src/__tests__/composables/autoGroup/compose.test.ts +1 -1
  311. package/src/__tests__/composables/autoGroup/cooccurrence.test.ts +1 -1
  312. package/src/__tests__/composables/autoGroup/fieldEdits.test.ts +1 -1
  313. package/src/__tests__/composables/autoGroup/fingerprint.test.ts +1 -1
  314. package/src/__tests__/composables/autoGroup/golden.test.ts +1 -1
  315. package/src/__tests__/composables/autoGroup/groupByOrder.test.ts +1 -1
  316. package/src/__tests__/composables/autoGroup/groupTree.test.ts +1 -1
  317. package/src/__tests__/composables/autoGroup/integration.test.ts +1 -1
  318. package/src/__tests__/composables/autoGroup/template.test.ts +1 -1
  319. package/src/__tests__/composables/autoGroup/tokenLength.test.ts +1 -1
  320. package/src/__tests__/composables/autoGroup/tokenize.test.ts +1 -1
  321. package/src/__tests__/composables/{usePluginClient.test.ts → createClient.test.ts} +84 -222
  322. package/src/__tests__/composables/{useEventStream.test.ts → eventStream.test.ts} +6 -6
  323. package/src/__tests__/composables/experiment-utils.test.ts +13 -14
  324. package/src/__tests__/composables/useApi.test.ts +32 -21
  325. package/src/__tests__/composables/useAppExperiment.test.ts +46 -3
  326. package/src/__tests__/composables/{useAnalysisArtifacts.test.ts → useArtifacts.test.ts} +19 -27
  327. package/src/__tests__/composables/useAutoGroup.test.ts +3 -13
  328. package/src/__tests__/composables/useCalendarGrid.test.ts +4 -2
  329. package/src/__tests__/composables/useControlSchema.test.ts +41 -99
  330. package/src/__tests__/composables/useExperiment.test.ts +63 -0
  331. package/src/__tests__/composables/useExperimentSelector.test.ts +111 -0
  332. package/src/__tests__/composables/useFileBrowser.test.ts +4 -6
  333. package/src/__tests__/composables/{useJobsStatusTray.test.ts → useJobCenter.test.ts} +31 -31
  334. package/src/__tests__/composables/{useGeneratedAnalysis.test.ts → useJobsEndpoint.test.ts} +213 -139
  335. package/src/__tests__/composables/usePlatform.test.ts +102 -0
  336. package/src/__tests__/composables/usePresence.test.ts +164 -0
  337. package/src/__tests__/composables/useRackEditor.test.ts +2 -2
  338. package/src/__tests__/composables/useRealtime.test.ts +196 -0
  339. package/src/__tests__/composables/{useRequestSyncState.test.ts → useRequest.test.ts} +32 -47
  340. package/src/__tests__/composables/useVersionedSave.test.ts +194 -0
  341. package/src/__tests__/docs/extractDocsComponents.test.ts +36 -0
  342. package/src/__tests__/docs/extractDocsParsing.test.ts +2 -2
  343. package/src/__tests__/docs/extractDocsTheme.test.ts +1 -46
  344. package/src/__tests__/docs/frontendDocsCatalog.test.ts +164 -84
  345. package/src/__tests__/styles/baseControlsRules.test.ts +7 -3
  346. package/src/__tests__/styles/controlRefreshRules.test.ts +0 -6
  347. package/src/__tests__/styles/cssTokens.test.ts +2 -2
  348. package/src/__tests__/styles/darkModeRules.test.ts +0 -6
  349. package/src/__tests__/styles/menusShellRefresh.test.ts +14 -10
  350. package/src/__tests__/{composables/useChemicalFormula.test.ts → utils/formula.test.ts} +3 -5
  351. package/src/__tests__/utils/permissions.test.ts +1 -36
  352. package/src/__tests__/utils/plotlyTemplate.test.ts +20 -5
  353. package/src/__tests__/{composables/useTimeUtils.test.ts → utils/time.test.ts} +18 -8
  354. package/src/components/ActionMenu.vue +7 -13
  355. package/src/components/AdductText.story.vue +7 -0
  356. package/src/components/AdductText.vue +1 -1
  357. package/src/components/AlertBox.story.vue +27 -27
  358. package/src/components/AlertBox.vue +22 -20
  359. package/src/components/AppLayout.story.vue +33 -44
  360. package/src/components/AppLayout.vue +1 -1
  361. package/src/components/AppSidebar.story.vue +40 -101
  362. package/src/components/AppSidebar.vue +66 -147
  363. package/src/components/AppToastContainer.story.vue +1 -1
  364. package/src/components/AppTopBar.story.vue +97 -111
  365. package/src/components/AppTopBar.vue +170 -290
  366. package/src/components/ArtifactSaveDialog.story.vue +32 -9
  367. package/src/components/ArtifactSaveDialog.vue +125 -38
  368. package/src/components/ArtifactSelectorModal.story.vue +4 -4
  369. package/src/components/ArtifactSelectorModal.vue +10 -10
  370. package/src/components/AuditTrail.story.vue +6 -5
  371. package/src/components/AuditTrail.vue +5 -24
  372. package/src/components/Avatar.story.vue +2 -3
  373. package/src/components/Avatar.vue +11 -16
  374. package/src/components/BaseButton.story.vue +25 -0
  375. package/src/components/BaseButton.vue +39 -10
  376. package/src/components/BaseCheckbox.story.vue +2 -2
  377. package/src/components/{BaseToggle.story.vue → BaseCheckbox.switch.story.vue} +22 -19
  378. package/src/components/BaseCheckbox.vue +39 -7
  379. package/src/components/BaseInput.story.vue +3 -15
  380. package/src/components/{BaseTextarea.story.vue → BaseInput.textarea.story.vue} +14 -10
  381. package/src/components/BaseInput.vue +53 -26
  382. package/src/components/BaseModal.story.vue +11 -11
  383. package/src/components/BaseModal.vue +8 -8
  384. package/src/components/BasePill.story.vue +48 -28
  385. package/src/components/BasePill.vue +22 -11
  386. package/src/components/BaseRadioGroup.story.vue +4 -4
  387. package/src/components/BaseRadioGroup.vue +3 -3
  388. package/src/components/{MultiSelect.story.vue → BaseSelect.multiple.story.vue} +33 -16
  389. package/src/components/{SearchableSelect.story.vue → BaseSelect.searchable.story.vue} +4 -4
  390. package/src/components/BaseSelect.story.vue +2 -2
  391. package/src/components/BaseSelect.vue +118 -22
  392. package/src/components/BaseTabs.story.vue +20 -20
  393. package/src/components/BaseTabs.vue +17 -9
  394. package/src/components/BatchProgressList.vue +38 -28
  395. package/src/components/ChartContainer.story.vue +9 -13
  396. package/src/components/ChartContainer.vue +10 -8
  397. package/src/components/ChemicalFormula.vue +1 -2
  398. package/src/components/CollapsibleCard.vue +5 -4
  399. package/src/components/ComponentBindingRenderer.story.vue +0 -29
  400. package/src/components/ComponentBindingRenderer.vue +15 -39
  401. package/src/components/ConcentrationInput.story.vue +2 -2
  402. package/src/components/ConcentrationInput.vue +9 -9
  403. package/src/components/ConfirmDialog.story.vue +22 -22
  404. package/src/components/ConfirmDialog.vue +15 -14
  405. package/src/components/DataFrame.story.vue +28 -40
  406. package/src/components/DataFrame.vue +112 -128
  407. package/src/components/{DateTimePicker.story.vue → DatePicker.datetime.story.vue} +19 -14
  408. package/src/components/DatePicker.story.vue +2 -2
  409. package/src/components/{TimePicker.story.vue → DatePicker.time.story.vue} +15 -12
  410. package/src/components/DatePicker.vue +82 -220
  411. package/src/components/DoseCalculator.vue +13 -19
  412. package/src/components/DoseCalculatorVolumeField.vue +6 -6
  413. package/src/components/EmptyState.story.vue +17 -17
  414. package/src/components/EmptyState.vue +6 -5
  415. package/src/components/ExperimentPopover.story.vue +165 -53
  416. package/src/components/ExperimentPopover.vue +172 -190
  417. package/src/components/ExperimentSelectorModal.story.vue +43 -39
  418. package/src/components/ExperimentSelectorModal.vue +134 -122
  419. package/src/components/FilePicker.vue +1 -1
  420. package/src/components/FormBuilder.story.vue +9 -4
  421. package/src/components/FormBuilder.vue +46 -253
  422. package/src/components/FormField.story.vue +9 -50
  423. package/src/components/FormulaInput.story.vue +2 -2
  424. package/src/components/FormulaInput.vue +5 -6
  425. package/src/components/GeneratedPathInput.vue +8 -9
  426. package/src/components/GeneratedPluginView.story.vue +1 -1
  427. package/src/components/GeneratedPluginView.vue +29 -22
  428. package/src/components/GeneratedResultRenderer.vue +16 -17
  429. package/src/components/InstrumentStateBadge.vue +1 -1
  430. package/src/components/InstrumentStatusPanels.story.vue +64 -0
  431. package/src/components/InstrumentStatusPanels.vue +133 -0
  432. package/src/components/JobsStatusTray.story.vue +2 -2
  433. package/src/components/JobsStatusTray.vue +5 -20
  434. package/src/components/LoadingSpinner.story.vue +11 -11
  435. package/src/components/LoadingSpinner.vue +7 -5
  436. package/src/components/MoleculeInput.story.vue +2 -2
  437. package/src/components/MoleculeInput.vue +3 -3
  438. package/src/components/NumberInput.story.vue +55 -15
  439. package/src/components/NumberInput.vue +83 -24
  440. package/src/components/PlateEditor.story.vue +51 -43
  441. package/src/components/PlateEditor.vue +97 -128
  442. package/src/components/PlotlyChart.story.vue +1 -1
  443. package/src/components/PlotlyChart.vue +6 -4
  444. package/src/components/PluginIcon.story.vue +6 -11
  445. package/src/components/PluginIcon.vue +7 -2
  446. package/src/components/PluginWorkspaceView.controls.ts +9 -29
  447. package/src/components/PluginWorkspaceView.navigation.ts +2 -23
  448. package/src/components/PluginWorkspaceView.props.ts +17 -151
  449. package/src/components/PluginWorkspaceView.shell.ts +13 -24
  450. package/src/components/PluginWorkspaceView.story.vue +65 -63
  451. package/src/components/PluginWorkspaceView.vue +21 -78
  452. package/src/components/PresenceAvatars.story.vue +75 -0
  453. package/src/components/PresenceAvatars.vue +114 -0
  454. package/src/components/ProgressBar.story.vue +7 -7
  455. package/src/components/ProgressBar.vue +4 -3
  456. package/src/components/ProtocolStep.presentation.ts +0 -11
  457. package/src/components/ProtocolStepEditor.vue +6 -5
  458. package/src/components/ProtocolStepParameterField.vue +15 -12
  459. package/src/components/RuntimeUpdateNotice.vue +1 -1
  460. package/src/components/SampleSelector.colors.ts +1 -1
  461. package/src/components/SampleSelector.story.vue +1 -1
  462. package/src/components/SampleSelector.vue +33 -43
  463. package/src/components/SampleSelectorGroupNode.vue +1 -1
  464. package/src/components/ScheduleCalendar.vue +4 -4
  465. package/src/components/SecretInput.story.vue +1 -1
  466. package/src/components/SecretInput.vue +16 -25
  467. package/src/components/SectionCard.story.vue +2 -2
  468. package/src/components/SegmentedControl.story.vue +7 -7
  469. package/src/components/SegmentedControl.vue +5 -3
  470. package/src/components/SequenceInput.story.vue +2 -2
  471. package/src/components/SequenceInput.vue +3 -3
  472. package/src/components/SequenceProgressBar.story.vue +9 -0
  473. package/src/components/SequenceProgressBar.vue +6 -1
  474. package/src/components/SettingsModal.schema.ts +1 -1
  475. package/src/components/SettingsModal.story.vue +13 -14
  476. package/src/components/SettingsModal.vue +31 -49
  477. package/src/components/SmartGroup.types.ts +4 -6
  478. package/src/components/SmartGroupFieldRecipe.story.vue +1 -1
  479. package/src/components/SmartGroupFieldRecipe.vue +7 -5
  480. package/src/components/SmartGroupManual.story.vue +1 -1
  481. package/src/components/StaleFormBanner.story.vue +90 -0
  482. package/src/components/StaleFormBanner.vue +83 -0
  483. package/src/components/StepWizard.story.vue +33 -0
  484. package/src/components/StepWizard.vue +8 -1
  485. package/src/components/TagsInput.story.vue +7 -7
  486. package/src/components/TagsInput.vue +7 -6
  487. package/src/components/ThemeToggle.vue +5 -30
  488. package/src/components/TimeRangeInput.story.vue +1 -1
  489. package/src/components/TimeRangeInput.vue +10 -8
  490. package/src/components/VersionConflictDialog.story.vue +60 -0
  491. package/src/components/VersionConflictDialog.vue +79 -0
  492. package/src/components/WellPlate.geometry.ts +0 -38
  493. package/src/components/WellPlate.rendering.ts +0 -13
  494. package/src/components/WellPlate.story.vue +64 -51
  495. package/src/components/WellPlate.vue +68 -87
  496. package/src/components/index.ts +3 -105
  497. package/src/components/internal/AppTopBarPillNavInternal.vue +33 -2
  498. package/src/components/{AutoGroupModal.adapter.ts → internal/AutoGroupModalInternal.adapter.ts} +8 -8
  499. package/src/components/{AutoGroupModal.vue → internal/AutoGroupModalInternal.vue} +23 -23
  500. package/src/components/{BaseToggle.vue → internal/CheckboxSwitchInternal.vue} +8 -8
  501. package/src/components/internal/DataStateInternal.vue +1 -1
  502. package/src/components/internal/DatePickerDateInternal.vue +219 -0
  503. package/src/components/{DateTimePicker.vue → internal/DatePickerDateTimeInternal.vue} +12 -22
  504. package/src/components/{TimePicker.vue → internal/DatePickerTimeInternal.vue} +12 -15
  505. package/src/components/internal/FilePickerListInternal.vue +8 -14
  506. package/src/components/{FormActions.vue → internal/FormActionsInternal.vue} +2 -2
  507. package/src/components/internal/FormFieldRendererInternal.vue +1 -1
  508. package/src/components/internal/FormSchemaInternal.vue +253 -0
  509. package/src/components/{UnitInput.vue → internal/NumberUnitInputInternal.vue} +28 -28
  510. package/src/components/internal/PlateEditorBindingInternal.vue +8 -7
  511. package/src/components/internal/ResourcePickerListInternal.vue +48 -88
  512. package/src/components/internal/SelectMultipleInternal.vue +242 -0
  513. package/src/components/{SearchableSelect.vue → internal/SelectSearchableInternal.vue} +26 -11
  514. package/src/components/internal/WellEditPopupInternal.vue +4 -9
  515. package/src/components/internal/WorkspaceShellInternal.vue +3 -36
  516. package/src/components/internal/WorkspaceSidebarInternal.vue +4 -25
  517. package/src/{composables → components/internal}/autoGroup/classKey.ts +1 -1
  518. package/src/{composables → components/internal}/autoGroup/classify.ts +1 -1
  519. package/src/{composables → components/internal}/autoGroup/columns.ts +1 -1
  520. package/src/{composables → components/internal}/autoGroup/compose.ts +3 -3
  521. package/src/{composables → components/internal}/autoGroup/cooccurrence.ts +1 -1
  522. package/src/{composables → components/internal}/autoGroup/csv-shim.ts +1 -1
  523. package/src/{composables → components/internal}/autoGroup/fingerprint.ts +1 -1
  524. package/src/{composables → components/internal}/autoGroup/index.ts +1 -2
  525. package/src/{composables → components/internal}/autoGroup/template.ts +1 -1
  526. package/src/{composables → components/internal}/autoGroup/tokenLength.ts +1 -1
  527. package/src/components/internal/generatedJobsApi.ts +1 -1
  528. package/src/{composables → components/internal}/useAutoGroup.ts +3 -57
  529. package/src/composables/componentSpecs.ts +62 -0
  530. package/src/composables/controlComponentBindings.ts +7 -0
  531. package/src/composables/controlSchemaAdapters.ts +45 -7
  532. package/src/composables/controlSchemaDoseDesign.ts +16 -5
  533. package/src/composables/controlSchemaModel.ts +1 -1
  534. package/src/composables/controlSchemaTypes.ts +31 -22
  535. package/src/composables/{usePluginClient.ts → createClient.ts} +54 -190
  536. package/src/composables/{useEventStream.ts → eventStream.ts} +3 -3
  537. package/src/composables/experiment-utils.ts +1 -39
  538. package/src/composables/formBuilderRegistry.ts +6 -12
  539. package/src/composables/index.ts +17 -480
  540. package/src/composables/platformContextHelpers.ts +0 -57
  541. package/src/composables/pluginEndpointBuilder.ts +8 -10
  542. package/src/composables/pluginIdentity.ts +31 -0
  543. package/src/composables/pluginWorkspaceModel.ts +16 -107
  544. package/src/composables/useApi.ts +18 -30
  545. package/src/composables/useAppExperiment.ts +26 -5
  546. package/src/composables/{useAnalysisArtifacts.ts → useArtifacts.ts} +18 -19
  547. package/src/composables/useCalendarGrid.ts +4 -3
  548. package/src/composables/useControlSchema.ts +5 -9
  549. package/src/composables/useControlWorkspace.ts +4 -7
  550. package/src/composables/useExperiment.ts +49 -0
  551. package/src/composables/useExperimentData.ts +4 -4
  552. package/src/composables/useExperimentSelector.ts +82 -36
  553. package/src/composables/useFileBrowser.ts +5 -13
  554. package/src/composables/useFilePicker.ts +2 -2
  555. package/src/composables/useFormBuilder.ts +3 -4
  556. package/src/composables/useJobCenter.ts +324 -0
  557. package/src/composables/{useGeneratedAnalysis.ts → useJobsEndpoint.ts} +53 -67
  558. package/src/composables/useMenuKeyboard.ts +1 -1
  559. package/src/composables/usePlatform.ts +95 -0
  560. package/src/composables/usePlatformFilePickerAdapter.ts +2 -1
  561. package/src/composables/usePluginWorkspace.ts +62 -107
  562. package/src/composables/usePresence.ts +110 -0
  563. package/src/composables/useRackEditor.ts +3 -3
  564. package/src/composables/useRealtime.ts +194 -0
  565. package/src/composables/{useRequestSyncState.ts → useRequest.ts} +25 -48
  566. package/src/composables/useScheduleCalendarLayout.ts +1 -1
  567. package/src/composables/useToast.ts +14 -11
  568. package/src/composables/useVersionedSave.ts +165 -0
  569. package/src/data.ts +130 -0
  570. package/src/deprecatedRootExports.ts +226 -0
  571. package/src/generated/schema.ts +1 -0
  572. package/src/host.ts +27 -0
  573. package/src/index.ts +2 -71
  574. package/src/install.ts +15 -2
  575. package/src/instrument.ts +1 -6
  576. package/src/lab.ts +128 -0
  577. package/src/permissions.ts +0 -27
  578. package/src/runtime.ts +145 -0
  579. package/src/shell.ts +103 -0
  580. package/src/stores/auth.ts +26 -162
  581. package/src/stores/experiment.ts +27 -1
  582. package/src/styles/components/action-menu.css +0 -5
  583. package/src/styles/components/adduct-text.css +13 -5
  584. package/src/styles/components/alert-box.css +39 -40
  585. package/src/styles/components/app-layout.css +6 -5
  586. package/src/styles/components/app-page-selector.css +3 -1
  587. package/src/styles/components/app-pill-nav.css +11 -12
  588. package/src/styles/components/app-sidebar.css +9 -18
  589. package/src/styles/components/app-top-bar.css +64 -103
  590. package/src/styles/components/artifact-save-dialog.css +153 -2
  591. package/src/styles/components/audit-trail.css +16 -19
  592. package/src/styles/components/avatar.css +6 -4
  593. package/src/styles/components/batch-progress-list.css +38 -36
  594. package/src/styles/components/button.css +40 -59
  595. package/src/styles/components/calendar.css +12 -12
  596. package/src/styles/components/chart-container.css +34 -23
  597. package/src/styles/components/checkbox.css +3 -13
  598. package/src/styles/components/collapsible-card.css +28 -30
  599. package/src/styles/components/confirm-dialog.css +31 -16
  600. package/src/styles/components/dataframe.css +12 -4
  601. package/src/styles/components/date-picker.css +80 -92
  602. package/src/styles/components/datetime-picker.css +31 -43
  603. package/src/styles/components/divider.css +20 -20
  604. package/src/styles/components/dose-calculator.css +3 -3
  605. package/src/styles/components/empty-state.css +23 -18
  606. package/src/styles/components/experiment-code-badge.css +2 -0
  607. package/src/styles/components/experiment-popover.css +174 -329
  608. package/src/styles/components/experiment-selector-modal.css +75 -56
  609. package/src/styles/components/file-picker.css +4 -4
  610. package/src/styles/components/file-uploader.css +38 -49
  611. package/src/styles/components/form-builder.css +3 -3
  612. package/src/styles/components/formula-input.css +1 -1
  613. package/src/styles/components/icon-button.css +19 -25
  614. package/src/styles/components/input.css +5 -4
  615. package/src/styles/components/instrument-monitor.css +13 -15
  616. package/src/styles/components/jobs-status-tray.css +31 -25
  617. package/src/styles/components/loading-spinner.css +9 -12
  618. package/src/styles/components/modal.css +2 -4
  619. package/src/styles/components/molecule-input.css +2 -2
  620. package/src/styles/components/multi-select.css +65 -112
  621. package/src/styles/components/number-input.css +26 -19
  622. package/src/styles/components/pill.css +43 -37
  623. package/src/styles/components/plate-editor.css +0 -1
  624. package/src/styles/components/plugin-icon.css +34 -22
  625. package/src/styles/components/popover.css +2 -2
  626. package/src/styles/components/presence-avatars.css +194 -0
  627. package/src/styles/components/progress-bar.css +2 -0
  628. package/src/styles/components/protocol-step-editor.css +1 -3
  629. package/src/styles/components/resource-card.css +2 -2
  630. package/src/styles/components/resource-picker-list.css +6 -57
  631. package/src/styles/components/sample-hierarchy-tree.css +4 -4
  632. package/src/styles/components/sample-selector.css +95 -79
  633. package/src/styles/components/schedule-calendar.css +8 -8
  634. package/src/styles/components/searchable-select.css +15 -12
  635. package/src/styles/components/section-card.css +28 -47
  636. package/src/styles/components/segmented-control.css +18 -15
  637. package/src/styles/components/select.css +3 -3
  638. package/src/styles/components/sequence-input.css +2 -2
  639. package/src/styles/components/sequence-progress-bar.css +17 -8
  640. package/src/styles/components/smart-group.css +19 -24
  641. package/src/styles/components/step-wizard.css +52 -16
  642. package/src/styles/components/tabs.css +2 -2
  643. package/src/styles/components/textarea.css +4 -4
  644. package/src/styles/components/time-picker.css +36 -21
  645. package/src/styles/components/toast.css +12 -10
  646. package/src/styles/components/toggle.css +3 -13
  647. package/src/styles/components/tooltip.css +10 -9
  648. package/src/styles/components/unit-input.css +8 -7
  649. package/src/styles/components/version-conflict.css +122 -0
  650. package/src/styles/components/well-plate.css +8 -8
  651. package/src/styles/index.css +2 -11
  652. package/src/styles/variables.css +107 -602
  653. package/src/types/analysisArtifactTypes.ts +1 -1
  654. package/src/types/auth.ts +0 -10
  655. package/src/types/componentLabTypes.ts +103 -53
  656. package/src/types/componentWorkflowTypes.ts +4 -33
  657. package/src/types/components.ts +148 -114
  658. package/src/types/form-builder.ts +4 -0
  659. package/src/types/generated/platformContext.ts +60 -0
  660. package/src/types/generated-ui.ts +6 -2
  661. package/src/types/index.ts +15 -53
  662. package/src/types/instrument.ts +27 -0
  663. package/src/types/platform.ts +25 -89
  664. package/src/utils/color.ts +1 -12
  665. package/src/utils/dose.ts +335 -0
  666. package/src/utils/experimentStatus.ts +43 -0
  667. package/src/utils/formula.ts +292 -0
  668. package/src/utils/integrationHost.ts +27 -0
  669. package/src/utils/plotlyTemplate.ts +6 -0
  670. package/src/utils/pluginSecrets.ts +23 -23
  671. package/src/utils/presenceAvatars.ts +53 -0
  672. package/src/utils/records.ts +0 -5
  673. package/src/{composables/useTimeUtils.ts → utils/time.ts} +21 -21
  674. package/dist/ResourcePickerListInternal-CFAw4vTZ.js +0 -605
  675. package/dist/ResourcePickerListInternal-CFAw4vTZ.js.map +0 -1
  676. package/dist/__tests__/composables/useBioTemplatePackWorkspace.test.d.ts +0 -1
  677. package/dist/__tests__/composables/useBioTemplatePresetWorkspace.test.d.ts +0 -1
  678. package/dist/__tests__/composables/useBioTemplateWorkspace.test.d.ts +0 -1
  679. package/dist/__tests__/composables/useChemicalFormula.test.d.ts +0 -1
  680. package/dist/__tests__/composables/useEventStream.test.d.ts +0 -1
  681. package/dist/__tests__/composables/useExperimentSave.test.d.ts +0 -1
  682. package/dist/__tests__/composables/useGeneratedAnalysis.test.d.ts +0 -1
  683. package/dist/__tests__/composables/useGroupAssignment.test.d.ts +0 -1
  684. package/dist/__tests__/composables/useJobsStatusTray.test.d.ts +0 -1
  685. package/dist/__tests__/composables/useMobileSupportGate.test.d.ts +0 -1
  686. package/dist/__tests__/composables/usePlatformContext.test.d.ts +0 -1
  687. package/dist/__tests__/composables/usePluginClient.test.d.ts +0 -1
  688. package/dist/__tests__/composables/usePresenceHeartbeat.test.d.ts +0 -1
  689. package/dist/__tests__/composables/useRequestSyncState.test.d.ts +0 -1
  690. package/dist/__tests__/composables/useRuntimeAlignment.test.d.ts +0 -1
  691. package/dist/__tests__/composables/useTemplateCollection.test.d.ts +0 -1
  692. package/dist/__tests__/composables/useTimeUtils.test.d.ts +0 -1
  693. package/dist/__tests__/docs/extractDocsTemplates.test.d.ts +0 -1
  694. package/dist/__tests__/templates/templates.test.d.ts +0 -1
  695. package/dist/__tests__/templates/templatesDeprecation.test.d.ts +0 -1
  696. package/dist/__tests__/utils/lcms.test.d.ts +0 -1
  697. package/dist/__tests__/utils/rack.test.d.ts +0 -1
  698. package/dist/components/AppAvatarMenu.vue.d.ts +0 -47
  699. package/dist/components/AppTopBar.navigation.d.ts +0 -10
  700. package/dist/components/BaseTextarea.vue.d.ts +0 -31
  701. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +0 -112
  702. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +0 -86
  703. package/dist/components/BioTemplatePresetWorkspaceView.vue.d.ts +0 -80
  704. package/dist/components/BioTemplateRenderer.vue.d.ts +0 -30
  705. package/dist/components/ControlWorkspaceView.vue.d.ts +0 -138
  706. package/dist/components/DoseDesignWorkspaceView.vue.d.ts +0 -140
  707. package/dist/components/ExperimentDataViewer.vue.d.ts +0 -54
  708. package/dist/components/ExperimentTimeline.vue.d.ts +0 -70
  709. package/dist/components/FitPanel.vue.d.ts +0 -56
  710. package/dist/components/GroupAssigner.vue.d.ts +0 -26
  711. package/dist/components/IconButton.vue.d.ts +0 -30
  712. package/dist/components/MobileSupportGate.vue.d.ts +0 -32
  713. package/dist/components/ReagentEditor.vue.d.ts +0 -31
  714. package/dist/components/ReagentList.presentation.d.ts +0 -17
  715. package/dist/components/ReagentList.vue.d.ts +0 -58
  716. package/dist/components/SampleLegend.vue.d.ts +0 -33
  717. package/dist/components/SmartGroupModal.vue.d.ts +0 -29
  718. package/dist/components/index.js +0 -5
  719. package/dist/components-BOA5e7kb.js +0 -23137
  720. package/dist/components-BOA5e7kb.js.map +0 -1
  721. package/dist/composables/flattenWorkspaceBindings.d.ts +0 -61
  722. package/dist/composables/index.js +0 -7
  723. package/dist/composables/useBioTemplateComponents.d.ts +0 -34
  724. package/dist/composables/useBioTemplateControls.d.ts +0 -10
  725. package/dist/composables/useBioTemplatePackWorkspace.d.ts +0 -56
  726. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +0 -79
  727. package/dist/composables/useBioTemplateWorkspace.d.ts +0 -39
  728. package/dist/composables/useExperimentSave.d.ts +0 -69
  729. package/dist/composables/useGroupAssignment.d.ts +0 -35
  730. package/dist/composables/useJobsStatusTray.d.ts +0 -87
  731. package/dist/composables/useMobileSupportGate.d.ts +0 -14
  732. package/dist/composables/usePlatformContext.d.ts +0 -218
  733. package/dist/composables/usePresenceHeartbeat.d.ts +0 -49
  734. package/dist/composables/useRuntimeAlignment.d.ts +0 -44
  735. package/dist/composables/useTemplateCollection.d.ts +0 -62
  736. package/dist/composables/workspaceRecipes.d.ts +0 -189
  737. package/dist/composables-izSQH8Ky.js +0 -591
  738. package/dist/composables-izSQH8Ky.js.map +0 -1
  739. package/dist/experiment-D49y_Kro.js +0 -459
  740. package/dist/experiment-D49y_Kro.js.map +0 -1
  741. package/dist/experiment-utils-DTANyVKV.js.map +0 -1
  742. package/dist/install.js.map +0 -1
  743. package/dist/lcms.d.ts +0 -38
  744. package/dist/settings-BG6v13Zq.js +0 -341
  745. package/dist/settings-BG6v13Zq.js.map +0 -1
  746. package/dist/tailwind.preset.d.ts +0 -63
  747. package/dist/tailwind.preset.js +0 -71
  748. package/dist/tailwind.preset.js.map +0 -1
  749. package/dist/templates/adapters.d.ts +0 -19
  750. package/dist/templates/assayLookups.d.ts +0 -3
  751. package/dist/templates/assayMatrixAdapters.d.ts +0 -13
  752. package/dist/templates/assayMatrixBuilder.d.ts +0 -3
  753. package/dist/templates/assayNormalizers.d.ts +0 -4
  754. package/dist/templates/builderIdUtils.d.ts +0 -4
  755. package/dist/templates/builderPresetControls.d.ts +0 -11
  756. package/dist/templates/builderReadUtils.d.ts +0 -8
  757. package/dist/templates/builders.d.ts +0 -26
  758. package/dist/templates/calibrationCurveAdapters.d.ts +0 -7
  759. package/dist/templates/calibrationCurveBuilder.d.ts +0 -3
  760. package/dist/templates/calibrationNormalizers.d.ts +0 -5
  761. package/dist/templates/catalog.d.ts +0 -192
  762. package/dist/templates/componentBindingCatalog.d.ts +0 -25
  763. package/dist/templates/componentBindingHelpers.d.ts +0 -17
  764. package/dist/templates/componentBindings.d.ts +0 -97
  765. package/dist/templates/componentDoseResponseProps.d.ts +0 -3
  766. package/dist/templates/componentGenericProps.d.ts +0 -8
  767. package/dist/templates/componentPlateHelpers.d.ts +0 -11
  768. package/dist/templates/componentPlateMapProps.d.ts +0 -3
  769. package/dist/templates/componentPropsFactory.d.ts +0 -3
  770. package/dist/templates/componentQpcrPlateProps.d.ts +0 -3
  771. package/dist/templates/componentTargetResolvers.d.ts +0 -5
  772. package/dist/templates/componentTemplateProps.d.ts +0 -3
  773. package/dist/templates/controlSchemaClone.d.ts +0 -4
  774. package/dist/templates/controlSchemaConstants.d.ts +0 -10
  775. package/dist/templates/controlSchemaMerge.d.ts +0 -3
  776. package/dist/templates/controlSchemaTargets.d.ts +0 -17
  777. package/dist/templates/controlSchemaTypes.d.ts +0 -4
  778. package/dist/templates/controlSchemas.d.ts +0 -34
  779. package/dist/templates/defaultBioTemplateBuilder.d.ts +0 -3
  780. package/dist/templates/doseResponseAdapters.d.ts +0 -6
  781. package/dist/templates/doseResponseBuilder.d.ts +0 -3
  782. package/dist/templates/elisaAssayCollectionBuilder.d.ts +0 -3
  783. package/dist/templates/flowCytometryAssayCollectionBuilder.d.ts +0 -3
  784. package/dist/templates/flowCytometryPanelBuilder.d.ts +0 -3
  785. package/dist/templates/flowNormalizers.d.ts +0 -8
  786. package/dist/templates/flowPanelAdapters.d.ts +0 -7
  787. package/dist/templates/index.d.ts +0 -15
  788. package/dist/templates/index.js +0 -2
  789. package/dist/templates/instrumentRunAdapterHelpers.d.ts +0 -8
  790. package/dist/templates/instrumentRunAdapters.d.ts +0 -19
  791. package/dist/templates/instrumentRunBuilder.d.ts +0 -3
  792. package/dist/templates/lcmsBatchCollectionBuilder.d.ts +0 -3
  793. package/dist/templates/lookup.d.ts +0 -4
  794. package/dist/templates/packs.d.ts +0 -21
  795. package/dist/templates/plateMapAdapters.d.ts +0 -5
  796. package/dist/templates/plateMapBuilder.d.ts +0 -3
  797. package/dist/templates/presetControlSchemas.d.ts +0 -534
  798. package/dist/templates/presets.d.ts +0 -106
  799. package/dist/templates/protocolAdapters.d.ts +0 -9
  800. package/dist/templates/protocolNormalizers.d.ts +0 -6
  801. package/dist/templates/protocolStepsBuilder.d.ts +0 -3
  802. package/dist/templates/qpcrAdapters.d.ts +0 -9
  803. package/dist/templates/qpcrExpressionCollectionBuilder.d.ts +0 -3
  804. package/dist/templates/qpcrPlateBuilder.d.ts +0 -3
  805. package/dist/templates/reagentAdapters.d.ts +0 -9
  806. package/dist/templates/reagentListBuilder.d.ts +0 -3
  807. package/dist/templates/runNormalizers.d.ts +0 -10
  808. package/dist/templates/sampleNormalizers.d.ts +0 -4
  809. package/dist/templates/samplePrepAdapters.d.ts +0 -7
  810. package/dist/templates/samplePrepBuilder.d.ts +0 -3
  811. package/dist/templates/sampleSheetAdapters.d.ts +0 -9
  812. package/dist/templates/sampleSheetBuilder.d.ts +0 -3
  813. package/dist/templates/targetedMetabolomicsCollectionBuilder.d.ts +0 -3
  814. package/dist/templates/targetedMetabolomicsHelpers.d.ts +0 -5
  815. package/dist/templates/templateAdapterTypes.d.ts +0 -48
  816. package/dist/templates/templateControlSchemas.d.ts +0 -400
  817. package/dist/templates/templateCreateOptions.d.ts +0 -165
  818. package/dist/templates/templateEnvelopes.d.ts +0 -17
  819. package/dist/templates/templatePackCollectionBuilder.d.ts +0 -3
  820. package/dist/templates/templatePresetCollectionBuilder.d.ts +0 -20
  821. package/dist/templates/templateQpcrTypes.d.ts +0 -42
  822. package/dist/templates/templateValidators.d.ts +0 -25
  823. package/dist/templates/timeCourseAdapters.d.ts +0 -9
  824. package/dist/templates/timeCourseBuilder.d.ts +0 -3
  825. package/dist/templates/types.d.ts +0 -304
  826. package/dist/templates/wellPlateScreenCollectionBuilder.d.ts +0 -3
  827. package/dist/templates/westernBlotAssayCollectionBuilder.d.ts +0 -3
  828. package/dist/templates-B2DB0MCM.js +0 -12304
  829. package/dist/templates-B2DB0MCM.js.map +0 -1
  830. package/dist/utils/rack.d.ts +0 -63
  831. package/dist/validation-C_eH_vIg.js +0 -7999
  832. package/dist/validation-C_eH_vIg.js.map +0 -1
  833. package/src/__tests__/components/AppAvatarMenu.test.ts +0 -186
  834. package/src/__tests__/components/AppTopBar.navigation.test.ts +0 -68
  835. package/src/__tests__/components/AppTopBarPresence.test.ts +0 -47
  836. package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +0 -159
  837. package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +0 -192
  838. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +0 -307
  839. package/src/__tests__/components/BioTemplateRenderer.test.ts +0 -96
  840. package/src/__tests__/components/ControlWorkspaceView.test.ts +0 -1100
  841. package/src/__tests__/components/DoseDesignWorkspaceView.test.ts +0 -183
  842. package/src/__tests__/components/ExperimentTimeline.test.ts +0 -108
  843. package/src/__tests__/components/FitPanel.test.ts +0 -96
  844. package/src/__tests__/components/GroupAssigner.test.ts +0 -101
  845. package/src/__tests__/components/MobileSupportGate.test.ts +0 -120
  846. package/src/__tests__/components/MultiSelect.test.ts +0 -54
  847. package/src/__tests__/components/ReagentList.presentation.test.ts +0 -73
  848. package/src/__tests__/components/ReagentList.test.ts +0 -167
  849. package/src/__tests__/components/SampleLegend.test.ts +0 -18
  850. package/src/__tests__/components/SmartGroupModal.test.ts +0 -69
  851. package/src/__tests__/components/WellPlate.sampleTypeIndicator.test.ts +0 -58
  852. package/src/__tests__/components/iconButtonIconSizing.test.ts +0 -18
  853. package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +0 -125
  854. package/src/__tests__/composables/useBioTemplatePresetWorkspace.test.ts +0 -199
  855. package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +0 -104
  856. package/src/__tests__/composables/useExperimentSave.test.ts +0 -542
  857. package/src/__tests__/composables/useGroupAssignment.test.ts +0 -73
  858. package/src/__tests__/composables/useMobileSupportGate.test.ts +0 -74
  859. package/src/__tests__/composables/usePlatformContext.test.ts +0 -148
  860. package/src/__tests__/composables/usePresenceHeartbeat.test.ts +0 -164
  861. package/src/__tests__/composables/useRuntimeAlignment.test.ts +0 -145
  862. package/src/__tests__/composables/useTemplateCollection.test.ts +0 -147
  863. package/src/__tests__/docs/extractDocsTemplates.test.ts +0 -53
  864. package/src/__tests__/fixtures/templates/dose-response.json +0 -81
  865. package/src/__tests__/fixtures/templates/plate-map.json +0 -54
  866. package/src/__tests__/fixtures/templates/qpcr-plate.json +0 -96
  867. package/src/__tests__/fixtures/templates/sample-sheet.json +0 -71
  868. package/src/__tests__/templates/templates.test.ts +0 -1235
  869. package/src/__tests__/templates/templatesDeprecation.test.ts +0 -78
  870. package/src/__tests__/utils/lcms.test.ts +0 -73
  871. package/src/__tests__/utils/rack.test.ts +0 -120
  872. package/src/components/AppAvatarMenu.story.vue +0 -155
  873. package/src/components/AppAvatarMenu.vue +0 -154
  874. package/src/components/AppTopBar.navigation.ts +0 -60
  875. package/src/components/AutoGroupModal.story.vue +0 -458
  876. package/src/components/BaseTextarea.vue +0 -58
  877. package/src/components/BioTemplateExperimentWorkspaceView.story.vue +0 -123
  878. package/src/components/BioTemplateExperimentWorkspaceView.vue +0 -339
  879. package/src/components/BioTemplatePackWorkspaceView.story.vue +0 -107
  880. package/src/components/BioTemplatePackWorkspaceView.vue +0 -180
  881. package/src/components/BioTemplatePresetWorkspaceView.story.vue +0 -163
  882. package/src/components/BioTemplatePresetWorkspaceView.vue +0 -403
  883. package/src/components/BioTemplateRenderer.story.vue +0 -57
  884. package/src/components/BioTemplateRenderer.vue +0 -64
  885. package/src/components/ControlWorkspaceView.story.vue +0 -347
  886. package/src/components/ControlWorkspaceView.vue +0 -370
  887. package/src/components/DoseDesignWorkspaceView.story.vue +0 -77
  888. package/src/components/DoseDesignWorkspaceView.vue +0 -243
  889. package/src/components/ExperimentDataViewer.story.vue +0 -177
  890. package/src/components/ExperimentDataViewer.vue +0 -313
  891. package/src/components/ExperimentTimeline.story.vue +0 -208
  892. package/src/components/ExperimentTimeline.vue +0 -383
  893. package/src/components/FitPanel.story.vue +0 -191
  894. package/src/components/FitPanel.vue +0 -168
  895. package/src/components/FormActions.story.vue +0 -96
  896. package/src/components/GroupAssigner.story.vue +0 -83
  897. package/src/components/GroupAssigner.vue +0 -319
  898. package/src/components/IconButton.story.vue +0 -140
  899. package/src/components/IconButton.vue +0 -69
  900. package/src/components/MobileSupportGate.story.vue +0 -52
  901. package/src/components/MobileSupportGate.vue +0 -111
  902. package/src/components/MultiSelect.vue +0 -119
  903. package/src/components/ReagentEditor.story.vue +0 -153
  904. package/src/components/ReagentEditor.vue +0 -414
  905. package/src/components/ReagentList.presentation.ts +0 -106
  906. package/src/components/ReagentList.story.vue +0 -155
  907. package/src/components/ReagentList.vue +0 -438
  908. package/src/components/SampleLegend.story.vue +0 -91
  909. package/src/components/SampleLegend.vue +0 -121
  910. package/src/components/SmartGroupModal.story.vue +0 -61
  911. package/src/components/SmartGroupModal.vue +0 -61
  912. package/src/components/StatusIndicator.story.vue +0 -99
  913. package/src/components/StatusIndicator.vue +0 -36
  914. package/src/components/UnitInput.story.vue +0 -194
  915. package/src/composables/flattenWorkspaceBindings.ts +0 -104
  916. package/src/composables/useBioTemplateComponents.ts +0 -117
  917. package/src/composables/useBioTemplateControls.ts +0 -45
  918. package/src/composables/useBioTemplatePackWorkspace.ts +0 -201
  919. package/src/composables/useBioTemplatePresetWorkspace.ts +0 -329
  920. package/src/composables/useBioTemplateWorkspace.ts +0 -120
  921. package/src/composables/useChemicalFormula.ts +0 -301
  922. package/src/composables/useDoseCalculator.ts +0 -370
  923. package/src/composables/useExperimentSave.ts +0 -348
  924. package/src/composables/useGroupAssignment.ts +0 -152
  925. package/src/composables/useJobsStatusTray.ts +0 -493
  926. package/src/composables/useMobileSupportGate.ts +0 -80
  927. package/src/composables/usePlatformContext.ts +0 -299
  928. package/src/composables/usePresenceHeartbeat.ts +0 -201
  929. package/src/composables/useRuntimeAlignment.ts +0 -184
  930. package/src/composables/useTemplateCollection.ts +0 -233
  931. package/src/composables/workspaceRecipes.ts +0 -268
  932. package/src/lcms.ts +0 -119
  933. package/src/styles/components/app-avatar-menu.css +0 -121
  934. package/src/styles/components/experiment-data-viewer.css +0 -138
  935. package/src/styles/components/experiment-timeline.css +0 -572
  936. package/src/styles/components/fit-panel.css +0 -153
  937. package/src/styles/components/group-assigner.css +0 -198
  938. package/src/styles/components/mobile-support-gate.css +0 -117
  939. package/src/styles/components/reagent-editor.css +0 -501
  940. package/src/styles/components/reagent-list.css +0 -408
  941. package/src/styles/components/sample-legend.css +0 -212
  942. package/src/styles/components/status-indicator.css +0 -66
  943. package/src/styles/components/theme-toggle.css +0 -6
  944. package/src/tailwind.preset.ts +0 -66
  945. package/src/templates/adapters.ts +0 -141
  946. package/src/templates/assayLookups.ts +0 -33
  947. package/src/templates/assayMatrixAdapters.ts +0 -85
  948. package/src/templates/assayMatrixBuilder.ts +0 -60
  949. package/src/templates/assayNormalizers.ts +0 -34
  950. package/src/templates/builderIdUtils.ts +0 -20
  951. package/src/templates/builderPresetControls.ts +0 -166
  952. package/src/templates/builderReadUtils.ts +0 -55
  953. package/src/templates/builders.ts +0 -122
  954. package/src/templates/calibrationCurveAdapters.ts +0 -62
  955. package/src/templates/calibrationCurveBuilder.ts +0 -100
  956. package/src/templates/calibrationNormalizers.ts +0 -60
  957. package/src/templates/catalog.ts +0 -249
  958. package/src/templates/componentBindingCatalog.ts +0 -90
  959. package/src/templates/componentBindingHelpers.ts +0 -93
  960. package/src/templates/componentBindings.ts +0 -279
  961. package/src/templates/componentDoseResponseProps.ts +0 -41
  962. package/src/templates/componentGenericProps.ts +0 -77
  963. package/src/templates/componentPlateHelpers.ts +0 -52
  964. package/src/templates/componentPlateMapProps.ts +0 -34
  965. package/src/templates/componentPropsFactory.ts +0 -21
  966. package/src/templates/componentQpcrPlateProps.ts +0 -27
  967. package/src/templates/componentTargetResolvers.ts +0 -67
  968. package/src/templates/componentTemplateProps.ts +0 -78
  969. package/src/templates/controlSchemaClone.ts +0 -32
  970. package/src/templates/controlSchemaConstants.ts +0 -11
  971. package/src/templates/controlSchemaMerge.ts +0 -40
  972. package/src/templates/controlSchemaTargets.ts +0 -85
  973. package/src/templates/controlSchemaTypes.ts +0 -20
  974. package/src/templates/controlSchemas.ts +0 -113
  975. package/src/templates/defaultBioTemplateBuilder.ts +0 -125
  976. package/src/templates/doseResponseAdapters.ts +0 -36
  977. package/src/templates/doseResponseBuilder.ts +0 -45
  978. package/src/templates/elisaAssayCollectionBuilder.ts +0 -63
  979. package/src/templates/flowCytometryAssayCollectionBuilder.ts +0 -42
  980. package/src/templates/flowCytometryPanelBuilder.ts +0 -54
  981. package/src/templates/flowNormalizers.ts +0 -58
  982. package/src/templates/flowPanelAdapters.ts +0 -61
  983. package/src/templates/index.ts +0 -330
  984. package/src/templates/instrumentRunAdapterHelpers.ts +0 -94
  985. package/src/templates/instrumentRunAdapters.ts +0 -174
  986. package/src/templates/instrumentRunBuilder.ts +0 -98
  987. package/src/templates/lcmsBatchCollectionBuilder.ts +0 -39
  988. package/src/templates/lookup.ts +0 -18
  989. package/src/templates/packs.ts +0 -166
  990. package/src/templates/plateMapAdapters.ts +0 -38
  991. package/src/templates/plateMapBuilder.ts +0 -44
  992. package/src/templates/presetControlSchemas.ts +0 -258
  993. package/src/templates/presets.ts +0 -183
  994. package/src/templates/protocolAdapters.ts +0 -73
  995. package/src/templates/protocolNormalizers.ts +0 -37
  996. package/src/templates/protocolStepsBuilder.ts +0 -37
  997. package/src/templates/qpcrAdapters.ts +0 -108
  998. package/src/templates/qpcrExpressionCollectionBuilder.ts +0 -34
  999. package/src/templates/qpcrPlateBuilder.ts +0 -97
  1000. package/src/templates/reagentAdapters.ts +0 -81
  1001. package/src/templates/reagentListBuilder.ts +0 -31
  1002. package/src/templates/runNormalizers.ts +0 -63
  1003. package/src/templates/sampleNormalizers.ts +0 -58
  1004. package/src/templates/samplePrepAdapters.ts +0 -66
  1005. package/src/templates/samplePrepBuilder.ts +0 -52
  1006. package/src/templates/sampleSheetAdapters.ts +0 -79
  1007. package/src/templates/sampleSheetBuilder.ts +0 -24
  1008. package/src/templates/targetedMetabolomicsCollectionBuilder.ts +0 -80
  1009. package/src/templates/targetedMetabolomicsHelpers.ts +0 -102
  1010. package/src/templates/templateAdapterTypes.ts +0 -58
  1011. package/src/templates/templateControlSchemas.ts +0 -320
  1012. package/src/templates/templateCreateOptions.ts +0 -208
  1013. package/src/templates/templateEnvelopes.ts +0 -145
  1014. package/src/templates/templatePackCollectionBuilder.ts +0 -24
  1015. package/src/templates/templatePresetCollectionBuilder.ts +0 -141
  1016. package/src/templates/templateQpcrTypes.ts +0 -48
  1017. package/src/templates/templateValidators.ts +0 -426
  1018. package/src/templates/timeCourseAdapters.ts +0 -77
  1019. package/src/templates/timeCourseBuilder.ts +0 -65
  1020. package/src/templates/types.ts +0 -493
  1021. package/src/templates/wellPlateScreenCollectionBuilder.ts +0 -37
  1022. package/src/templates/westernBlotAssayCollectionBuilder.ts +0 -69
  1023. package/src/utils/rack.ts +0 -225
  1024. /package/dist/__tests__/components/{AppAvatarMenu.test.d.ts → BaseButton.test.d.ts} +0 -0
  1025. /package/dist/__tests__/components/{AppTopBar.navigation.test.d.ts → BaseCheckbox.switch.test.d.ts} +0 -0
  1026. /package/dist/__tests__/components/{AppTopBarPresence.test.d.ts → BaseSelect.multiple.test.d.ts} +0 -0
  1027. /package/dist/__tests__/components/{BaseToggle.test.d.ts → BaseSelect.searchable.test.d.ts} +0 -0
  1028. /package/dist/__tests__/components/{BioTemplateExperimentWorkspaceView.test.d.ts → ConfirmDialog.test.d.ts} +0 -0
  1029. /package/dist/__tests__/components/{BioTemplatePackWorkspaceView.test.d.ts → DatePicker.datetime.test.d.ts} +0 -0
  1030. /package/dist/__tests__/components/{BioTemplatePresetWorkspaceView.test.d.ts → DatePicker.time.test.d.ts} +0 -0
  1031. /package/dist/__tests__/components/{BioTemplateRenderer.test.d.ts → FormSchemaInternal.test.d.ts} +0 -0
  1032. /package/dist/__tests__/components/{ControlWorkspaceView.test.d.ts → InstrumentStatusPanels.test.d.ts} +0 -0
  1033. /package/dist/__tests__/components/{DateTimePicker.test.d.ts → NumberInput.units.test.d.ts} +0 -0
  1034. /package/dist/__tests__/components/{DoseDesignWorkspaceView.test.d.ts → PresenceAvatars.test.d.ts} +0 -0
  1035. /package/dist/__tests__/components/{ExperimentTimeline.test.d.ts → StaleFormBanner.test.d.ts} +0 -0
  1036. /package/dist/__tests__/components/{FitPanel.test.d.ts → deprecationTags.test.d.ts} +0 -0
  1037. /package/dist/__tests__/{components/GroupAssigner.test.d.ts → composables/createClient.test.d.ts} +0 -0
  1038. /package/dist/__tests__/{components/MobileSupportGate.test.d.ts → composables/eventStream.test.d.ts} +0 -0
  1039. /package/dist/__tests__/{components/MultiSelect.test.d.ts → composables/useArtifacts.test.d.ts} +0 -0
  1040. /package/dist/__tests__/{components/ReagentList.presentation.test.d.ts → composables/useExperiment.test.d.ts} +0 -0
  1041. /package/dist/__tests__/{components/ReagentList.test.d.ts → composables/useJobCenter.test.d.ts} +0 -0
  1042. /package/dist/__tests__/{components/SampleLegend.test.d.ts → composables/useJobsEndpoint.test.d.ts} +0 -0
  1043. /package/dist/__tests__/{components/SearchableSelect.test.d.ts → composables/usePlatform.test.d.ts} +0 -0
  1044. /package/dist/__tests__/{components/SmartGroupModal.test.d.ts → composables/usePresence.test.d.ts} +0 -0
  1045. /package/dist/__tests__/{components/TimePicker.test.d.ts → composables/useRealtime.test.d.ts} +0 -0
  1046. /package/dist/__tests__/{components/UnitInput.test.d.ts → composables/useRequest.test.d.ts} +0 -0
  1047. /package/dist/__tests__/{components/WellPlate.sampleTypeIndicator.test.d.ts → composables/useVersionedSave.test.d.ts} +0 -0
  1048. /package/dist/__tests__/{components/iconButtonIconSizing.test.d.ts → utils/formula.test.d.ts} +0 -0
  1049. /package/dist/__tests__/{composables/useAnalysisArtifacts.test.d.ts → utils/time.test.d.ts} +0 -0
  1050. /package/dist/components/{FormActions.vue.d.ts → internal/FormActionsInternal.vue.d.ts} +0 -0
  1051. /package/dist/{composables → components/internal}/autoGroup/colors.d.ts +0 -0
  1052. /package/dist/{composables → components/internal}/autoGroup/index.d.ts +0 -0
  1053. /package/dist/{composables → components/internal}/autoGroup/tokenize.d.ts +0 -0
  1054. /package/src/{composables → components/internal}/autoGroup/colors.ts +0 -0
  1055. /package/src/{composables → components/internal}/autoGroup/tokenize.ts +0 -0
  1056. /package/src/{composables → components/internal}/autoGroup/vocab.json +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SettingsModal-DO3IZ7qz.js","names":[],"sources":["../src/components/internal/SettingsPaneHeadInternal.vue","../src/components/internal/SettingsPaneHeadInternal.vue","../src/components/SettingsModal.schema.ts","../src/components/SettingsModal.vue","../src/components/SettingsModal.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/** SettingsModal pane header: title + description or mono count, and an optional \"Restore group defaults\" action. */\ninterface Props {\n title: string\n description?: string\n /** Mono count after the title (search results). */\n count?: string\n /** Modified fields in the group. Omit to hide the restore action; 0 renders it disabled. */\n modifiedCount?: number\n}\n\ndefineProps<Props>()\n\nconst emit = defineEmits<{\n restore: []\n}>()\n</script>\n\n<template>\n <div class=\"mint-settings-modal__head\">\n <div class=\"mint-settings-modal__head-text\">\n <h4 class=\"mint-settings-modal__head-title\">\n {{ title }}\n <span v-if=\"count\" class=\"mint-settings-modal__head-count\">{{ count }}</span>\n </h4>\n <p v-if=\"description\" class=\"mint-settings-modal__head-description\">{{ description }}</p>\n </div>\n <button\n v-if=\"modifiedCount !== undefined\"\n type=\"button\"\n class=\"mint-settings-modal__restore-group\"\n :disabled=\"modifiedCount === 0\"\n @click=\"emit('restore')\"\n >\n <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 8a5 5 0 1 0 1.5-3.5M3 3v2.5h2.5\" />\n </svg>\n Restore group defaults\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** SettingsModal pane header: title + description or mono count, and an optional \"Restore group defaults\" action. */\ninterface Props {\n title: string\n description?: string\n /** Mono count after the title (search results). */\n count?: string\n /** Modified fields in the group. Omit to hide the restore action; 0 renders it disabled. */\n modifiedCount?: number\n}\n\ndefineProps<Props>()\n\nconst emit = defineEmits<{\n restore: []\n}>()\n</script>\n\n<template>\n <div class=\"mint-settings-modal__head\">\n <div class=\"mint-settings-modal__head-text\">\n <h4 class=\"mint-settings-modal__head-title\">\n {{ title }}\n <span v-if=\"count\" class=\"mint-settings-modal__head-count\">{{ count }}</span>\n </h4>\n <p v-if=\"description\" class=\"mint-settings-modal__head-description\">{{ description }}</p>\n </div>\n <button\n v-if=\"modifiedCount !== undefined\"\n type=\"button\"\n class=\"mint-settings-modal__restore-group\"\n :disabled=\"modifiedCount === 0\"\n @click=\"emit('restore')\"\n >\n <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 8a5 5 0 1 0 1.5-3.5M3 3v2.5h2.5\" />\n </svg>\n Restore group defaults\n </button>\n </div>\n</template>\n","import type {\n FormSchema,\n FormSectionSchema,\n SettingsGroup,\n SettingsModalSchema,\n SettingsTab,\n SettingsTabInput,\n} from '../types'\nimport type { AccessControlled } from '../permissions'\nimport { normalizeItemInput } from '../utils/items'\n\nexport const APPEARANCE_TAB_ID = 'appearance'\n\nexport const APPEARANCE_TAB: SettingsTab = {\n id: APPEARANCE_TAB_ID,\n label: 'Appearance',\n // Heroicons \"swatch\" — the built-in tab sits beside plugin tabs that all\n // carry icons, so it needs one of its own to keep the rail consistent.\n icon: '<svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4.098 19.902a3.75 3.75 0 0 0 5.304 0l6.401-6.402M6.75 21A3.75 3.75 0 0 1 3 17.25V4.125C3 3.504 3.504 3 4.125 3h5.25c.621 0 1.125.504 1.125 1.125v4.072M6.75 21a3.75 3.75 0 0 0 3.75-3.75V8.197M6.75 21h13.125c.621 0 1.125-.504 1.125-1.125v-5.25c0-.621-.504-1.125-1.125-1.125h-4.072M10.5 8.197l2.88-2.88c.438-.439 1.15-.439 1.59 0l3.712 3.713c.44.44.44 1.152 0 1.59l-2.879 2.88M6.75 17.25h.008v.008H6.75v-.008Z\"></path></svg>',\n description: 'Theme, color palette, and density',\n}\n\n// Map settings groups onto the form-builder's flat-section shape.\n// `title: ''` because the rail/pane header already shows the group name.\nexport function buildFlatSettingsSchema(schema: SettingsModalSchema): FormSchema {\n return {\n sections: schema.groups.map<FormSectionSchema>((group) => ({\n id: group.id,\n title: '',\n fields: group.fields,\n columns: group.columns,\n condition: group.condition,\n })),\n }\n}\n\nexport function filterSettingsSchemaByAccess(\n schema: SettingsModalSchema,\n canShow: (item: AccessControlled) => boolean\n): SettingsModalSchema {\n const groups = schema.groups.flatMap((group) => {\n if (!canShow(group)) return []\n\n const fields = group.fields.filter(canShow)\n if (fields.length === 0) return []\n\n return [{ ...group, fields }]\n })\n\n return { groups }\n}\n\nexport function settingsGroupToTab(group: SettingsGroup): SettingsTab {\n return {\n id: group.id,\n label: group.label,\n icon: group.icon,\n description: group.description,\n }\n}\n\nexport function normalizeVisibleSettingsTabs(\n tabs: SettingsTabInput[],\n canShow: (item: AccessControlled) => boolean\n): SettingsTab[] {\n return tabs.map(normalizeItemInput).filter(canShow)\n}\n\nexport function buildSettingsTabs(\n baseTabs: SettingsTab[],\n showAppearance: boolean,\n appearanceFirst = false\n): SettingsTab[] {\n if (!showAppearance) return baseTabs\n return appearanceFirst ? [APPEARANCE_TAB, ...baseTabs] : [...baseTabs, APPEARANCE_TAB]\n}\n","<script setup lang=\"ts\">\n/**\n * Tabbed settings modal with three usage modes:\n *\n * 1. Schema-driven (recommended) — pass a `defineControlModel()` result or a\n * `SettingsModalSchema` as `spec`, plus `v-model:values`. Each\n * group/section becomes a tab; fields auto-render via the SDK form field\n * registry (text, select, number, toggle, molecule, concentration, …).\n * Conditional visibility, validation, and dynamic options come for free.\n *\n * 2. Manual tabs + slots — pass `tabs` and a `<template #tab-{id}>` slot\n * per tab. Use this when you need bespoke widgets the form-builder\n * registry doesn't cover (or for legacy plugins).\n *\n * 3. Appearance only — `showAppearance` (default true) renders the built-in\n * theme / palette / table-density tab. Works alongside both modes above.\n *\n * Layout: omitted (default) renders a sidebar rail split into \"Plugin\" and\n * \"Personal\" (Appearance) sections when there are more than three groups, and\n * stacks every group on one page otherwise. `vertical` always uses the rail;\n * `horizontal` keeps the underline tab strip.\n *\n * Schema-driven settings also get a search across groups (label + hint), a\n * modified-from-default marker with a per-row reset for every field with a\n * non-null `defaultValue` (every control model field gets one), and a \"Restore group defaults\" action. Changes\n * apply immediately; the default footer says so and closes with \"Done\".\n *\n * @example Recommended\n * ```vue\n * <SettingsModal v-model:open=\"open\" v-model:values=\"values\" :spec=\"settingsModel\" />\n * ```\n */\nimport { ref, computed, watch } from 'vue'\nimport BaseModal from './BaseModal.vue'\nimport BaseButton from './BaseButton.vue'\nimport BaseInput from './BaseInput.vue'\nimport SegmentedControl from './SegmentedControl.vue'\nimport FormFieldRendererInternal from './internal/FormFieldRendererInternal.vue'\nimport SettingsPaneHeadInternal from './internal/SettingsPaneHeadInternal.vue'\nimport { useFormBuilder } from '../composables/useFormBuilder'\nimport {\n controlsToSettingsSchema,\n isControlModelBinding,\n type ControlModelBinding,\n} from '../composables/useControlSchema'\nimport { useSettingsStore, colorPalettes } from '../stores/settings'\nimport { useAuthStore } from '../stores/auth'\nimport { usePlatform } from '../composables/usePlatform'\nimport { canAccessByPolicy } from '../permissions'\nimport {\n formSchemaFieldNames,\n pickExistingRecordKeys,\n pickRecordKeys,\n recordValuesEqualForKeys,\n valuesEqual,\n} from '../utils/formModelSync'\nimport type {\n ThemeMode,\n ColorPalette,\n TableDensity,\n ModalLayout,\n ModalTab,\n SettingsGroup,\n SettingsTab,\n SettingsTabInput,\n SettingsModalLayout,\n SettingsModalSchema,\n SettingsUserType,\n FormFieldSchema,\n} from '../types'\nimport type { AccessControlled, PermissionUser } from '../permissions'\nimport {\n APPEARANCE_TAB,\n APPEARANCE_TAB_ID,\n buildFlatSettingsSchema,\n buildSettingsTabs,\n filterSettingsSchemaByAccess,\n normalizeVisibleSettingsTabs,\n settingsGroupToTab,\n} from './SettingsModal.schema'\n\ninterface Props {\n open: boolean\n title?: string\n /** Manual tab descriptors. Ignored when `spec` is set (groups become tabs). */\n tabs?: SettingsTabInput[]\n showAppearance?: boolean\n /** List Appearance before the other tabs and open on it. */\n appearanceFirst?: boolean\n size?: 'md' | 'lg' | 'xl'\n layout?: SettingsModalLayout\n /** Control model built with defineControlModel(), or a SettingsModalSchema (e.g. the generated `settingsForm`). Fields auto-render via SDK form components. */\n spec?: ControlModelBinding | SettingsModalSchema\n /** Two-way bound values when `spec` is set. */\n values?: Record<string, unknown>\n /** Optional user type override for permission-filtered settings content. Defaults to SDK auth/platform context. */\n userType?: SettingsUserType\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n title: 'Settings',\n tabs: () => [],\n showAppearance: true,\n size: 'lg',\n layout: undefined,\n spec: undefined,\n})\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean]\n 'update:values': [data: Record<string, unknown>]\n close: []\n}>()\n\nconst settings = useSettingsStore()\nconst auth = useAuthStore()\nconst { user: platformUser, integrated, isAdmin: platformIsAdmin } = usePlatform()\n// With sign-in turned off (`authRequired: false`) every caller of an integrated page is the\n// implicit administrator, and usePlatform reports a page with no user as admin.\nconst implicitPlatformAdmin = computed(() => integrated.value && !platformUser.value && platformIsAdmin.value)\n\nconst resolvedModel = computed<ControlModelBinding | undefined>(() =>\n isControlModelBinding(props.spec) ? props.spec : undefined,\n)\nconst sourceSettingsSchema = computed<SettingsModalSchema | undefined>(() =>\n resolvedModel.value\n ? controlsToSettingsSchema(resolvedModel.value.controls, resolvedModel.value.controlOptions)\n : props.spec as SettingsModalSchema | undefined,\n)\nconst currentAccessUser = computed<PermissionUser | null>(() => {\n if (props.userType) {\n return { role: props.userType === 'admin' ? 'admin' : 'user' }\n }\n return auth.userInfo ?? platformUser.value ?? (implicitPlatformAdmin.value ? { role: 'admin' } : null)\n})\nconst isAccessUserAuthenticated = computed(() =>\n props.userType !== undefined || auth.isAuthenticated || !!platformUser.value || implicitPlatformAdmin.value,\n)\nconst settingsSchema = computed<SettingsModalSchema | undefined>(() => {\n if (!sourceSettingsSchema.value) return undefined\n return filterSettingsSchemaByAccess(sourceSettingsSchema.value, canShowForCurrentUser)\n})\nconst isSchemaDriven = computed(() => !!settingsSchema.value)\nconst resolvedValues = computed<Record<string, unknown>>(() => ({\n ...(resolvedModel.value?.controlOptions.initialValues ?? {}),\n ...(props.values ?? {}),\n}))\n\n// Schema-driven mode keeps one form-builder instance and syncs schema changes\n// into it, so callers can swap groups/fields without remounting the modal.\nconst builder = useFormBuilder(\n settingsSchema.value ? buildFlatSettingsSchema(settingsSchema.value) : { sections: [] },\n resolvedValues.value,\n resolvedModel.value?.controlOptions.enhancements,\n)\n\nwatch(\n () => settingsSchema.value,\n (schema) => {\n if (!schema) {\n builder.updateSchema({ sections: [] }, {})\n return\n }\n\n const flatSchema = buildFlatSettingsSchema(schema)\n const fieldNames = formSchemaFieldNames(flatSchema)\n const sourceValues = props.values === undefined\n ? {\n ...resolvedValues.value,\n ...(builder.form.data as Record<string, unknown>),\n }\n : resolvedValues.value\n\n builder.updateSchema(flatSchema, pickExistingRecordKeys(sourceValues ?? {}, fieldNames))\n },\n { deep: true },\n)\n\nwatch(\n () => ({ ...resolvedValues.value }),\n (data) => {\n if (!settingsSchema.value) return\n const fieldNames = builderFieldNames()\n if (recordValuesEqualForKeys(data, builder.form.data as Record<string, unknown>, fieldNames)) return\n builder.reset(pickRecordKeys(data, fieldNames))\n },\n { deep: true },\n)\n\n// Changes apply immediately; the footer confirms it once the user changed something.\nconst applied = ref(false)\n\nwatch(\n () => ({ ...builder.form.data }),\n (data) => {\n // A reset to the parent's values (async load, schema swap) is not a user change.\n if (!recordValuesEqualForKeys(data, resolvedValues.value, builderFieldNames())) applied.value = true\n if (settingsSchema.value) {\n emit('update:values', {\n ...resolvedValues.value,\n ...data,\n })\n }\n },\n { deep: true },\n)\n\n// Schema groups whose `condition` evaluates false against the current data are\n// dropped from the rail entirely — same semantics as section visibility in\n// FormBuilder. Manual `tabs` have no condition mechanism, so they pass through.\nconst visibleSchemaGroups = computed(() =>\n settingsSchema.value\n ? settingsSchema.value.groups.filter((g) => builder.isSectionVisible(g.id))\n : [],\n)\n\nconst manualTabs = computed<SettingsTab[]>(() =>\n normalizeVisibleSettingsTabs(props.tabs, canShowForCurrentUser)\n)\n\nconst allTabs = computed<SettingsTab[]>(() => {\n const base: SettingsTab[] = settingsSchema.value\n ? visibleSchemaGroups.value.map(settingsGroupToTab)\n : manualTabs.value\n return buildSettingsTabs(base, props.showAppearance, props.appearanceFirst)\n})\n\nconst activeTab = ref(allTabs.value[0]?.id || APPEARANCE_TAB_ID)\n\n/** Above this many plugin groups the default layout switches from one stacked page to the rail. */\nconst STACKED_GROUP_LIMIT = 3\n\n// BaseModal owns the tab chrome: 'vertical' keeps its public name and maps to\n// the shell rail; horizontal maps to the shell strip (plain when single-tab).\nconst baseLayout = computed<ModalLayout>(() => {\n if (props.layout === 'vertical') return 'rail'\n if (props.layout === 'horizontal') return allTabs.value.length > 1 ? 'tabs' : 'plain'\n const pluginTabCount = settingsSchema.value ? visibleSchemaGroups.value.length : manualTabs.value.length\n return pluginTabCount > STACKED_GROUP_LIMIT ? 'rail' : 'plain'\n})\nconst isRail = computed(() => baseLayout.value === 'rail')\nconst isStacked = computed(() => baseLayout.value === 'plain')\n\nconst query = ref('')\nconst searchTerm = computed(() => query.value.trim().toLowerCase())\nconst isSearching = computed(() => isSchemaDriven.value && searchTerm.value !== '')\n\nconst modalTabs = computed<ModalTab[]>(() =>\n allTabs.value.map((tab) => {\n const group = visibleSchemaGroups.value.find((g) => g.id === tab.id)\n const modified = group ? modifiedCount(group) : 0\n return {\n id: tab.id,\n label: tab.label,\n icon: tab.icon,\n description: tab.description,\n meta: group ? (modified ? String(modified) : undefined) : tab.meta,\n // Sections only split plugin groups from Appearance; without it there is nothing to split.\n section: props.showAppearance ? (tab.id === APPEARANCE_TAB_ID ? 'Personal' : tab.section ?? 'Plugin') : undefined,\n }\n }),\n)\n\nfunction selectTab(id: string) {\n activeTab.value = id\n query.value = ''\n}\n\nfunction handleSearchKeydown(event: KeyboardEvent) {\n // First Escape clears the search; the next one closes the modal.\n if (event.key === 'Escape' && query.value) {\n event.stopPropagation()\n query.value = ''\n }\n}\n\n// If the active tab vanishes (group hidden by condition), drop back to the first available.\nwatch(allTabs, (tabs) => {\n if (!tabs.some((t) => t.id === activeTab.value)) {\n activeTab.value = tabs[0]?.id ?? APPEARANCE_TAB_ID\n }\n})\n\nconst activeGroup = computed(() =>\n visibleSchemaGroups.value.find((g) => g.id === activeTab.value),\n)\n\nfunction visibleFields(group: SettingsGroup): FormFieldSchema[] {\n return group.fields.filter((f) => builder.isFieldVisible(f.name))\n}\n\n/**\n * Modified = differs from the field's own `defaultValue`. A field without one, or with a `null`\n * default (a secret, or an optional setting), never is: restoring `null` would clear a stored value.\n */\nfunction isModified(field: FormFieldSchema): boolean {\n return field.defaultValue != null\n && !valuesEqual((builder.form.data as Record<string, unknown>)[field.name], field.defaultValue)\n}\n\nfunction modifiedCount(group: SettingsGroup): number {\n return visibleFields(group).filter(isModified).length\n}\n\nfunction resetField(field: FormFieldSchema) {\n builder.form.setFieldValue(field.name, field.defaultValue)\n}\n\nfunction restoreGroup(group: SettingsGroup | undefined) {\n if (group) visibleFields(group).filter(isModified).forEach(resetField)\n}\n\nfunction isBooleanField(field: FormFieldSchema): boolean {\n return field.type === 'checkbox' || field.type === 'toggle'\n}\n\n/** Booleans are always toggles inside settings rows; their hint is printed under the row, not in a tooltip. */\nfunction settingsField(field: FormFieldSchema): FormFieldSchema {\n return isBooleanField(field) ? { ...field, type: 'toggle', hint: undefined } : field\n}\n\ninterface SettingsRow {\n field: FormFieldSchema\n group: SettingsGroup\n}\n\nconst searchResults = computed<SettingsRow[]>(() => {\n if (!isSearching.value) return []\n return visibleSchemaGroups.value.flatMap((group) =>\n visibleFields(group)\n .filter((field) => [field.label, field.hint, group.label].join(' ').toLowerCase().includes(searchTerm.value))\n .map((field) => ({ field, group })),\n )\n})\n\nconst resultCount = computed(() =>\n `${searchResults.value.length} result${searchResults.value.length === 1 ? '' : 's'}`,\n)\n\n/** What the pane renders: one list of search hits, every group (stacked) or the active group. */\nconst paneSections = computed<{ key: string; group?: SettingsGroup; rows: SettingsRow[] }[]>(() => {\n if (isSearching.value) {\n return searchResults.value.length ? [{ key: 'search', rows: searchResults.value }] : []\n }\n const groups = isStacked.value\n ? visibleSchemaGroups.value\n : activeGroup.value ? [activeGroup.value] : []\n return groups.map((group) => ({\n key: group.id,\n group,\n rows: visibleFields(group).map((field) => ({ field, group })),\n }))\n})\n\nconst themeOptions: { value: ThemeMode; label: string; halves: ('light' | 'dark')[] }[] = [\n { value: 'light', label: 'Light', halves: ['light'] },\n { value: 'dark', label: 'Dark', halves: ['dark'] },\n { value: 'system', label: 'System', halves: ['light', 'dark'] },\n]\n\n/** Five stops along the palette's primary → accent hue arc (shortest way round), as in the board. */\nfunction paletteSwatches(key: ColorPalette): string[] {\n const [from, to] = colorPalettes[key].hues\n const span = ((to - from + 540) % 360) - 180\n const tone = key === 'pastel' ? '60% 72%' : '65% 48%'\n return Array.from({ length: 5 }, (_, i) => `hsl(${Math.round(from + (span * i) / 4)} ${tone})`)\n}\n\nconst densityPreviewRows = [\n ['S-0012', '2.41', '12.5'],\n ['S-0013', '7.90', '3.25'],\n ['S-0014', '10.60', '0.80'],\n]\n\nconst densityOptions: { value: TableDensity; label: string }[] = [\n { value: 'compact', label: 'Compact' },\n { value: 'normal', label: 'Normal' },\n { value: 'comfortable', label: 'Comfortable' },\n]\n\nwatch(\n () => [settings.theme, settings.colorPalette, settings.tableDensity],\n () => { applied.value = true },\n)\n\nfunction handleClose() {\n emit('update:open', false)\n emit('close')\n}\n\nfunction builderFieldNames(): string[] {\n return builder.fields.map(field => field.name)\n}\n\nfunction canShowForCurrentUser(item: AccessControlled): boolean {\n return canAccessByPolicy(\n currentAccessUser.value,\n item.access,\n isAccessUserAuthenticated.value,\n )\n}\n</script>\n\n<template>\n <BaseModal\n :open=\"open\"\n :title=\"title\"\n :size=\"size\"\n :layout=\"baseLayout\"\n :tabs=\"modalTabs\"\n :active-tab=\"isSearching ? '' : activeTab\"\n @update:active-tab=\"selectTab\"\n @update:open=\"emit('update:open', $event)\"\n @close=\"handleClose\"\n >\n <template #header>\n <div class=\"mint-settings-modal__header\">\n <h3 class=\"mint-modal__title\">{{ title }}</h3>\n <div v-if=\"isSchemaDriven\" class=\"mint-settings-modal__search\">\n <svg class=\"mint-settings-modal__search-icon\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"4.5\" /><path d=\"M10.5 10.5L14 14\" />\n </svg>\n <BaseInput\n :model-value=\"query\"\n type=\"search\"\n size=\"sm\"\n placeholder=\"Search settings\"\n aria-label=\"Search settings\"\n @update:model-value=\"query = String($event ?? '')\"\n @keydown=\"handleSearchKeydown\"\n />\n </div>\n </div>\n </template>\n\n <template v-if=\"isRail && isSchemaDriven\" #pane-header=\"{ tab }\">\n <SettingsPaneHeadInternal v-if=\"isSearching\" title=\"Search results\" :count=\"resultCount\" />\n <SettingsPaneHeadInternal\n v-else\n :title=\"tab?.label ?? ''\"\n :description=\"tab?.description\"\n :modified-count=\"activeGroup ? modifiedCount(activeGroup) : undefined\"\n @restore=\"restoreGroup(activeGroup)\"\n />\n </template>\n\n <!-- Body: the active pane only — tab strip / rail / footer are BaseModal's shell. -->\n <div :class=\"['mint-settings-modal', { 'mint-settings-modal--schema': isSchemaDriven }]\">\n <template v-if=\"isSchemaDriven\">\n <SettingsPaneHeadInternal v-if=\"isSearching && !isRail\" title=\"Search results\" :count=\"resultCount\" />\n <section v-for=\"section in paneSections\" :key=\"section.key\" class=\"mint-settings-modal__group\">\n <SettingsPaneHeadInternal\n v-if=\"section.group && !isRail\"\n :title=\"section.group.label\"\n :description=\"section.group.description\"\n :modified-count=\"modifiedCount(section.group)\"\n @restore=\"restoreGroup(section.group)\"\n />\n <div\n class=\"mint-settings-modal__group-grid\"\n :style=\"{ '--mint-settings-cols': section.group?.columns ?? 1 }\"\n >\n <div\n v-for=\"row in section.rows\"\n :key=\"row.field.name\"\n :class=\"['mint-settings-modal__row', { 'mint-settings-modal__row--modified': isModified(row.field) }]\"\n :style=\"row.field.colSpan ? { gridColumn: `span ${row.field.colSpan}` } : undefined\"\n >\n <span v-if=\"!section.group\" class=\"mint-settings-modal__row-group\">{{ row.group.label }}</span>\n <div class=\"mint-settings-modal__row-field\">\n <slot\n :name=\"`field:${row.field.name}`\"\n :field=\"row.field\"\n :form=\"builder.form\"\n :field-props=\"builder.form.getFieldProps(row.field.name)\"\n >\n <FormFieldRendererInternal\n :field=\"settingsField(row.field)\"\n :resolved-props=\"builder.getResolvedFieldProps(settingsField(row.field))\"\n :form=\"builder.form\"\n />\n </slot>\n <p v-if=\"isBooleanField(row.field) && row.field.hint\" class=\"mint-settings-modal__row-hint\">\n {{ row.field.hint }}\n </p>\n <button\n v-if=\"isModified(row.field)\"\n type=\"button\"\n class=\"mint-settings-modal__reset\"\n title=\"Restore default\"\n :aria-label=\"`Restore default for ${row.field.label}`\"\n @click=\"resetField(row.field)\"\n >\n <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 8a5 5 0 1 0 1.5-3.5M3 3v2.5h2.5\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n </section>\n <p v-if=\"isSearching && searchResults.length === 0\" class=\"mint-settings-modal__empty\">\n No settings match \"{{ query.trim() }}\"\n </p>\n </template>\n\n <template v-else>\n <section\n v-for=\"tab in manualTabs\"\n v-show=\"isStacked || activeTab === tab.id\"\n :key=\"tab.id\"\n class=\"mint-settings-modal__group\"\n >\n <SettingsPaneHeadInternal v-if=\"isStacked\" :title=\"tab.label\" :description=\"tab.description\" />\n <slot :name=\"`tab-${tab.id}`\" />\n </section>\n </template>\n\n <section\n v-if=\"showAppearance\"\n v-show=\"!isSearching && (isStacked || activeTab === APPEARANCE_TAB_ID)\"\n class=\"mint-settings-modal__group mint-settings-modal__appearance\"\n >\n <SettingsPaneHeadInternal\n v-if=\"isStacked\"\n :title=\"APPEARANCE_TAB.label\"\n :description=\"APPEARANCE_TAB.description\"\n />\n\n <div class=\"mint-settings-modal__setting\">\n <div class=\"mint-settings-modal__setting-text\">\n <span class=\"mint-settings-modal__setting-label\">Theme</span>\n <span class=\"mint-settings-modal__setting-hint\">Applies to this browser only</span>\n </div>\n <div class=\"mint-settings-modal__themes\">\n <button\n v-for=\"opt in themeOptions\"\n :key=\"opt.value\"\n type=\"button\"\n :aria-pressed=\"settings.theme === opt.value\"\n :class=\"['mint-settings-modal__theme', { 'mint-settings-modal__theme--active': settings.theme === opt.value }]\"\n @click=\"settings.theme = opt.value\"\n >\n <span class=\"mint-settings-modal__theme-preview\" aria-hidden=\"true\">\n <span\n v-for=\"half in opt.halves\"\n :key=\"half\"\n :class=\"['mint-settings-modal__theme-half', `mint-settings-modal__theme-half--${half}`]\"\n >\n <span class=\"mint-settings-modal__theme-line\" />\n <span class=\"mint-settings-modal__theme-card\" />\n </span>\n </span>\n <span class=\"mint-settings-modal__theme-label\">\n <span class=\"mint-settings-modal__theme-radio\" aria-hidden=\"true\" />\n {{ opt.label }}\n </span>\n </button>\n </div>\n </div>\n\n <div class=\"mint-settings-modal__setting\">\n <div class=\"mint-settings-modal__setting-text\">\n <span class=\"mint-settings-modal__setting-label\">Color palette</span>\n <span class=\"mint-settings-modal__setting-hint\">Primary and accent hues across the interface</span>\n </div>\n <div class=\"mint-settings-modal__palettes\">\n <button\n v-for=\"(palette, key) in colorPalettes\"\n :key=\"key\"\n type=\"button\"\n :aria-pressed=\"settings.colorPalette === key\"\n :class=\"['mint-settings-modal__palette', { 'mint-settings-modal__palette--active': settings.colorPalette === key }]\"\n @click=\"settings.colorPalette = key as ColorPalette\"\n >\n <span class=\"mint-settings-modal__swatches\" aria-hidden=\"true\">\n <span\n v-for=\"color in paletteSwatches(key as ColorPalette)\"\n :key=\"color\"\n class=\"mint-settings-modal__swatch\"\n :style=\"{ backgroundColor: color }\"\n />\n </span>\n <span class=\"mint-settings-modal__palette-name\">{{ palette.name }}</span>\n <svg class=\"mint-settings-modal__palette-check\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3.5 8.5l3 3 6-7\" />\n </svg>\n </button>\n </div>\n </div>\n\n <div class=\"mint-settings-modal__setting mint-settings-modal__setting--inline\">\n <div class=\"mint-settings-modal__setting-text\">\n <span class=\"mint-settings-modal__setting-label\">Density</span>\n <span class=\"mint-settings-modal__setting-hint\">Adjusts control and table row height</span>\n </div>\n <SegmentedControl\n :model-value=\"settings.tableDensity\"\n :options=\"densityOptions\"\n size=\"sm\"\n @update:model-value=\"settings.tableDensity = $event as TableDensity\"\n />\n <div\n :class=\"['mint-settings-modal__density-preview', `mint-settings-modal__density-preview--${settings.tableDensity}`]\"\n aria-hidden=\"true\"\n >\n <div class=\"mint-settings-modal__density-row mint-settings-modal__density-row--head\">\n <span>Sample</span><span>RT</span><span>IC50</span>\n </div>\n <div v-for=\"cells in densityPreviewRows\" :key=\"cells[0]\" class=\"mint-settings-modal__density-row\">\n <span>{{ cells[0] }}</span><span>{{ cells[1] }}</span><span>{{ cells[2] }}</span>\n </div>\n </div>\n </div>\n\n <slot name=\"appearance\" />\n </section>\n </div>\n\n <template #footer>\n <slot\n name=\"footer\"\n :values=\"builder.form.data\"\n :close=\"handleClose\"\n >\n <span class=\"mint-settings-modal__status\" role=\"status\">\n <svg v-if=\"applied\" class=\"mint-settings-modal__status-icon\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3.5 8.5l3 3 6-7\" />\n </svg>\n {{ applied ? 'Applied · changes take effect immediately' : 'Changes take effect immediately' }}\n </span>\n <BaseButton class=\"mint-settings-modal__done\" variant=\"primary\" @click=\"handleClose\">Done</BaseButton>\n </slot>\n </template>\n </BaseModal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Tabbed settings modal with three usage modes:\n *\n * 1. Schema-driven (recommended) — pass a `defineControlModel()` result or a\n * `SettingsModalSchema` as `spec`, plus `v-model:values`. Each\n * group/section becomes a tab; fields auto-render via the SDK form field\n * registry (text, select, number, toggle, molecule, concentration, …).\n * Conditional visibility, validation, and dynamic options come for free.\n *\n * 2. Manual tabs + slots — pass `tabs` and a `<template #tab-{id}>` slot\n * per tab. Use this when you need bespoke widgets the form-builder\n * registry doesn't cover (or for legacy plugins).\n *\n * 3. Appearance only — `showAppearance` (default true) renders the built-in\n * theme / palette / table-density tab. Works alongside both modes above.\n *\n * Layout: omitted (default) renders a sidebar rail split into \"Plugin\" and\n * \"Personal\" (Appearance) sections when there are more than three groups, and\n * stacks every group on one page otherwise. `vertical` always uses the rail;\n * `horizontal` keeps the underline tab strip.\n *\n * Schema-driven settings also get a search across groups (label + hint), a\n * modified-from-default marker with a per-row reset for every field with a\n * non-null `defaultValue` (every control model field gets one), and a \"Restore group defaults\" action. Changes\n * apply immediately; the default footer says so and closes with \"Done\".\n *\n * @example Recommended\n * ```vue\n * <SettingsModal v-model:open=\"open\" v-model:values=\"values\" :spec=\"settingsModel\" />\n * ```\n */\nimport { ref, computed, watch } from 'vue'\nimport BaseModal from './BaseModal.vue'\nimport BaseButton from './BaseButton.vue'\nimport BaseInput from './BaseInput.vue'\nimport SegmentedControl from './SegmentedControl.vue'\nimport FormFieldRendererInternal from './internal/FormFieldRendererInternal.vue'\nimport SettingsPaneHeadInternal from './internal/SettingsPaneHeadInternal.vue'\nimport { useFormBuilder } from '../composables/useFormBuilder'\nimport {\n controlsToSettingsSchema,\n isControlModelBinding,\n type ControlModelBinding,\n} from '../composables/useControlSchema'\nimport { useSettingsStore, colorPalettes } from '../stores/settings'\nimport { useAuthStore } from '../stores/auth'\nimport { usePlatform } from '../composables/usePlatform'\nimport { canAccessByPolicy } from '../permissions'\nimport {\n formSchemaFieldNames,\n pickExistingRecordKeys,\n pickRecordKeys,\n recordValuesEqualForKeys,\n valuesEqual,\n} from '../utils/formModelSync'\nimport type {\n ThemeMode,\n ColorPalette,\n TableDensity,\n ModalLayout,\n ModalTab,\n SettingsGroup,\n SettingsTab,\n SettingsTabInput,\n SettingsModalLayout,\n SettingsModalSchema,\n SettingsUserType,\n FormFieldSchema,\n} from '../types'\nimport type { AccessControlled, PermissionUser } from '../permissions'\nimport {\n APPEARANCE_TAB,\n APPEARANCE_TAB_ID,\n buildFlatSettingsSchema,\n buildSettingsTabs,\n filterSettingsSchemaByAccess,\n normalizeVisibleSettingsTabs,\n settingsGroupToTab,\n} from './SettingsModal.schema'\n\ninterface Props {\n open: boolean\n title?: string\n /** Manual tab descriptors. Ignored when `spec` is set (groups become tabs). */\n tabs?: SettingsTabInput[]\n showAppearance?: boolean\n /** List Appearance before the other tabs and open on it. */\n appearanceFirst?: boolean\n size?: 'md' | 'lg' | 'xl'\n layout?: SettingsModalLayout\n /** Control model built with defineControlModel(), or a SettingsModalSchema (e.g. the generated `settingsForm`). Fields auto-render via SDK form components. */\n spec?: ControlModelBinding | SettingsModalSchema\n /** Two-way bound values when `spec` is set. */\n values?: Record<string, unknown>\n /** Optional user type override for permission-filtered settings content. Defaults to SDK auth/platform context. */\n userType?: SettingsUserType\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n title: 'Settings',\n tabs: () => [],\n showAppearance: true,\n size: 'lg',\n layout: undefined,\n spec: undefined,\n})\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean]\n 'update:values': [data: Record<string, unknown>]\n close: []\n}>()\n\nconst settings = useSettingsStore()\nconst auth = useAuthStore()\nconst { user: platformUser, integrated, isAdmin: platformIsAdmin } = usePlatform()\n// With sign-in turned off (`authRequired: false`) every caller of an integrated page is the\n// implicit administrator, and usePlatform reports a page with no user as admin.\nconst implicitPlatformAdmin = computed(() => integrated.value && !platformUser.value && platformIsAdmin.value)\n\nconst resolvedModel = computed<ControlModelBinding | undefined>(() =>\n isControlModelBinding(props.spec) ? props.spec : undefined,\n)\nconst sourceSettingsSchema = computed<SettingsModalSchema | undefined>(() =>\n resolvedModel.value\n ? controlsToSettingsSchema(resolvedModel.value.controls, resolvedModel.value.controlOptions)\n : props.spec as SettingsModalSchema | undefined,\n)\nconst currentAccessUser = computed<PermissionUser | null>(() => {\n if (props.userType) {\n return { role: props.userType === 'admin' ? 'admin' : 'user' }\n }\n return auth.userInfo ?? platformUser.value ?? (implicitPlatformAdmin.value ? { role: 'admin' } : null)\n})\nconst isAccessUserAuthenticated = computed(() =>\n props.userType !== undefined || auth.isAuthenticated || !!platformUser.value || implicitPlatformAdmin.value,\n)\nconst settingsSchema = computed<SettingsModalSchema | undefined>(() => {\n if (!sourceSettingsSchema.value) return undefined\n return filterSettingsSchemaByAccess(sourceSettingsSchema.value, canShowForCurrentUser)\n})\nconst isSchemaDriven = computed(() => !!settingsSchema.value)\nconst resolvedValues = computed<Record<string, unknown>>(() => ({\n ...(resolvedModel.value?.controlOptions.initialValues ?? {}),\n ...(props.values ?? {}),\n}))\n\n// Schema-driven mode keeps one form-builder instance and syncs schema changes\n// into it, so callers can swap groups/fields without remounting the modal.\nconst builder = useFormBuilder(\n settingsSchema.value ? buildFlatSettingsSchema(settingsSchema.value) : { sections: [] },\n resolvedValues.value,\n resolvedModel.value?.controlOptions.enhancements,\n)\n\nwatch(\n () => settingsSchema.value,\n (schema) => {\n if (!schema) {\n builder.updateSchema({ sections: [] }, {})\n return\n }\n\n const flatSchema = buildFlatSettingsSchema(schema)\n const fieldNames = formSchemaFieldNames(flatSchema)\n const sourceValues = props.values === undefined\n ? {\n ...resolvedValues.value,\n ...(builder.form.data as Record<string, unknown>),\n }\n : resolvedValues.value\n\n builder.updateSchema(flatSchema, pickExistingRecordKeys(sourceValues ?? {}, fieldNames))\n },\n { deep: true },\n)\n\nwatch(\n () => ({ ...resolvedValues.value }),\n (data) => {\n if (!settingsSchema.value) return\n const fieldNames = builderFieldNames()\n if (recordValuesEqualForKeys(data, builder.form.data as Record<string, unknown>, fieldNames)) return\n builder.reset(pickRecordKeys(data, fieldNames))\n },\n { deep: true },\n)\n\n// Changes apply immediately; the footer confirms it once the user changed something.\nconst applied = ref(false)\n\nwatch(\n () => ({ ...builder.form.data }),\n (data) => {\n // A reset to the parent's values (async load, schema swap) is not a user change.\n if (!recordValuesEqualForKeys(data, resolvedValues.value, builderFieldNames())) applied.value = true\n if (settingsSchema.value) {\n emit('update:values', {\n ...resolvedValues.value,\n ...data,\n })\n }\n },\n { deep: true },\n)\n\n// Schema groups whose `condition` evaluates false against the current data are\n// dropped from the rail entirely — same semantics as section visibility in\n// FormBuilder. Manual `tabs` have no condition mechanism, so they pass through.\nconst visibleSchemaGroups = computed(() =>\n settingsSchema.value\n ? settingsSchema.value.groups.filter((g) => builder.isSectionVisible(g.id))\n : [],\n)\n\nconst manualTabs = computed<SettingsTab[]>(() =>\n normalizeVisibleSettingsTabs(props.tabs, canShowForCurrentUser)\n)\n\nconst allTabs = computed<SettingsTab[]>(() => {\n const base: SettingsTab[] = settingsSchema.value\n ? visibleSchemaGroups.value.map(settingsGroupToTab)\n : manualTabs.value\n return buildSettingsTabs(base, props.showAppearance, props.appearanceFirst)\n})\n\nconst activeTab = ref(allTabs.value[0]?.id || APPEARANCE_TAB_ID)\n\n/** Above this many plugin groups the default layout switches from one stacked page to the rail. */\nconst STACKED_GROUP_LIMIT = 3\n\n// BaseModal owns the tab chrome: 'vertical' keeps its public name and maps to\n// the shell rail; horizontal maps to the shell strip (plain when single-tab).\nconst baseLayout = computed<ModalLayout>(() => {\n if (props.layout === 'vertical') return 'rail'\n if (props.layout === 'horizontal') return allTabs.value.length > 1 ? 'tabs' : 'plain'\n const pluginTabCount = settingsSchema.value ? visibleSchemaGroups.value.length : manualTabs.value.length\n return pluginTabCount > STACKED_GROUP_LIMIT ? 'rail' : 'plain'\n})\nconst isRail = computed(() => baseLayout.value === 'rail')\nconst isStacked = computed(() => baseLayout.value === 'plain')\n\nconst query = ref('')\nconst searchTerm = computed(() => query.value.trim().toLowerCase())\nconst isSearching = computed(() => isSchemaDriven.value && searchTerm.value !== '')\n\nconst modalTabs = computed<ModalTab[]>(() =>\n allTabs.value.map((tab) => {\n const group = visibleSchemaGroups.value.find((g) => g.id === tab.id)\n const modified = group ? modifiedCount(group) : 0\n return {\n id: tab.id,\n label: tab.label,\n icon: tab.icon,\n description: tab.description,\n meta: group ? (modified ? String(modified) : undefined) : tab.meta,\n // Sections only split plugin groups from Appearance; without it there is nothing to split.\n section: props.showAppearance ? (tab.id === APPEARANCE_TAB_ID ? 'Personal' : tab.section ?? 'Plugin') : undefined,\n }\n }),\n)\n\nfunction selectTab(id: string) {\n activeTab.value = id\n query.value = ''\n}\n\nfunction handleSearchKeydown(event: KeyboardEvent) {\n // First Escape clears the search; the next one closes the modal.\n if (event.key === 'Escape' && query.value) {\n event.stopPropagation()\n query.value = ''\n }\n}\n\n// If the active tab vanishes (group hidden by condition), drop back to the first available.\nwatch(allTabs, (tabs) => {\n if (!tabs.some((t) => t.id === activeTab.value)) {\n activeTab.value = tabs[0]?.id ?? APPEARANCE_TAB_ID\n }\n})\n\nconst activeGroup = computed(() =>\n visibleSchemaGroups.value.find((g) => g.id === activeTab.value),\n)\n\nfunction visibleFields(group: SettingsGroup): FormFieldSchema[] {\n return group.fields.filter((f) => builder.isFieldVisible(f.name))\n}\n\n/**\n * Modified = differs from the field's own `defaultValue`. A field without one, or with a `null`\n * default (a secret, or an optional setting), never is: restoring `null` would clear a stored value.\n */\nfunction isModified(field: FormFieldSchema): boolean {\n return field.defaultValue != null\n && !valuesEqual((builder.form.data as Record<string, unknown>)[field.name], field.defaultValue)\n}\n\nfunction modifiedCount(group: SettingsGroup): number {\n return visibleFields(group).filter(isModified).length\n}\n\nfunction resetField(field: FormFieldSchema) {\n builder.form.setFieldValue(field.name, field.defaultValue)\n}\n\nfunction restoreGroup(group: SettingsGroup | undefined) {\n if (group) visibleFields(group).filter(isModified).forEach(resetField)\n}\n\nfunction isBooleanField(field: FormFieldSchema): boolean {\n return field.type === 'checkbox' || field.type === 'toggle'\n}\n\n/** Booleans are always toggles inside settings rows; their hint is printed under the row, not in a tooltip. */\nfunction settingsField(field: FormFieldSchema): FormFieldSchema {\n return isBooleanField(field) ? { ...field, type: 'toggle', hint: undefined } : field\n}\n\ninterface SettingsRow {\n field: FormFieldSchema\n group: SettingsGroup\n}\n\nconst searchResults = computed<SettingsRow[]>(() => {\n if (!isSearching.value) return []\n return visibleSchemaGroups.value.flatMap((group) =>\n visibleFields(group)\n .filter((field) => [field.label, field.hint, group.label].join(' ').toLowerCase().includes(searchTerm.value))\n .map((field) => ({ field, group })),\n )\n})\n\nconst resultCount = computed(() =>\n `${searchResults.value.length} result${searchResults.value.length === 1 ? '' : 's'}`,\n)\n\n/** What the pane renders: one list of search hits, every group (stacked) or the active group. */\nconst paneSections = computed<{ key: string; group?: SettingsGroup; rows: SettingsRow[] }[]>(() => {\n if (isSearching.value) {\n return searchResults.value.length ? [{ key: 'search', rows: searchResults.value }] : []\n }\n const groups = isStacked.value\n ? visibleSchemaGroups.value\n : activeGroup.value ? [activeGroup.value] : []\n return groups.map((group) => ({\n key: group.id,\n group,\n rows: visibleFields(group).map((field) => ({ field, group })),\n }))\n})\n\nconst themeOptions: { value: ThemeMode; label: string; halves: ('light' | 'dark')[] }[] = [\n { value: 'light', label: 'Light', halves: ['light'] },\n { value: 'dark', label: 'Dark', halves: ['dark'] },\n { value: 'system', label: 'System', halves: ['light', 'dark'] },\n]\n\n/** Five stops along the palette's primary → accent hue arc (shortest way round), as in the board. */\nfunction paletteSwatches(key: ColorPalette): string[] {\n const [from, to] = colorPalettes[key].hues\n const span = ((to - from + 540) % 360) - 180\n const tone = key === 'pastel' ? '60% 72%' : '65% 48%'\n return Array.from({ length: 5 }, (_, i) => `hsl(${Math.round(from + (span * i) / 4)} ${tone})`)\n}\n\nconst densityPreviewRows = [\n ['S-0012', '2.41', '12.5'],\n ['S-0013', '7.90', '3.25'],\n ['S-0014', '10.60', '0.80'],\n]\n\nconst densityOptions: { value: TableDensity; label: string }[] = [\n { value: 'compact', label: 'Compact' },\n { value: 'normal', label: 'Normal' },\n { value: 'comfortable', label: 'Comfortable' },\n]\n\nwatch(\n () => [settings.theme, settings.colorPalette, settings.tableDensity],\n () => { applied.value = true },\n)\n\nfunction handleClose() {\n emit('update:open', false)\n emit('close')\n}\n\nfunction builderFieldNames(): string[] {\n return builder.fields.map(field => field.name)\n}\n\nfunction canShowForCurrentUser(item: AccessControlled): boolean {\n return canAccessByPolicy(\n currentAccessUser.value,\n item.access,\n isAccessUserAuthenticated.value,\n )\n}\n</script>\n\n<template>\n <BaseModal\n :open=\"open\"\n :title=\"title\"\n :size=\"size\"\n :layout=\"baseLayout\"\n :tabs=\"modalTabs\"\n :active-tab=\"isSearching ? '' : activeTab\"\n @update:active-tab=\"selectTab\"\n @update:open=\"emit('update:open', $event)\"\n @close=\"handleClose\"\n >\n <template #header>\n <div class=\"mint-settings-modal__header\">\n <h3 class=\"mint-modal__title\">{{ title }}</h3>\n <div v-if=\"isSchemaDriven\" class=\"mint-settings-modal__search\">\n <svg class=\"mint-settings-modal__search-icon\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"4.5\" /><path d=\"M10.5 10.5L14 14\" />\n </svg>\n <BaseInput\n :model-value=\"query\"\n type=\"search\"\n size=\"sm\"\n placeholder=\"Search settings\"\n aria-label=\"Search settings\"\n @update:model-value=\"query = String($event ?? '')\"\n @keydown=\"handleSearchKeydown\"\n />\n </div>\n </div>\n </template>\n\n <template v-if=\"isRail && isSchemaDriven\" #pane-header=\"{ tab }\">\n <SettingsPaneHeadInternal v-if=\"isSearching\" title=\"Search results\" :count=\"resultCount\" />\n <SettingsPaneHeadInternal\n v-else\n :title=\"tab?.label ?? ''\"\n :description=\"tab?.description\"\n :modified-count=\"activeGroup ? modifiedCount(activeGroup) : undefined\"\n @restore=\"restoreGroup(activeGroup)\"\n />\n </template>\n\n <!-- Body: the active pane only — tab strip / rail / footer are BaseModal's shell. -->\n <div :class=\"['mint-settings-modal', { 'mint-settings-modal--schema': isSchemaDriven }]\">\n <template v-if=\"isSchemaDriven\">\n <SettingsPaneHeadInternal v-if=\"isSearching && !isRail\" title=\"Search results\" :count=\"resultCount\" />\n <section v-for=\"section in paneSections\" :key=\"section.key\" class=\"mint-settings-modal__group\">\n <SettingsPaneHeadInternal\n v-if=\"section.group && !isRail\"\n :title=\"section.group.label\"\n :description=\"section.group.description\"\n :modified-count=\"modifiedCount(section.group)\"\n @restore=\"restoreGroup(section.group)\"\n />\n <div\n class=\"mint-settings-modal__group-grid\"\n :style=\"{ '--mint-settings-cols': section.group?.columns ?? 1 }\"\n >\n <div\n v-for=\"row in section.rows\"\n :key=\"row.field.name\"\n :class=\"['mint-settings-modal__row', { 'mint-settings-modal__row--modified': isModified(row.field) }]\"\n :style=\"row.field.colSpan ? { gridColumn: `span ${row.field.colSpan}` } : undefined\"\n >\n <span v-if=\"!section.group\" class=\"mint-settings-modal__row-group\">{{ row.group.label }}</span>\n <div class=\"mint-settings-modal__row-field\">\n <slot\n :name=\"`field:${row.field.name}`\"\n :field=\"row.field\"\n :form=\"builder.form\"\n :field-props=\"builder.form.getFieldProps(row.field.name)\"\n >\n <FormFieldRendererInternal\n :field=\"settingsField(row.field)\"\n :resolved-props=\"builder.getResolvedFieldProps(settingsField(row.field))\"\n :form=\"builder.form\"\n />\n </slot>\n <p v-if=\"isBooleanField(row.field) && row.field.hint\" class=\"mint-settings-modal__row-hint\">\n {{ row.field.hint }}\n </p>\n <button\n v-if=\"isModified(row.field)\"\n type=\"button\"\n class=\"mint-settings-modal__reset\"\n title=\"Restore default\"\n :aria-label=\"`Restore default for ${row.field.label}`\"\n @click=\"resetField(row.field)\"\n >\n <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 8a5 5 0 1 0 1.5-3.5M3 3v2.5h2.5\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n </section>\n <p v-if=\"isSearching && searchResults.length === 0\" class=\"mint-settings-modal__empty\">\n No settings match \"{{ query.trim() }}\"\n </p>\n </template>\n\n <template v-else>\n <section\n v-for=\"tab in manualTabs\"\n v-show=\"isStacked || activeTab === tab.id\"\n :key=\"tab.id\"\n class=\"mint-settings-modal__group\"\n >\n <SettingsPaneHeadInternal v-if=\"isStacked\" :title=\"tab.label\" :description=\"tab.description\" />\n <slot :name=\"`tab-${tab.id}`\" />\n </section>\n </template>\n\n <section\n v-if=\"showAppearance\"\n v-show=\"!isSearching && (isStacked || activeTab === APPEARANCE_TAB_ID)\"\n class=\"mint-settings-modal__group mint-settings-modal__appearance\"\n >\n <SettingsPaneHeadInternal\n v-if=\"isStacked\"\n :title=\"APPEARANCE_TAB.label\"\n :description=\"APPEARANCE_TAB.description\"\n />\n\n <div class=\"mint-settings-modal__setting\">\n <div class=\"mint-settings-modal__setting-text\">\n <span class=\"mint-settings-modal__setting-label\">Theme</span>\n <span class=\"mint-settings-modal__setting-hint\">Applies to this browser only</span>\n </div>\n <div class=\"mint-settings-modal__themes\">\n <button\n v-for=\"opt in themeOptions\"\n :key=\"opt.value\"\n type=\"button\"\n :aria-pressed=\"settings.theme === opt.value\"\n :class=\"['mint-settings-modal__theme', { 'mint-settings-modal__theme--active': settings.theme === opt.value }]\"\n @click=\"settings.theme = opt.value\"\n >\n <span class=\"mint-settings-modal__theme-preview\" aria-hidden=\"true\">\n <span\n v-for=\"half in opt.halves\"\n :key=\"half\"\n :class=\"['mint-settings-modal__theme-half', `mint-settings-modal__theme-half--${half}`]\"\n >\n <span class=\"mint-settings-modal__theme-line\" />\n <span class=\"mint-settings-modal__theme-card\" />\n </span>\n </span>\n <span class=\"mint-settings-modal__theme-label\">\n <span class=\"mint-settings-modal__theme-radio\" aria-hidden=\"true\" />\n {{ opt.label }}\n </span>\n </button>\n </div>\n </div>\n\n <div class=\"mint-settings-modal__setting\">\n <div class=\"mint-settings-modal__setting-text\">\n <span class=\"mint-settings-modal__setting-label\">Color palette</span>\n <span class=\"mint-settings-modal__setting-hint\">Primary and accent hues across the interface</span>\n </div>\n <div class=\"mint-settings-modal__palettes\">\n <button\n v-for=\"(palette, key) in colorPalettes\"\n :key=\"key\"\n type=\"button\"\n :aria-pressed=\"settings.colorPalette === key\"\n :class=\"['mint-settings-modal__palette', { 'mint-settings-modal__palette--active': settings.colorPalette === key }]\"\n @click=\"settings.colorPalette = key as ColorPalette\"\n >\n <span class=\"mint-settings-modal__swatches\" aria-hidden=\"true\">\n <span\n v-for=\"color in paletteSwatches(key as ColorPalette)\"\n :key=\"color\"\n class=\"mint-settings-modal__swatch\"\n :style=\"{ backgroundColor: color }\"\n />\n </span>\n <span class=\"mint-settings-modal__palette-name\">{{ palette.name }}</span>\n <svg class=\"mint-settings-modal__palette-check\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3.5 8.5l3 3 6-7\" />\n </svg>\n </button>\n </div>\n </div>\n\n <div class=\"mint-settings-modal__setting mint-settings-modal__setting--inline\">\n <div class=\"mint-settings-modal__setting-text\">\n <span class=\"mint-settings-modal__setting-label\">Density</span>\n <span class=\"mint-settings-modal__setting-hint\">Adjusts control and table row height</span>\n </div>\n <SegmentedControl\n :model-value=\"settings.tableDensity\"\n :options=\"densityOptions\"\n size=\"sm\"\n @update:model-value=\"settings.tableDensity = $event as TableDensity\"\n />\n <div\n :class=\"['mint-settings-modal__density-preview', `mint-settings-modal__density-preview--${settings.tableDensity}`]\"\n aria-hidden=\"true\"\n >\n <div class=\"mint-settings-modal__density-row mint-settings-modal__density-row--head\">\n <span>Sample</span><span>RT</span><span>IC50</span>\n </div>\n <div v-for=\"cells in densityPreviewRows\" :key=\"cells[0]\" class=\"mint-settings-modal__density-row\">\n <span>{{ cells[0] }}</span><span>{{ cells[1] }}</span><span>{{ cells[2] }}</span>\n </div>\n </div>\n </div>\n\n <slot name=\"appearance\" />\n </section>\n </div>\n\n <template #footer>\n <slot\n name=\"footer\"\n :values=\"builder.form.data\"\n :close=\"handleClose\"\n >\n <span class=\"mint-settings-modal__status\" role=\"status\">\n <svg v-if=\"applied\" class=\"mint-settings-modal__status-icon\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3.5 8.5l3 3 6-7\" />\n </svg>\n {{ applied ? 'Applied · changes take effect immediately' : 'Changes take effect immediately' }}\n </span>\n <BaseButton class=\"mint-settings-modal__done\" variant=\"primary\" @click=\"handleClose\">Done</BaseButton>\n </slot>\n </template>\n </BaseModal>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"analysisArtifactTypes-Cy3D0Ipg.js","names":[],"sources":["../src/types/analysisArtifactTypes.ts"],"sourcesContent":["import type { TreeNode } from './componentLabTypes'\nimport type { SummaryData } from './componentWorkflowTypes'\n\n/** Result schema identifier for file-backed analysis artifacts. */\nexport const ANALYSIS_FILE_ARTIFACT_SCHEMA = 'mint.analysis_file.v1'\n\n/** Known artifact lifecycle states; kept open for forward compatibility. */\nexport type AnalysisArtifactStatus = 'active' | 'archived' | (string & {})\n\n/** Status filter vocabulary for artifact lists. */\nexport type AnalysisArtifactStatusFilter = 'active' | 'archived' | 'all'\n\n/** Summary row returned by GET /experiments/{id}/analysis-artifacts. */\nexport interface AnalysisArtifactSummary {\n id: number\n experiment_id: number\n plugin_id: string\n artifact_key: string\n display_name: string\n note?: string | null\n status: AnalysisArtifactStatus\n result_keys: string[]\n created_at?: string | null\n updated_at?: string | null\n archived_at?: string | null\n archived_by?: number | null\n}\n\n/** Full artifact returned by GET /experiments/{id}/analysis-artifacts/{artifactId}. */\nexport interface AnalysisArtifactDetail extends AnalysisArtifactSummary {\n result: Record<string, unknown>\n tree: TreeNode[]\n summary: SummaryData | null\n}\n\n/** Response of GET /experiments/{id}/analysis-artifacts. */\nexport interface AnalysisArtifactListResponse {\n artifacts: AnalysisArtifactSummary[]\n}\n\n/** Stable identity used when one plugin opens another plugin's artifact. */\nexport interface AnalysisArtifactTarget {\n experimentId: number\n artifactPluginId: string\n artifactKey: string\n /** Optional lookup hint. The stable identity remains the three fields above. */\n artifactId?: number\n}\n\n/** Body of PATCH /experiments/{id}/analysis-artifacts/{artifactId}. */\nexport interface AnalysisArtifactMetadataUpdate {\n display_name?: string\n /** undefined = keep, string = set, null = clear. */\n note?: string | null\n}\n\n/** How a save payload should be applied by the plugin backend. */\nexport type ArtifactSaveMode = 'create' | 'upsert' | 'update'\n\n/** Where file content comes from when a plugin uses ArtifactSaveDialog. */\nexport type ArtifactFileSource = 'upload' | 'handler'\n\ninterface ArtifactSavePayloadBase {\n experimentId: number\n artifactKey: string\n}\n\n/**\n * JSON artifact save — handler maps to save_analysis_artifact, which upserts by key.\n * That call only assigns display_name/note when they are provided, and cannot clear\n * either; use the metadata PATCH (useAnalysisArtifacts.updateMetadata) for that.\n */\nexport interface JsonArtifactSavePayload extends ArtifactSavePayloadBase {\n kind: 'json'\n mode: 'create' | 'upsert'\n result: Record<string, unknown>\n displayName?: string\n note?: string\n}\n\n/** File artifact create — handler maps to save_analysis_file_artifact (create-only: a reused key conflicts). */\nexport interface FileArtifactCreatePayload extends ArtifactSavePayloadBase {\n kind: 'file'\n mode: 'create'\n file: File\n /** Maps to the Python `kind=` argument (defaults to \"file\" backend-side). */\n fileKind: string\n filename?: string\n displayName?: string\n note?: string\n contentType?: string\n metadata?: Record<string, unknown>\n}\n\n/**\n * File artifact replacement — handler maps to update_analysis_file_artifact\n * (transactional CAS replace). `kind` and `filename` are immutable backend-side, so\n * `fileKind` echoes the artifact's existing kind and no filename is carried. `note`\n * is three-state: omitted preserves, null clears, a string sets. `metadata` REPLACES\n * the previous result metadata rather than merging, so it always carries the full\n * intended map — omitting it clears whatever was there.\n */\nexport interface FileArtifactUpdatePayload extends ArtifactSavePayloadBase {\n kind: 'file'\n mode: 'update'\n file: File\n fileKind: string\n note?: string | null\n contentType?: string\n metadata?: Record<string, unknown>\n}\n\n/**\n * File artifact create where the plugin handler produces the bytes itself.\n * This is intended for server-side serialization of in-memory analysis state;\n * the browser neither fabricates nor uploads a placeholder File.\n */\nexport interface HandlerFileArtifactCreatePayload extends ArtifactSavePayloadBase {\n kind: 'file'\n mode: 'create'\n source: 'handler'\n fileKind: string\n displayName?: string\n note?: string\n metadata?: Record<string, unknown>\n}\n\n/** File artifact replacement where the plugin handler produces the bytes itself. */\nexport interface HandlerFileArtifactUpdatePayload extends ArtifactSavePayloadBase {\n kind: 'file'\n mode: 'update'\n source: 'handler'\n fileKind: string\n note?: string | null\n metadata?: Record<string, unknown>\n}\n\nexport type ArtifactSavePayload =\n | JsonArtifactSavePayload\n | FileArtifactCreatePayload\n | FileArtifactUpdatePayload\n\n/** Payloads accepted when `ArtifactSaveDialog.fileSource` is `handler`. */\nexport type HandlerArtifactSavePayload =\n | JsonArtifactSavePayload\n | HandlerFileArtifactCreatePayload\n | HandlerFileArtifactUpdatePayload\n\n/** Every payload variant the dialog can emit across both file sources. */\nexport type ArtifactSaveDialogPayload =\n | ArtifactSavePayload\n | HandlerFileArtifactCreatePayload\n | HandlerFileArtifactUpdatePayload\n\n/** Optional handler result; cleanupPending surfaces AnalysisFileArtifactUpdate.cleanup_pending. */\nexport interface ArtifactSaveResult {\n artifact?: AnalysisArtifactSummary\n cleanupPending?: boolean\n}\n\n/**\n * Plugin-supplied save handler. The dialog never writes to the platform;\n * the handler forwards the payload to the plugin backend, which calls\n * save_analysis_artifact / save_analysis_file_artifact / update_analysis_file_artifact.\n */\nexport type ArtifactSaveHandler = (\n payload: ArtifactSavePayload,\n) => Promise<ArtifactSaveResult | void>\n\n/** Save handler paired with `ArtifactSaveDialog.fileSource=\"handler\"`. */\nexport type HandlerArtifactSaveHandler = (\n payload: HandlerArtifactSavePayload,\n) => Promise<ArtifactSaveResult | void>\n\n/** Handler accepted by ArtifactSaveDialog; `fileSource` selects the payload family. */\nexport type ArtifactSaveDialogHandler = ArtifactSaveHandler | HandlerArtifactSaveHandler\n"],"mappings":";;AAIA,IAAa,gCAAgC"}
1
+ {"version":3,"file":"analysisArtifactTypes-Cy3D0Ipg.js","names":[],"sources":["../src/types/analysisArtifactTypes.ts"],"sourcesContent":["import type { TreeNode } from './componentLabTypes'\nimport type { SummaryData } from './componentWorkflowTypes'\n\n/** Result schema identifier for file-backed analysis artifacts. */\nexport const ANALYSIS_FILE_ARTIFACT_SCHEMA = 'mint.analysis_file.v1'\n\n/** Known artifact lifecycle states; kept open for forward compatibility. */\nexport type AnalysisArtifactStatus = 'active' | 'archived' | (string & {})\n\n/** Status filter vocabulary for artifact lists. */\nexport type AnalysisArtifactStatusFilter = 'active' | 'archived' | 'all'\n\n/** Summary row returned by GET /experiments/{id}/analysis-artifacts. */\nexport interface AnalysisArtifactSummary {\n id: number\n experiment_id: number\n plugin_id: string\n artifact_key: string\n display_name: string\n note?: string | null\n status: AnalysisArtifactStatus\n result_keys: string[]\n created_at?: string | null\n updated_at?: string | null\n archived_at?: string | null\n archived_by?: number | null\n}\n\n/** Full artifact returned by GET /experiments/{id}/analysis-artifacts/{artifactId}. */\nexport interface AnalysisArtifactDetail extends AnalysisArtifactSummary {\n result: Record<string, unknown>\n tree: TreeNode[]\n summary: SummaryData | null\n}\n\n/** Response of GET /experiments/{id}/analysis-artifacts. */\nexport interface AnalysisArtifactListResponse {\n artifacts: AnalysisArtifactSummary[]\n}\n\n/** Stable identity used when one plugin opens another plugin's artifact. */\nexport interface AnalysisArtifactTarget {\n experimentId: number\n artifactPluginId: string\n artifactKey: string\n /** Optional lookup hint. The stable identity remains the three fields above. */\n artifactId?: number\n}\n\n/** Body of PATCH /experiments/{id}/analysis-artifacts/{artifactId}. */\nexport interface AnalysisArtifactMetadataUpdate {\n display_name?: string\n /** undefined = keep, string = set, null = clear. */\n note?: string | null\n}\n\n/** How a save payload should be applied by the plugin backend. */\nexport type ArtifactSaveMode = 'create' | 'upsert' | 'update'\n\n/** Where file content comes from when a plugin uses ArtifactSaveDialog. */\nexport type ArtifactFileSource = 'upload' | 'handler'\n\ninterface ArtifactSavePayloadBase {\n experimentId: number\n artifactKey: string\n}\n\n/**\n * JSON artifact save — handler maps to save_analysis_artifact, which upserts by key.\n * That call only assigns display_name/note when they are provided, and cannot clear\n * either; use the metadata PATCH (useArtifacts.updateMetadata) for that.\n */\nexport interface JsonArtifactSavePayload extends ArtifactSavePayloadBase {\n kind: 'json'\n mode: 'create' | 'upsert'\n result: Record<string, unknown>\n displayName?: string\n note?: string\n}\n\n/** File artifact create — handler maps to save_analysis_file_artifact (create-only: a reused key conflicts). */\nexport interface FileArtifactCreatePayload extends ArtifactSavePayloadBase {\n kind: 'file'\n mode: 'create'\n file: File\n /** Maps to the Python `kind=` argument (defaults to \"file\" backend-side). */\n fileKind: string\n filename?: string\n displayName?: string\n note?: string\n contentType?: string\n metadata?: Record<string, unknown>\n}\n\n/**\n * File artifact replacement — handler maps to update_analysis_file_artifact\n * (transactional CAS replace). `kind` and `filename` are immutable backend-side, so\n * `fileKind` echoes the artifact's existing kind and no filename is carried. `note`\n * is three-state: omitted preserves, null clears, a string sets. `metadata` REPLACES\n * the previous result metadata rather than merging, so it always carries the full\n * intended map — omitting it clears whatever was there.\n */\nexport interface FileArtifactUpdatePayload extends ArtifactSavePayloadBase {\n kind: 'file'\n mode: 'update'\n file: File\n fileKind: string\n note?: string | null\n contentType?: string\n metadata?: Record<string, unknown>\n}\n\n/**\n * File artifact create where the plugin handler produces the bytes itself.\n * This is intended for server-side serialization of in-memory analysis state;\n * the browser neither fabricates nor uploads a placeholder File.\n */\nexport interface HandlerFileArtifactCreatePayload extends ArtifactSavePayloadBase {\n kind: 'file'\n mode: 'create'\n source: 'handler'\n fileKind: string\n displayName?: string\n note?: string\n metadata?: Record<string, unknown>\n}\n\n/** File artifact replacement where the plugin handler produces the bytes itself. */\nexport interface HandlerFileArtifactUpdatePayload extends ArtifactSavePayloadBase {\n kind: 'file'\n mode: 'update'\n source: 'handler'\n fileKind: string\n note?: string | null\n metadata?: Record<string, unknown>\n}\n\nexport type ArtifactSavePayload =\n | JsonArtifactSavePayload\n | FileArtifactCreatePayload\n | FileArtifactUpdatePayload\n\n/** Payloads accepted when `ArtifactSaveDialog.fileSource` is `handler`. */\nexport type HandlerArtifactSavePayload =\n | JsonArtifactSavePayload\n | HandlerFileArtifactCreatePayload\n | HandlerFileArtifactUpdatePayload\n\n/** Every payload variant the dialog can emit across both file sources. */\nexport type ArtifactSaveDialogPayload =\n | ArtifactSavePayload\n | HandlerFileArtifactCreatePayload\n | HandlerFileArtifactUpdatePayload\n\n/** Optional handler result; cleanupPending surfaces AnalysisFileArtifactUpdate.cleanup_pending. */\nexport interface ArtifactSaveResult {\n artifact?: AnalysisArtifactSummary\n cleanupPending?: boolean\n}\n\n/**\n * Plugin-supplied save handler. The dialog never writes to the platform;\n * the handler forwards the payload to the plugin backend, which calls\n * save_analysis_artifact / save_analysis_file_artifact / update_analysis_file_artifact.\n */\nexport type ArtifactSaveHandler = (\n payload: ArtifactSavePayload,\n) => Promise<ArtifactSaveResult | void>\n\n/** Save handler paired with `ArtifactSaveDialog.fileSource=\"handler\"`. */\nexport type HandlerArtifactSaveHandler = (\n payload: HandlerArtifactSavePayload,\n) => Promise<ArtifactSaveResult | void>\n\n/** Handler accepted by ArtifactSaveDialog; `fileSource` selects the payload family. */\nexport type ArtifactSaveDialogHandler = ArtifactSaveHandler | HandlerArtifactSaveHandler\n"],"mappings":";;AAIA,IAAa,gCAAgC"}
@@ -0,0 +1,65 @@
1
+ import { computed, ref } from "vue";
2
+ import { defineStore } from "pinia";
3
+ //#region src/stores/auth.ts
4
+ /** localStorage key of the platform session token. The platform owns the stored value. */
5
+ var AUTH_TOKEN_STORAGE_KEY = "mint-auth-token";
6
+ /** localStorage key of the platform session token expiry (ISO 8601). */
7
+ var AUTH_EXPIRES_STORAGE_KEY = "mint-auth-expires";
8
+ function readStoredItem(key) {
9
+ try {
10
+ const storage = globalThis.localStorage;
11
+ return typeof storage?.getItem === "function" ? storage.getItem(key) : null;
12
+ } catch {
13
+ return null;
14
+ }
15
+ }
16
+ /**
17
+ * Read-only session bridge between the platform and SDK code.
18
+ *
19
+ * SDK clients read the session token from here. Only the platform writes the
20
+ * session, through `@morscherlab/mint-sdk/host`. The SDK never writes or removes
21
+ * the stored platform token.
22
+ */
23
+ var useAuthStore = defineStore("mint-auth", () => {
24
+ const token = ref(null);
25
+ const tokenExpires = ref(null);
26
+ const userInfo = ref(null);
27
+ const authRequired = ref(true);
28
+ const isInitialized = ref(false);
29
+ const isAuthenticated = computed(() => {
30
+ if (!authRequired.value) return true;
31
+ if (!token.value) return false;
32
+ return !(tokenExpires.value && tokenExpires.value < /* @__PURE__ */ new Date());
33
+ });
34
+ /** Read the stored platform session token, once per page. */
35
+ function initialize() {
36
+ const storedToken = readStoredItem(AUTH_TOKEN_STORAGE_KEY);
37
+ const storedExpires = readStoredItem(AUTH_EXPIRES_STORAGE_KEY);
38
+ const expires = storedExpires ? new Date(storedExpires) : null;
39
+ if (storedToken && !(expires && expires <= /* @__PURE__ */ new Date())) {
40
+ token.value = storedToken;
41
+ tokenExpires.value = expires;
42
+ }
43
+ isInitialized.value = true;
44
+ }
45
+ /** Forget the session in memory after the server rejected its token. */
46
+ function clearToken() {
47
+ token.value = null;
48
+ tokenExpires.value = null;
49
+ userInfo.value = null;
50
+ }
51
+ return {
52
+ token,
53
+ tokenExpires,
54
+ userInfo,
55
+ authRequired,
56
+ isInitialized,
57
+ isAuthenticated,
58
+ initialize,
59
+ clearToken
60
+ };
61
+ });
62
+ //#endregion
63
+ export { AUTH_TOKEN_STORAGE_KEY as n, useAuthStore as r, AUTH_EXPIRES_STORAGE_KEY as t };
64
+
65
+ //# sourceMappingURL=auth-SliLnFre.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-SliLnFre.js","names":[],"sources":["../src/stores/auth.ts"],"sourcesContent":["import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport type { UserInfo } from '../types'\n\n/** localStorage key of the platform session token. The platform owns the stored value. */\nexport const AUTH_TOKEN_STORAGE_KEY = 'mint-auth-token'\n/** localStorage key of the platform session token expiry (ISO 8601). */\nexport const AUTH_EXPIRES_STORAGE_KEY = 'mint-auth-expires'\n\nfunction readStoredItem(key: string): string | null {\n try {\n const storage = globalThis.localStorage\n return typeof storage?.getItem === 'function' ? storage.getItem(key) : null\n } catch {\n return null\n }\n}\n\n/**\n * Read-only session bridge between the platform and SDK code.\n *\n * SDK clients read the session token from here. Only the platform writes the\n * session, through `@morscherlab/mint-sdk/host`. The SDK never writes or removes\n * the stored platform token.\n */\nexport const useAuthStore = defineStore('mint-auth', () => {\n const token = ref<string | null>(null)\n const tokenExpires = ref<Date | null>(null)\n const userInfo = ref<UserInfo | null>(null)\n const authRequired = ref(true)\n const isInitialized = ref(false)\n\n const isAuthenticated = computed(() => {\n if (!authRequired.value) return true\n if (!token.value) return false\n return !(tokenExpires.value && tokenExpires.value < new Date())\n })\n\n /** Read the stored platform session token, once per page. */\n function initialize() {\n const storedToken = readStoredItem(AUTH_TOKEN_STORAGE_KEY)\n const storedExpires = readStoredItem(AUTH_EXPIRES_STORAGE_KEY)\n const expires = storedExpires ? new Date(storedExpires) : null\n\n if (storedToken && !(expires && expires <= new Date())) {\n token.value = storedToken\n tokenExpires.value = expires\n }\n\n isInitialized.value = true\n }\n\n /** Forget the session in memory after the server rejected its token. */\n function clearToken() {\n token.value = null\n tokenExpires.value = null\n userInfo.value = null\n }\n\n return {\n token,\n tokenExpires,\n userInfo,\n authRequired,\n isInitialized,\n isAuthenticated,\n initialize,\n clearToken,\n }\n})\n"],"mappings":";;;;AAKA,IAAa,yBAAyB;;AAEtC,IAAa,2BAA2B;AAExC,SAAS,eAAe,KAA4B;CAClD,IAAI;EACF,MAAM,UAAU,WAAW;EAC3B,OAAO,OAAO,SAAS,YAAY,aAAa,QAAQ,QAAQ,GAAG,IAAI;CACzE,QAAQ;EACN,OAAO;CACT;AACF;;;;;;;;AASA,IAAa,eAAe,YAAY,mBAAmB;CACzD,MAAM,QAAQ,IAAmB,IAAI;CACrC,MAAM,eAAe,IAAiB,IAAI;CAC1C,MAAM,WAAW,IAAqB,IAAI;CAC1C,MAAM,eAAe,IAAI,IAAI;CAC7B,MAAM,gBAAgB,IAAI,KAAK;CAE/B,MAAM,kBAAkB,eAAe;EACrC,IAAI,CAAC,aAAa,OAAO,OAAO;EAChC,IAAI,CAAC,MAAM,OAAO,OAAO;EACzB,OAAO,EAAE,aAAa,SAAS,aAAa,wBAAQ,IAAI,KAAK;CAC/D,CAAC;;CAGD,SAAS,aAAa;EACpB,MAAM,cAAc,eAAe,sBAAsB;EACzD,MAAM,gBAAgB,eAAe,wBAAwB;EAC7D,MAAM,UAAU,gBAAgB,IAAI,KAAK,aAAa,IAAI;EAE1D,IAAI,eAAe,EAAE,WAAW,2BAAW,IAAI,KAAK,IAAI;GACtD,MAAM,QAAQ;GACd,aAAa,QAAQ;EACvB;EAEA,cAAc,QAAQ;CACxB;;CAGA,SAAS,aAAa;EACpB,MAAM,QAAQ;EACd,aAAa,QAAQ;EACrB,SAAS,QAAQ;CACnB;CAEA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF,CAAC"}
@@ -5,7 +5,7 @@ interface Props {
5
5
  disabled?: boolean;
6
6
  }
7
7
  type __VLS_Slots = {
8
- /** Replaces the ellipsis IconButton; `toggle` and `keydown` go on the slotted button. */
8
+ /** Replaces the ellipsis button; `toggle` and `keydown` go on the slotted button. */
9
9
  trigger?: (props: {
10
10
  open: boolean;
11
11
  toggle: () => void;
@@ -11,8 +11,8 @@ declare const __VLS_export: import('vue').DefineComponent<Props, {}, {}, {}, {},
11
11
  value: string | null;
12
12
  variant: "inline" | "badge";
13
13
  font: "mono" | "sans";
14
- emptyText: string;
15
14
  tone: "default" | "on-primary" | "muted";
15
+ emptyText: string;
16
16
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLSpanElement>;
17
17
  declare const _default: typeof __VLS_export;
18
18
  export default _default;
@@ -1,6 +1,6 @@
1
- import { AlertType } from '../types';
1
+ import { Tone } from '../types';
2
2
  interface Props {
3
- type?: AlertType;
3
+ tone?: Tone;
4
4
  title?: string;
5
5
  dismissible?: boolean;
6
6
  actionLabel?: string;
@@ -18,7 +18,7 @@ declare const __VLS_base: import('vue').DefineComponent<Props, {}, {}, {}, {}, i
18
18
  onAction?: (() => any) | undefined;
19
19
  onDismiss?: (() => any) | undefined;
20
20
  }>, {
21
- type: AlertType;
21
+ tone: Tone;
22
22
  dismissible: boolean;
23
23
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
24
24
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -11,8 +11,8 @@ type __VLS_Slots = {} & {
11
11
  default?: (props: typeof __VLS_1) => any;
12
12
  };
13
13
  declare const __VLS_base: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<Props> & Readonly<{}>, {
14
- gap: string;
15
14
  scrollable: boolean;
15
+ gap: string;
16
16
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
17
17
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
18
18
  declare const _default: typeof __VLS_export;
@@ -1,75 +1,21 @@
1
- import { PillNavItem, SidebarToolSection } from '../types';
2
- import { FormEnhancements, FormSchema } from '../types/form-builder';
3
- import { ControlModel, ControlModelBinding, ControlSchema, ControlWorkspaceOptions } from '../composables/useControlSchema';
1
+ import { PluginWorkspaceSidebarSpec, SidebarToolSection } from '../types';
4
2
  interface Props {
5
- /** Optional chrome title rendered above generated sections. */
6
- title?: string;
7
- /** Optional secondary chrome copy rendered below title. */
8
- subtitle?: string;
9
- /** Optional compact badge/count rendered in the chrome header. */
10
- badge?: string | number;
11
- /** Map of view IDs to their tool sections */
12
- panels?: Record<string, SidebarToolSection[]>;
3
+ /** Structure: header, sections, forms, width, side, collapse. Optional: every option has a default. */
4
+ spec?: PluginWorkspaceSidebarSpec;
13
5
  /** Which view's panels to display. Defaults to the first non-empty panel view. */
14
6
  activeView?: string;
15
- /** Floating shell with absolute positioning. Prefer letting `AppLayout` own this; it stays for standalone use. */
16
- floating?: boolean;
17
- /** Section density. `compact` (default) is the 36px header row; `comfortable` restores the roomier spacing. */
18
- density?: 'compact' | 'comfortable';
19
- /** @deprecated Compact is now the default; removed in MINT 1.4. Pass `density="comfortable"` for the roomier layout. */
20
- dense?: boolean;
21
- /** Width when visible. */
22
- width?: string;
23
- /** Position sidebar on left or right side */
24
- side?: 'left' | 'right';
25
- /** Toggle state map: sectionId → boolean */
26
- toggleState?: Record<string, boolean>;
27
- /** Optional FormBuilder schemas keyed by section ID. Used when no section slot is provided. */
28
- forms?: Record<string, FormSchema>;
29
- /** Generated view IDs from useControlSchema(). Consumed for clean v-bind ergonomics. */
30
- viewIds?: string[];
31
- /** Generated AppTopBar pillNav-compatible view items from useControlSchema(). Consumed for clean v-bind ergonomics. */
32
- viewItems?: PillNavItem[];
33
- /** Default view ID used when activeView is omitted. */
34
- defaultView?: string;
35
- /** Model returned by defineControlModel(), or a raw nested ControlModel for one-step sidebar/form generation. */
36
- model?: ControlModel | ControlModelBinding;
37
- /** Compact control schema. When provided, AppSidebar generates panels, section forms, and default values. */
38
- controls?: ControlSchema;
39
- /** Options passed to compact control schema generation, including shared initialValues. */
40
- controlOptions?: ControlWorkspaceOptions;
41
- /** DOM id for the scrollable content area. Use with Teleport when route/tab children own sidebar controls. */
42
- contentId?: string;
43
- /** Render the sidebar shell even when no panel matches the active view. Useful for default-slot or Teleport-driven sidebars. */
44
- showWhenEmpty?: boolean;
45
- /** Shared values for auto-rendered section forms. Supports default v-model. */
46
- modelValue?: Record<string, unknown>;
47
- /** Shared values for auto-rendered section forms */
7
+ /** Values of the section forms. Bind with `v-model:values`. */
48
8
  values?: Record<string, unknown>;
49
- /** Runtime FormBuilder enhancements for auto-rendered section forms */
50
- formEnhancements?: FormEnhancements<Record<string, unknown>>;
51
- /** Show submit/cancel actions inside auto-rendered section forms */
52
- showFormActions?: boolean;
53
- /** Loading/saving state for auto-rendered section forms */
9
+ /** Collapsed state. Bind with `v-model:collapsed`; unbound, the sidebar keeps its own. */
10
+ collapsed?: boolean;
11
+ /** On / off state of the section toggles, keyed by section id. */
12
+ toggleState?: Record<string, boolean>;
13
+ /** Loading / saving state of the section forms. */
54
14
  formLoading?: boolean;
55
- /** Disabled state for auto-rendered section forms */
15
+ /** Disabled state of the section forms. */
56
16
  formDisabled?: boolean;
57
- /** Readonly state for auto-rendered section forms */
17
+ /** Readonly state of the section forms. */
58
18
  formReadonly?: boolean;
59
- /** Size passed to auto-rendered section forms */
60
- formSize?: 'sm' | 'md' | 'lg';
61
- /** Show a built-in collapse/expand button in the sidebar chrome. */
62
- collapsible?: boolean;
63
- /** Controlled collapsed state. */
64
- collapsed?: boolean;
65
- /** Initial collapsed state when collapsed is uncontrolled. */
66
- defaultCollapsed?: boolean;
67
- /** Width when collapsed. */
68
- collapsedWidth?: string;
69
- /** Accessible label for the collapse action. */
70
- collapseButtonLabel?: string;
71
- /** Accessible label for the expand action. */
72
- expandButtonLabel?: string;
73
19
  }
74
20
  declare function toggleCollapsed(): void;
75
21
  declare function expandCollapsed(): void;
@@ -98,54 +44,28 @@ type __VLS_Slots = {} & {
98
44
  'collapsed-footer'?: (props: typeof __VLS_28) => any;
99
45
  };
100
46
  declare const __VLS_base: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
101
- "update:modelValue": (values: Record<string, unknown>) => any;
102
47
  "update:values": (values: Record<string, unknown>) => any;
103
48
  "update:toggle": (sectionId: string, value: boolean) => any;
104
- "update:collapsed": (value: boolean) => any;
105
49
  "section-action": (sectionId: string, actionId: string) => any;
106
50
  "form-submit": (sectionId: string, values: Record<string, unknown>) => any;
107
51
  "form-cancel": (sectionId: string) => any;
52
+ "update:collapsed": (value: boolean) => any;
108
53
  }, string, import('vue').PublicProps, Readonly<Props> & Readonly<{
109
- "onUpdate:modelValue"?: ((values: Record<string, unknown>) => any) | undefined;
110
54
  "onUpdate:values"?: ((values: Record<string, unknown>) => any) | undefined;
111
55
  "onUpdate:toggle"?: ((sectionId: string, value: boolean) => any) | undefined;
112
- "onUpdate:collapsed"?: ((value: boolean) => any) | undefined;
113
56
  "onSection-action"?: ((sectionId: string, actionId: string) => any) | undefined;
114
57
  "onForm-submit"?: ((sectionId: string, values: Record<string, unknown>) => any) | undefined;
115
58
  "onForm-cancel"?: ((sectionId: string) => any) | undefined;
59
+ "onUpdate:collapsed"?: ((value: boolean) => any) | undefined;
116
60
  }>, {
117
61
  values: Record<string, unknown>;
118
- modelValue: Record<string, unknown>;
119
- title: string;
120
- width: string;
121
- floating: boolean;
122
- density: "compact" | "comfortable";
123
- subtitle: string;
124
- collapsed: boolean;
125
- badge: string | number;
126
- controlOptions: ControlWorkspaceOptions;
127
- model: ControlModel | ControlModelBinding;
128
- viewIds: string[];
129
- viewItems: PillNavItem[];
130
- defaultView: string;
62
+ spec: PluginWorkspaceSidebarSpec;
131
63
  activeView: string;
132
- panels: Record<string, SidebarToolSection[]>;
133
- forms: Record<string, FormSchema>;
134
- dense: boolean;
135
- collapsible: boolean;
136
- side: "left" | "right";
64
+ collapsed: boolean;
137
65
  toggleState: Record<string, boolean>;
138
- contentId: string;
139
- showWhenEmpty: boolean;
140
- showFormActions: boolean;
141
66
  formLoading: boolean;
142
67
  formDisabled: boolean;
143
68
  formReadonly: boolean;
144
- formSize: "sm" | "md" | "lg";
145
- defaultCollapsed: boolean;
146
- collapsedWidth: string;
147
- collapseButtonLabel: string;
148
- expandButtonLabel: string;
149
69
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLElement>;
150
70
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
151
71
  declare const _default: typeof __VLS_export;
@@ -1,61 +1,25 @@
1
- import { PillNavOption, TopBarSettingsConfig, TopBarVariant, PillNavItem, PillNavItemInput, PageSelectorItem, PageSelectorItemInput, AccountMenuItem } from '../types/components';
1
+ import { PillNavOption, PillNavItem, PageSelectorItem, PageSelectorItemInput, PluginWorkspaceTopBarSpec } from '../types/components';
2
2
  interface Props {
3
3
  /** App or plugin title shown in the left title group when no page selector is present. */
4
4
  title?: string;
5
5
  /** Secondary title copy shown under the title in title-group layouts. */
6
6
  subtitle?: string;
7
- /** Show the default MINT logo when the icon/logo slot is not provided. */
8
- showLogo?: boolean;
9
- /** Top bar visual treatment. */
10
- variant?: TopBarVariant;
11
- /** Home link used by the brand icon. */
12
- homePath?: string;
13
- /** Preferred route-level page switch entries for plugin and platform pages. Integrated plugins read platform plugin.nav_items metadata automatically when pageSelector is omitted. */
7
+ /** Structure: variant, home link, logo, pills, theme toggle, settings, standalone badge. Optional: every option has a default. */
8
+ spec?: PluginWorkspaceTopBarSpec;
9
+ /** Active pill id. Bind with `v-model:pill`. */
10
+ pill?: string;
11
+ /** Page selector of a platform page. Plugin pages get theirs from the plugin.nav_items metadata through the platform integration script. */
14
12
  pageSelector?: PageSelectorItemInput[];
15
- /** Active id for the preferred page selector. */
13
+ /** Active id of the platform page selector. */
16
14
  currentPageSelectorId?: string;
17
- /** Preferred centered navigation for local modes inside the current route. */
18
- pillNav?: PillNavItemInput[];
19
- /** Active id for the preferred centered pill navigation. */
20
- currentPillId?: string;
21
- /** Account dropdown entries. */
22
- accountMenu?: AccountMenuItem[];
23
- /** Show the notifications icon button. */
24
- showNotifications?: boolean;
25
- /** Draw a notification dot on the notifications icon. */
26
- hasNotificationDot?: boolean;
27
- /** Show the theme toggle button. */
28
- showThemeToggle?: boolean;
29
- /** Show the settings button and modal. */
30
- showSettings?: boolean;
31
- /** Built-in SettingsModal configuration. */
32
- settingsConfig?: TopBarSettingsConfig;
33
- /** Show the standalone badge when the plugin is not integrated into the platform. */
34
- showStandaloneLabel?: boolean;
35
- /** Custom standalone badge label. */
36
- standaloneLabel?: string;
37
- /** Show the admin shortcut. */
38
- showAdmin?: boolean;
39
- /** Route used by the admin shortcut. */
40
- adminPath?: string;
41
- /** Account display name. */
42
- userName?: string;
43
- /** Explicit account avatar initial. */
44
- userInitial?: string;
45
- /** Account email shown in the avatar menu. */
46
- userEmail?: string;
47
15
  }
48
16
  declare var __VLS_6: {}, __VLS_13: {}, __VLS_26: {}, __VLS_33: {}, __VLS_40: {}, __VLS_47: {}, __VLS_58: {
49
17
  page: PageSelectorItem;
50
18
  }, __VLS_61: {
51
19
  page: PageSelectorItem;
52
- }, __VLS_63: {}, __VLS_65: {}, __VLS_84: {}, __VLS_109: {
53
- close: () => void;
54
- }, __VLS_112: {
55
- item: AccountMenuItem;
56
- }, __VLS_131: `settings-tab-${string}`, __VLS_132: {}, __VLS_135: {};
20
+ }, __VLS_63: {}, __VLS_65: {}, __VLS_84: {}, __VLS_91: {}, __VLS_103: `settings-tab-${string}`, __VLS_104: {}, __VLS_107: {};
57
21
  type __VLS_Slots = {} & {
58
- [K in NonNullable<typeof __VLS_131>]?: (props: typeof __VLS_132) => any;
22
+ [K in NonNullable<typeof __VLS_103>]?: (props: typeof __VLS_104) => any;
59
23
  } & {
60
24
  icon?: (props: typeof __VLS_6) => any;
61
25
  } & {
@@ -79,42 +43,24 @@ type __VLS_Slots = {} & {
79
43
  } & {
80
44
  actions?: (props: typeof __VLS_84) => any;
81
45
  } & {
82
- 'account-menu-items'?: (props: typeof __VLS_109) => any;
46
+ account?: (props: typeof __VLS_91) => any;
83
47
  } & {
84
- 'account-menu-item-icon'?: (props: typeof __VLS_112) => any;
85
- } & {
86
- 'settings-appearance'?: (props: typeof __VLS_135) => any;
48
+ 'settings-appearance'?: (props: typeof __VLS_107) => any;
87
49
  };
88
50
  declare const __VLS_base: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
89
- "sign-out": () => any;
90
- "admin-click": () => any;
91
- "page-selector-select": (page: PageSelectorItem) => any;
51
+ "update:pill": (pillId: string) => any;
92
52
  "pill-select": (item: PillNavItem) => any;
93
53
  "pill-option-select": (option: PillNavOption, item: PillNavItem) => any;
94
- "account-menu-select": (item: AccountMenuItem) => any;
95
- "notifications-click": () => any;
96
54
  "settings-values-change": (data: Record<string, unknown>) => any;
55
+ "page-selector-select": (page: PageSelectorItem) => any;
97
56
  }, string, import('vue').PublicProps, Readonly<Props> & Readonly<{
98
- "onSign-out"?: (() => any) | undefined;
99
- "onAdmin-click"?: (() => any) | undefined;
100
- "onPage-selector-select"?: ((page: PageSelectorItem) => any) | undefined;
57
+ "onUpdate:pill"?: ((pillId: string) => any) | undefined;
101
58
  "onPill-select"?: ((item: PillNavItem) => any) | undefined;
102
59
  "onPill-option-select"?: ((option: PillNavOption, item: PillNavItem) => any) | undefined;
103
- "onAccount-menu-select"?: ((item: AccountMenuItem) => any) | undefined;
104
- "onNotifications-click"?: (() => any) | undefined;
105
60
  "onSettings-values-change"?: ((data: Record<string, unknown>) => any) | undefined;
61
+ "onPage-selector-select"?: ((page: PageSelectorItem) => any) | undefined;
106
62
  }>, {
107
- variant: TopBarVariant;
108
- showLogo: boolean;
109
- homePath: string;
110
- showNotifications: boolean;
111
- hasNotificationDot: boolean;
112
- showThemeToggle: boolean;
113
- showSettings: boolean;
114
- showStandaloneLabel: boolean;
115
- standaloneLabel: string;
116
- showAdmin: boolean;
117
- adminPath: string;
63
+ spec: PluginWorkspaceTopBarSpec;
118
64
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
119
65
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
120
66
  declare const _default: typeof __VLS_export;