@morscherlab/mint-sdk 1.4.0-beta.8 → 1.4.0

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 (353) hide show
  1. package/README.md +14 -3
  2. package/dist/{ActionMenu-CScINahU.js → AlertBox-DwgNTEqf.js} +40 -209
  3. package/dist/AlertBox-DwgNTEqf.js.map +1 -0
  4. package/dist/{AppSidebar-BmiiPfz9.js → AppSidebar-CZZaxni0.js} +1249 -239
  5. package/dist/AppSidebar-CZZaxni0.js.map +1 -0
  6. package/dist/{ConfirmDialog-CJ7hqYUP.js → ConfirmDialog-CjWoxAD1.js} +2 -2
  7. package/dist/{ConfirmDialog-CJ7hqYUP.js.map → ConfirmDialog-CjWoxAD1.js.map} +1 -1
  8. package/dist/ExperimentPopover-DujiuQIO.js +337 -0
  9. package/dist/ExperimentPopover-DujiuQIO.js.map +1 -0
  10. package/dist/{ExperimentSelectorModal-D-9z7cNx.js → ExperimentSelectorModal-B4j4eUOJ.js} +244 -211
  11. package/dist/ExperimentSelectorModal-B4j4eUOJ.js.map +1 -0
  12. package/dist/{SegmentedControl-DERBN-Xd.js → SegmentedControl-DyUPH3I5.js} +2 -2
  13. package/dist/{SegmentedControl-DERBN-Xd.js.map → SegmentedControl-DyUPH3I5.js.map} +1 -1
  14. package/dist/{SettingsModal-CSLE31yg.js → SettingsModal-D2MOOtuO.js} +28 -27
  15. package/dist/SettingsModal-D2MOOtuO.js.map +1 -0
  16. package/dist/__stories__/experiment-helpers.d.ts +10 -0
  17. package/dist/__tests__/components/AppTopBarOnboarding.test.d.ts +1 -0
  18. package/dist/__tests__/components/FloatingPanelsInModal.test.d.ts +1 -0
  19. package/dist/__tests__/composables/useFloatingPanel.test.d.ts +1 -0
  20. package/dist/__tests__/composables/useOnboarding.test.d.ts +1 -0
  21. package/dist/__tests__/styles/paletteTokens.test.d.ts +1 -0
  22. package/dist/__tests__/styles/v2AuditRules.test.d.ts +1 -0
  23. package/dist/components/AppSidebar.vue.d.ts +1 -1
  24. package/dist/components/AppTopBar.vue.d.ts +20 -5
  25. package/dist/components/ArtifactSaveDialog.vue.d.ts +9 -1
  26. package/dist/components/AuditTrail.vue.d.ts +1 -1
  27. package/dist/components/BaseButton.vue.d.ts +4 -2
  28. package/dist/components/BaseSelect.vue.d.ts +2 -2
  29. package/dist/components/ChartContainer.vue.d.ts +2 -0
  30. package/dist/components/DatePicker.vue.d.ts +1 -1
  31. package/dist/components/ExperimentPopover.vue.d.ts +18 -0
  32. package/dist/components/ExperimentSelectorModal.vue.d.ts +15 -5
  33. package/dist/components/FilePicker.vue.d.ts +1 -1
  34. package/dist/components/FileUploader.vue.d.ts +2 -2
  35. package/dist/components/JobsStatusTray.vue.d.ts +15 -4
  36. package/dist/components/PluginIcon.vue.d.ts +2 -2
  37. package/dist/components/PluginWorkspaceView.props.d.ts +3 -0
  38. package/dist/components/PluginWorkspaceView.vue.d.ts +3 -0
  39. package/dist/components/SampleSelector.vue.d.ts +6 -6
  40. package/dist/components/SequenceProgressBar.vue.d.ts +3 -0
  41. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +3 -3
  42. package/dist/components/StepWizard.vue.d.ts +3 -0
  43. package/dist/components/internal/AppTopBarOnboardingInternal.vue.d.ts +7 -0
  44. package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +2 -1
  45. package/dist/components/internal/AutoGroupModalInternal.vue.d.ts +3 -3
  46. package/dist/components/internal/DatePickerTimeInternal.vue.d.ts +1 -1
  47. package/dist/components/internal/OnboardingLayerInternal.vue.d.ts +7 -0
  48. package/dist/components/internal/ResourcePickerListInternal.vue.d.ts +2 -7
  49. package/dist/components/internal/SelectMultipleInternal.vue.d.ts +4 -0
  50. package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +8 -0
  51. package/dist/composables/createClient.d.ts +2 -0
  52. package/dist/composables/index.d.ts +1 -0
  53. package/dist/composables/pluginIdentity.d.ts +24 -0
  54. package/dist/composables/pluginWorkspaceModel.d.ts +2 -2
  55. package/dist/composables/useAppExperiment.d.ts +8 -0
  56. package/dist/composables/useCalendarGrid.d.ts +1 -1
  57. package/dist/composables/useExperimentSelector.d.ts +6 -2
  58. package/dist/composables/useFileImport.d.ts +7 -0
  59. package/dist/composables/useFloatingPanel.d.ts +29 -0
  60. package/dist/composables/useJobCenter.d.ts +41 -3
  61. package/dist/composables/useOnboarding.d.ts +119 -0
  62. package/dist/composables/usePlatform.d.ts +1 -0
  63. package/dist/{controlSchemaModel-CP5-_nAj.js → controlSchemaModel-Bsg0t5Ab.js} +2 -2
  64. package/dist/{controlSchemaModel-CP5-_nAj.js.map → controlSchemaModel-Bsg0t5Ab.js.map} +1 -1
  65. package/dist/{data-C2PwI_dn.js → data-Boeh4uPI.js} +180 -125
  66. package/dist/data-Boeh4uPI.js.map +1 -0
  67. package/dist/data.d.ts +1 -1
  68. package/dist/data.js +9 -9
  69. package/dist/{experiment-43OJtH7R.js → experiment-DyO54FQB.js} +25 -61
  70. package/dist/experiment-DyO54FQB.js.map +1 -0
  71. package/dist/{experimentStatus-BZmU4czV.js → experimentStatus-DCn2QKG7.js} +3 -3
  72. package/dist/{experimentStatus-BZmU4czV.js.map → experimentStatus-DCn2QKG7.js.map} +1 -1
  73. package/dist/index.js +20 -20
  74. package/dist/{install-DAID6c2-.js → install-BEHp7Mo-.js} +15 -14
  75. package/dist/{install-DAID6c2-.js.map → install-BEHp7Mo-.js.map} +1 -1
  76. package/dist/install.js +1 -1
  77. package/dist/{lab-DLwRl_Ql.js → lab-D61eaX6f.js} +136 -148
  78. package/dist/lab-D61eaX6f.js.map +1 -0
  79. package/dist/lab.js +4 -3
  80. package/dist/{records-BzTcxekG.js → records-D4aQXyZu.js} +647 -389
  81. package/dist/records-D4aQXyZu.js.map +1 -0
  82. package/dist/{runtime-D6gVat6r.js → runtime-q-R0CNLh.js} +417 -54
  83. package/dist/runtime-q-R0CNLh.js.map +1 -0
  84. package/dist/runtime.d.ts +1 -1
  85. package/dist/runtime.js +7 -7
  86. package/dist/{shell-5ju97nOS.js → shell-6CGFvUUw.js} +10 -5
  87. package/dist/{shell-5ju97nOS.js.map → shell-6CGFvUUw.js.map} +1 -1
  88. package/dist/shell.d.ts +1 -0
  89. package/dist/shell.js +6 -6
  90. package/dist/stores/index.d.ts +1 -1
  91. package/dist/stores/index.js +2 -2
  92. package/dist/stores/settings.d.ts +4 -12
  93. package/dist/styles.css +2753 -2101
  94. package/dist/types/componentWorkflowTypes.d.ts +2 -0
  95. package/dist/types/components.d.ts +2 -0
  96. package/dist/types/generated/platformContext.d.ts +1 -0
  97. package/dist/types/generated-ui.d.ts +4 -0
  98. package/dist/types/index.d.ts +1 -1
  99. package/dist/types/jobs.d.ts +9 -0
  100. package/dist/types/platform.d.ts +1 -1
  101. package/dist/{BaseModal-DfRIuVoj.js → useDropdownState-uFIz6Yv8.js} +75 -5
  102. package/dist/useDropdownState-uFIz6Yv8.js.map +1 -0
  103. package/dist/{useExperimentSamples-CxcnxZ8h.js → useExperimentSamples-QEFoq4tf.js} +48 -6
  104. package/dist/useExperimentSamples-QEFoq4tf.js.map +1 -0
  105. package/dist/{useListReorder-CcbEYxX-.js → useListReorder-DsuzwWGS.js} +219 -437
  106. package/dist/useListReorder-DsuzwWGS.js.map +1 -0
  107. package/dist/{useRackEditor-BD5NIo5s.js → useRackEditor-KpZ4iJ6o.js} +85 -81
  108. package/dist/useRackEditor-KpZ4iJ6o.js.map +1 -0
  109. package/dist/useRealtime-B58Lo-Tm.js +508 -0
  110. package/dist/useRealtime-B58Lo-Tm.js.map +1 -0
  111. package/dist/useRequest-BuDmW8Jc.js +215 -0
  112. package/dist/useRequest-BuDmW8Jc.js.map +1 -0
  113. package/dist/utils/time.d.ts +7 -0
  114. package/package.json +3 -2
  115. package/src/__stories__/experiment-helpers.ts +3 -3
  116. package/src/__tests__/components/ActionMenu.test.ts +2 -2
  117. package/src/__tests__/components/AppTopBar.test.ts +257 -3
  118. package/src/__tests__/components/AppTopBarOnboarding.test.ts +160 -0
  119. package/src/__tests__/components/AppTopBarPageSelector.test.ts +125 -9
  120. package/src/__tests__/components/AppTopBarPillNav.test.ts +35 -0
  121. package/src/__tests__/components/ArtifactSaveDialog.test.ts +78 -0
  122. package/src/__tests__/components/BaseButton.test.ts +19 -0
  123. package/src/__tests__/components/BaseModal.test.ts +13 -0
  124. package/src/__tests__/components/BaseSelect.multiple.test.ts +87 -32
  125. package/src/__tests__/components/BaseSelect.test.ts +2 -1
  126. package/src/__tests__/components/BatchProgressList.test.ts +16 -0
  127. package/src/__tests__/components/CalendarGridPanel.test.ts +2 -2
  128. package/src/__tests__/components/ChartContainer.test.ts +11 -0
  129. package/src/__tests__/components/ChemicalFormula.test.ts +6 -3
  130. package/src/__tests__/components/DatePicker.datetime.test.ts +6 -0
  131. package/src/__tests__/components/DatePicker.test.ts +21 -0
  132. package/src/__tests__/components/DatePicker.time.test.ts +2 -2
  133. package/src/__tests__/components/EmptyState.test.ts +1 -1
  134. package/src/__tests__/components/ExperimentPopover.test.ts +125 -16
  135. package/src/__tests__/components/ExperimentSelectorModal.test.ts +153 -14
  136. package/src/__tests__/components/FloatingPanelsInModal.test.ts +94 -0
  137. package/src/__tests__/components/GeneratedPluginView.test.ts +23 -2
  138. package/src/__tests__/components/InstrumentStateBadge.test.ts +4 -4
  139. package/src/__tests__/components/JobsStatusTray.test.ts +373 -71
  140. package/src/__tests__/components/PluginWorkspaceView.test.ts +63 -1
  141. package/src/__tests__/components/ResourcePickerListInternal.test.ts +0 -20
  142. package/src/__tests__/components/SampleSelector.test.ts +33 -8
  143. package/src/__tests__/components/SequenceProgressBar.test.ts +12 -0
  144. package/src/__tests__/components/SettingsModal.test.ts +9 -2
  145. package/src/__tests__/components/StepWizard.test.ts +11 -0
  146. package/src/__tests__/components/WellPlate.decoration.test.ts +11 -4
  147. package/src/__tests__/components/deprecationTags.test.ts +1 -1
  148. package/src/__tests__/composables/useAppExperiment.test.ts +27 -1
  149. package/src/__tests__/composables/useCalendarGrid.test.ts +4 -2
  150. package/src/__tests__/composables/useExperimentSelector.test.ts +111 -0
  151. package/src/__tests__/composables/useFileImport.test.ts +36 -0
  152. package/src/__tests__/composables/useFloatingPanel.test.ts +68 -0
  153. package/src/__tests__/composables/useJobCenter.test.ts +262 -3
  154. package/src/__tests__/composables/useOnboarding.test.ts +317 -0
  155. package/src/__tests__/docs/frontendDocsCatalog.test.ts +4 -3
  156. package/src/__tests__/fixtures/table-import/cells.xlsx +0 -0
  157. package/src/__tests__/fixtures/table-import/samples.xlsx +0 -0
  158. package/src/__tests__/stores/settings.test.ts +21 -21
  159. package/src/__tests__/styles/baseControlsRules.test.ts +6 -2
  160. package/src/__tests__/styles/controlRefreshRules.test.ts +0 -6
  161. package/src/__tests__/styles/cssTokens.test.ts +6 -3
  162. package/src/__tests__/styles/menusShellRefresh.test.ts +22 -12
  163. package/src/__tests__/styles/paletteTokens.test.ts +44 -0
  164. package/src/__tests__/styles/v2AuditRules.test.ts +104 -0
  165. package/src/__tests__/utils/plotlyTemplate.test.ts +4 -4
  166. package/src/__tests__/utils/time.test.ts +18 -1
  167. package/src/components/ActionMenu.vue +6 -37
  168. package/src/components/AdductText.story.vue +7 -0
  169. package/src/components/AdductText.vue +1 -1
  170. package/src/components/AlertBox.story.vue +2 -2
  171. package/src/components/AlertBox.vue +18 -16
  172. package/src/components/AppSidebar.story.vue +0 -28
  173. package/src/components/AppTopBar.onboarding.story.vue +69 -0
  174. package/src/components/AppTopBar.story.vue +105 -15
  175. package/src/components/AppTopBar.vue +248 -122
  176. package/src/components/ArtifactSaveDialog.story.vue +23 -0
  177. package/src/components/ArtifactSaveDialog.vue +102 -12
  178. package/src/components/AuditTrail.story.vue +2 -1
  179. package/src/components/AuditTrail.vue +2 -21
  180. package/src/components/Avatar.vue +10 -14
  181. package/src/components/BaseButton.vue +16 -2
  182. package/src/components/BaseModal.vue +2 -1
  183. package/src/components/BaseSelect.multiple.story.vue +13 -2
  184. package/src/components/BaseSelect.vue +4 -3
  185. package/src/components/BatchProgressList.vue +35 -25
  186. package/src/components/ChartContainer.story.vue +2 -1
  187. package/src/components/ChartContainer.vue +8 -6
  188. package/src/components/ConfirmDialog.story.vue +1 -1
  189. package/src/components/EmptyState.vue +1 -1
  190. package/src/components/ExperimentPopover.story.vue +165 -53
  191. package/src/components/ExperimentPopover.vue +169 -187
  192. package/src/components/ExperimentSelectorModal.story.vue +73 -31
  193. package/src/components/ExperimentSelectorModal.vue +144 -111
  194. package/src/components/FormField.story.vue +8 -48
  195. package/src/components/GeneratedPluginView.vue +11 -10
  196. package/src/components/GeneratedResultRenderer.vue +3 -4
  197. package/src/components/InstrumentStateBadge.vue +1 -1
  198. package/src/components/JobsStatusTray.story.vue +97 -43
  199. package/src/components/JobsStatusTray.vue +287 -290
  200. package/src/components/LayoutResizeHandle.story.vue +65 -4
  201. package/src/components/LoadingSpinner.vue +1 -1
  202. package/src/components/NumberInput.vue +3 -6
  203. package/src/components/PluginIcon.story.vue +2 -10
  204. package/src/components/PluginIcon.vue +2 -2
  205. package/src/components/PluginWorkspaceView.props.ts +3 -0
  206. package/src/components/PluginWorkspaceView.story.vue +1 -1
  207. package/src/components/PluginWorkspaceView.vue +17 -0
  208. package/src/components/RuntimeUpdateNotice.vue +1 -1
  209. package/src/components/SampleSelector.story.vue +22 -7
  210. package/src/components/SampleSelector.vue +34 -37
  211. package/src/components/SampleSelectorGroupNode.vue +1 -1
  212. package/src/components/SectionCard.story.vue +35 -2
  213. package/src/components/SequenceProgressBar.story.vue +9 -0
  214. package/src/components/SequenceProgressBar.vue +6 -1
  215. package/src/components/SettingsModal.schema.ts +1 -1
  216. package/src/components/SettingsModal.vue +9 -14
  217. package/src/components/SmartGroupFieldRecipe.story.vue +1 -1
  218. package/src/components/SmartGroupManual.story.vue +1 -1
  219. package/src/components/StepWizard.story.vue +33 -0
  220. package/src/components/StepWizard.vue +8 -1
  221. package/src/components/Tooltip.vue +9 -32
  222. package/src/components/WellPlate.story.vue +3 -1
  223. package/src/components/WellPlate.vue +7 -0
  224. package/src/components/internal/AppTopBarOnboardingInternal.vue +172 -0
  225. package/src/components/internal/AppTopBarPageSelectorInternal.vue +140 -72
  226. package/src/components/internal/AppTopBarPillNavInternal.vue +33 -2
  227. package/src/components/internal/DatePickerDateInternal.vue +23 -85
  228. package/src/components/internal/DatePickerDateTimeInternal.vue +10 -14
  229. package/src/components/internal/DatePickerTimeInternal.vue +13 -9
  230. package/src/components/internal/NumberUnitInputInternal.vue +4 -18
  231. package/src/components/internal/OnboardingLayerInternal.vue +173 -0
  232. package/src/components/internal/ResourcePickerListInternal.vue +45 -85
  233. package/src/components/internal/SelectMultipleInternal.vue +187 -65
  234. package/src/components/internal/SelectSearchableInternal.vue +8 -4
  235. package/src/components/internal/WellEditPopupInternal.vue +11 -22
  236. package/src/components/internal/WorkspaceShellInternal.vue +12 -0
  237. package/src/composables/createClient.ts +2 -0
  238. package/src/composables/index.ts +1 -0
  239. package/src/composables/pluginIdentity.ts +31 -0
  240. package/src/composables/pluginWorkspaceModel.ts +2 -2
  241. package/src/composables/useAppExperiment.ts +20 -0
  242. package/src/composables/useCalendarGrid.ts +4 -3
  243. package/src/composables/useExperimentSelector.ts +77 -31
  244. package/src/composables/useFileImport.ts +51 -1
  245. package/src/composables/useFloatingPanel.ts +107 -0
  246. package/src/composables/useJobCenter.ts +188 -6
  247. package/src/composables/useOnboarding.ts +465 -0
  248. package/src/composables/usePluginWorkspace.ts +1 -1
  249. package/src/data.ts +1 -0
  250. package/src/runtime.ts +2 -1
  251. package/src/shell.ts +17 -0
  252. package/src/stores/index.ts +0 -2
  253. package/src/stores/settings.ts +20 -50
  254. package/src/styles/components/action-menu.css +1 -1
  255. package/src/styles/components/adduct-text.css +13 -5
  256. package/src/styles/components/alert-box.css +39 -58
  257. package/src/styles/components/app-layout.css +10 -6
  258. package/src/styles/components/app-page-selector.css +121 -44
  259. package/src/styles/components/app-pill-nav.css +11 -12
  260. package/src/styles/components/app-sidebar.css +9 -18
  261. package/src/styles/components/app-top-bar.css +219 -55
  262. package/src/styles/components/artifact-save-dialog.css +153 -2
  263. package/src/styles/components/audit-trail.css +16 -19
  264. package/src/styles/components/avatar.css +6 -4
  265. package/src/styles/components/batch-progress-list.css +38 -36
  266. package/src/styles/components/button.css +36 -59
  267. package/src/styles/components/calendar.css +12 -12
  268. package/src/styles/components/chart-container.css +34 -23
  269. package/src/styles/components/checkbox.css +2 -12
  270. package/src/styles/components/collapsible-card.css +27 -29
  271. package/src/styles/components/confirm-dialog.css +13 -14
  272. package/src/styles/components/dataframe.css +13 -5
  273. package/src/styles/components/date-picker.css +84 -94
  274. package/src/styles/components/datetime-picker.css +35 -47
  275. package/src/styles/components/divider.css +20 -20
  276. package/src/styles/components/dose-calculator.css +3 -3
  277. package/src/styles/components/empty-state.css +20 -17
  278. package/src/styles/components/experiment-code-badge.css +2 -0
  279. package/src/styles/components/experiment-popover.css +174 -329
  280. package/src/styles/components/experiment-selector-modal.css +88 -56
  281. package/src/styles/components/file-picker.css +3 -3
  282. package/src/styles/components/file-uploader.css +38 -49
  283. package/src/styles/components/form-builder.css +3 -3
  284. package/src/styles/components/formula-input.css +1 -1
  285. package/src/styles/components/icon-button.css +18 -24
  286. package/src/styles/components/input.css +5 -4
  287. package/src/styles/components/instrument-monitor.css +13 -15
  288. package/src/styles/components/jobs-status-tray.css +140 -296
  289. package/src/styles/components/layout-resize-handle.css +59 -16
  290. package/src/styles/components/modal.css +5 -7
  291. package/src/styles/components/molecule-input.css +2 -2
  292. package/src/styles/components/multi-select.css +65 -117
  293. package/src/styles/components/number-input.css +26 -19
  294. package/src/styles/components/onboarding.css +368 -0
  295. package/src/styles/components/pill.css +3 -2
  296. package/src/styles/components/plate-editor.css +0 -1
  297. package/src/styles/components/plugin-icon.css +26 -23
  298. package/src/styles/components/popover.css +2 -2
  299. package/src/styles/components/presence-avatars.css +1 -1
  300. package/src/styles/components/progress-bar.css +3 -3
  301. package/src/styles/components/protocol-step-editor.css +1 -3
  302. package/src/styles/components/resource-card.css +2 -2
  303. package/src/styles/components/resource-picker-list.css +6 -57
  304. package/src/styles/components/sample-hierarchy-tree.css +4 -4
  305. package/src/styles/components/sample-selector.css +138 -79
  306. package/src/styles/components/schedule-calendar.css +8 -8
  307. package/src/styles/components/searchable-select.css +15 -19
  308. package/src/styles/components/section-card.css +54 -49
  309. package/src/styles/components/segmented-control.css +18 -15
  310. package/src/styles/components/select.css +3 -3
  311. package/src/styles/components/sequence-input.css +2 -2
  312. package/src/styles/components/sequence-progress-bar.css +17 -8
  313. package/src/styles/components/settings-modal.css +7 -2
  314. package/src/styles/components/smart-group.css +18 -18
  315. package/src/styles/components/step-wizard.css +52 -16
  316. package/src/styles/components/tabs.css +2 -2
  317. package/src/styles/components/textarea.css +3 -3
  318. package/src/styles/components/time-picker.css +37 -25
  319. package/src/styles/components/toast.css +13 -11
  320. package/src/styles/components/toggle.css +1 -11
  321. package/src/styles/components/tooltip.css +12 -11
  322. package/src/styles/components/unit-input.css +9 -8
  323. package/src/styles/components/well-edit-popup.css +2 -2
  324. package/src/styles/components/well-plate.css +9 -2
  325. package/src/styles/index.css +1 -0
  326. package/src/styles/variables.css +247 -78
  327. package/src/types/componentWorkflowTypes.ts +2 -0
  328. package/src/types/components.ts +2 -0
  329. package/src/types/generated/platformContext.ts +1 -0
  330. package/src/types/generated-ui.ts +4 -0
  331. package/src/types/index.ts +1 -0
  332. package/src/types/jobs.ts +10 -0
  333. package/src/types/platform.ts +1 -1
  334. package/src/utils/time.ts +21 -0
  335. package/dist/ActionMenu-CScINahU.js.map +0 -1
  336. package/dist/AppSidebar-BmiiPfz9.js.map +0 -1
  337. package/dist/BaseModal-DfRIuVoj.js.map +0 -1
  338. package/dist/ExperimentPopover-C4sGw-is.js +0 -359
  339. package/dist/ExperimentPopover-C4sGw-is.js.map +0 -1
  340. package/dist/ExperimentSelectorModal-D-9z7cNx.js.map +0 -1
  341. package/dist/SettingsModal-CSLE31yg.js.map +0 -1
  342. package/dist/data-C2PwI_dn.js.map +0 -1
  343. package/dist/experiment-43OJtH7R.js.map +0 -1
  344. package/dist/lab-DLwRl_Ql.js.map +0 -1
  345. package/dist/records-BzTcxekG.js.map +0 -1
  346. package/dist/runtime-D6gVat6r.js.map +0 -1
  347. package/dist/useExperimentSamples-CxcnxZ8h.js.map +0 -1
  348. package/dist/useListReorder-CcbEYxX-.js.map +0 -1
  349. package/dist/useRackEditor-BD5NIo5s.js.map +0 -1
  350. package/dist/useRealtime-PalKue84.js +0 -696
  351. package/dist/useRealtime-PalKue84.js.map +0 -1
  352. package/dist/useRequest-D5JDfsgZ.js +0 -76
  353. package/dist/useRequest-D5JDfsgZ.js.map +0 -1
@@ -1,10 +1,10 @@
1
- import { a as __exportAll, i as BaseButton_default, n as useFocusTrap, t as BaseModal_default } from "./BaseModal-DfRIuVoj.js";
2
- import { d as tryUseSettingsStore, m as mintApiErrorFromResponse, p as MintApiError, t as useExperimentStore } from "./experiment-43OJtH7R.js";
3
- import { C as formatExperimentDate, D as useDropdownState, E as useMenuKeyboard, I as normalizeOptionInput, L as BaseInput_default, N as BaseSelect_default, T as FileUploader_default, d as normalizeJobState, i as getInjectedPlatformContext, j as BaseCheckbox_default, m as SecretInput_default, n as ResourcePickerListInternal_default, p as TagsInput_default, s as isActiveJobStatus } from "./records-BzTcxekG.js";
1
+ import { a as BaseButton_default, n as BaseModal_default, o as __exportAll, r as useFocusTrap, t as useDropdownState } from "./useDropdownState-uFIz6Yv8.js";
2
+ import { d as MintApiError, f as mintApiErrorFromResponse, l as tryUseSettingsStore, t as useExperimentStore } from "./experiment-DyO54FQB.js";
3
+ import { C as formatExperimentDate, D as compareTime, E as useMenuKeyboard, F as toMinutes, G as normalizeOptionInput, K as BaseInput_default, M as formatTimeSlot, N as generateTimeSlots, T as FileUploader_default, V as BaseSelect_default, W as useFloatingPanel, c as SecretInput_default, d as isActiveJobStatus, h as normalizeJobState, i as getInjectedPlatformContext, j as formatTime, k as findNearestTimeSlotIndex, n as ResourcePickerListInternal_default, s as TagsInput_default, z as BaseCheckbox_default } from "./records-D4aQXyZu.js";
4
4
  import "./auth-SliLnFre.js";
5
5
  import { getRoleInfo, hasAllPermissions, isAdminUser } from "./permissions.js";
6
- import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createStaticVNode, createTextVNode, createVNode, defineComponent, getCurrentInstance, getCurrentScope, inject, mergeProps, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, onScopeDispose, onUnmounted, openBlock, ref, renderList, renderSlot, shallowRef, toDisplayString, toValue, unref, useAttrs, useId, useTemplateRef, vShow, watch, withCtx, withDirectives, withModifiers } from "vue";
7
- import { autoUpdate, computePosition, flip, offset, shift } from "@floating-ui/dom";
6
+ import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createStaticVNode, createTextVNode, createVNode, defineComponent, getCurrentInstance, getCurrentScope, inject, mergeProps, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, onScopeDispose, onUnmounted, openBlock, ref, renderList, renderSlot, shallowRef, toDisplayString, toValue, unref, useAttrs, useId, useTemplateRef, vShow, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
7
+ import { ChevronDown, ChevronUp } from "lucide-vue-next";
8
8
  //#region src/components/BaseRadioGroup.vue?vue&type=script&setup=true&lang.ts
9
9
  var _hoisted_1$12 = { class: "mint-radio-option__input-wrapper" };
10
10
  var _hoisted_2$12 = [
@@ -16,7 +16,7 @@ var _hoisted_2$12 = [
16
16
  "onChange"
17
17
  ];
18
18
  var _hoisted_3$12 = { class: "mint-radio-option__content" };
19
- var _hoisted_4$11 = ["id"];
19
+ var _hoisted_4$10 = ["id"];
20
20
  var _hoisted_5$9 = [
21
21
  "name",
22
22
  "value",
@@ -25,7 +25,7 @@ var _hoisted_5$9 = [
25
25
  "aria-describedby",
26
26
  "onChange"
27
27
  ];
28
- var _hoisted_6$9 = { class: "mint-radio-option__head" };
28
+ var _hoisted_6$8 = { class: "mint-radio-option__head" };
29
29
  var _hoisted_7$8 = { class: "mint-radio-option__title" };
30
30
  var _hoisted_8$7 = ["id"];
31
31
  //#endregion
@@ -89,7 +89,7 @@ var BaseRadioGroup_default = /* @__PURE__ */ defineComponent({
89
89
  key: 0,
90
90
  id: `${props.name}-${option.value}-desc`,
91
91
  class: normalizeClass(["mint-radio-option__description", `mint-radio-option__description--${props.size}`])
92
- }, toDisplayString(option.description), 11, _hoisted_4$11)) : createCommentVNode("", true)])], 64)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
92
+ }, toDisplayString(option.description), 11, _hoisted_4$10)) : createCommentVNode("", true)])], 64)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
93
93
  createElementVNode("input", {
94
94
  type: "radio",
95
95
  name: props.name,
@@ -100,7 +100,7 @@ var BaseRadioGroup_default = /* @__PURE__ */ defineComponent({
100
100
  class: "mint-radio-option__native",
101
101
  onChange: ($event) => handleChange(option.value)
102
102
  }, null, 40, _hoisted_5$9),
103
- createElementVNode("div", _hoisted_6$9, [createElementVNode("div", { class: normalizeClass([
103
+ createElementVNode("div", _hoisted_6$8, [createElementVNode("div", { class: normalizeClass([
104
104
  "mint-radio-option__circle",
105
105
  `mint-radio-option__circle--${props.size}`,
106
106
  props.modelValue === option.value ? "mint-radio-option__circle--checked" : ""
@@ -369,15 +369,15 @@ function definePlateEditor(spec) {
369
369
  //#endregion
370
370
  //#region src/composables/useCalendarGrid.ts
371
371
  var WEEK_DAYS = [
372
- "Su",
373
372
  "Mo",
374
373
  "Tu",
375
374
  "We",
376
375
  "Th",
377
376
  "Fr",
378
- "Sa"
377
+ "Sa",
378
+ "Su"
379
379
  ];
380
- /** Shared calendar grid state for date and datetime pickers. */
380
+ /** Shared Monday-first calendar grid state for date and datetime pickers. */
381
381
  function useCalendarGrid(options = {}) {
382
382
  const currentMonth = ref(/* @__PURE__ */ new Date());
383
383
  const monthYear = computed(() => {
@@ -392,7 +392,7 @@ function useCalendarGrid(options = {}) {
392
392
  const firstDay = new Date(year, month, 1);
393
393
  const lastDay = new Date(year, month + 1, 0);
394
394
  const days = [];
395
- const startPadding = firstDay.getDay();
395
+ const startPadding = (firstDay.getDay() + 6) % 7;
396
396
  for (let i = startPadding - 1; i >= 0; i--) {
397
397
  const date = new Date(year, month, -i);
398
398
  days.push({
@@ -475,9 +475,9 @@ function startOfDay(date) {
475
475
  var _hoisted_1$10 = { class: "mint-calendar-grid-panel" };
476
476
  var _hoisted_2$10 = { class: "mint-date-picker__header" };
477
477
  var _hoisted_3$10 = ["aria-label"];
478
- var _hoisted_4$10 = { class: "mint-date-picker__month-year" };
478
+ var _hoisted_4$9 = { class: "mint-date-picker__month-year" };
479
479
  var _hoisted_5$8 = ["aria-label"];
480
- var _hoisted_6$8 = { class: "mint-date-picker__weekdays" };
480
+ var _hoisted_6$7 = { class: "mint-date-picker__weekdays" };
481
481
  var _hoisted_7$7 = { class: "mint-date-picker__grid" };
482
482
  var _hoisted_8$6 = [
483
483
  "disabled",
@@ -539,7 +539,7 @@ var CalendarGridPanelInternal_default = /* @__PURE__ */ defineComponent({
539
539
  "stroke-linejoin": "round",
540
540
  "aria-hidden": "true"
541
541
  }, [createElementVNode("path", { d: "m15 18-6-6 6-6" })], -1)])], 8, _hoisted_3$10),
542
- createElementVNode("span", _hoisted_4$10, toDisplayString(__props.monthYear), 1),
542
+ createElementVNode("span", _hoisted_4$9, toDisplayString(__props.monthYear), 1),
543
543
  createElementVNode("button", {
544
544
  type: "button",
545
545
  class: "mint-date-picker__nav-btn",
@@ -555,7 +555,7 @@ var CalendarGridPanelInternal_default = /* @__PURE__ */ defineComponent({
555
555
  "aria-hidden": "true"
556
556
  }, [createElementVNode("path", { d: "m9 18 6-6-6-6" })], -1)])], 8, _hoisted_5$8)
557
557
  ]),
558
- createElementVNode("div", _hoisted_6$8, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.weekDays, (day) => {
558
+ createElementVNode("div", _hoisted_6$7, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.weekDays, (day) => {
559
559
  return openBlock(), createElementBlock("div", {
560
560
  key: day,
561
561
  class: "mint-date-picker__weekday"
@@ -595,7 +595,6 @@ var _hoisted_3$9 = [
595
595
  "placeholder",
596
596
  "disabled"
597
597
  ];
598
- var _hoisted_4$9 = { class: "mint-date-picker__footer" };
599
598
  //#endregion
600
599
  //#region src/components/internal/DatePickerDateInternal.vue
601
600
  var DatePickerDateInternal_default = /* @__PURE__ */ defineComponent({
@@ -625,16 +624,16 @@ var DatePickerDateInternal_default = /* @__PURE__ */ defineComponent({
625
624
  const props = __props;
626
625
  const emit = __emit;
627
626
  const dropdownRef = ref(null);
628
- const dropdownStyle = ref({});
629
627
  const { isOpen, triggerRef, open, close, toggle } = useDropdownState({
630
628
  rootRef: useTemplateRef("container"),
631
629
  insideRefs: [dropdownRef]
632
630
  });
631
+ const { style: dropdownStyle } = useFloatingPanel(triggerRef, dropdownRef, isOpen);
633
632
  useFocusTrap({
634
633
  containerRef: dropdownRef,
635
634
  active: isOpen
636
635
  });
637
- const { weekDays, monthYear, calendarDays, isDateDisabled, formatDateValue, setCurrentMonthFromDate, prevMonth, nextMonth } = useCalendarGrid({
636
+ const { weekDays, monthYear, calendarDays, formatDateValue, setCurrentMonthFromDate, prevMonth, nextMonth } = useCalendarGrid({
638
637
  min: () => props.min,
639
638
  max: () => props.max
640
639
  });
@@ -643,27 +642,12 @@ var DatePickerDateInternal_default = /* @__PURE__ */ defineComponent({
643
642
  const date = /* @__PURE__ */ new Date(props.modelValue + "T00:00:00");
644
643
  return isNaN(date.getTime()) ? null : date;
645
644
  });
646
- const displayValue = computed(() => {
647
- if (!selectedDate.value) return "";
648
- return selectedDate.value.toLocaleDateString("en-US", {
649
- year: "numeric",
650
- month: "short",
651
- day: "numeric"
652
- });
653
- });
645
+ const displayValue = computed(() => selectedDate.value ? formatDateValue(selectedDate.value) : "");
654
646
  function selectDate(day) {
655
647
  if (day.isDisabled || props.disabled) return;
656
648
  emit("update:modelValue", formatDateValue(day.date));
657
649
  close();
658
650
  }
659
- function goToToday() {
660
- const today = /* @__PURE__ */ new Date();
661
- setCurrentMonthFromDate(today);
662
- if (!isDateDisabled(today)) {
663
- emit("update:modelValue", formatDateValue(today));
664
- close();
665
- }
666
- }
667
651
  function clear() {
668
652
  emit("update:modelValue", void 0);
669
653
  close();
@@ -679,38 +663,6 @@ var DatePickerDateInternal_default = /* @__PURE__ */ defineComponent({
679
663
  open();
680
664
  }
681
665
  }
682
- let stopAutoUpdate = null;
683
- async function updateDropdownPosition() {
684
- const trigger = triggerRef.value;
685
- const panel = dropdownRef.value;
686
- if (!trigger || !panel) return;
687
- const { x, y } = await computePosition(trigger, panel, {
688
- placement: "bottom-start",
689
- strategy: "fixed",
690
- middleware: [
691
- offset(4),
692
- flip(),
693
- shift({ padding: 8 })
694
- ]
695
- });
696
- dropdownStyle.value = {
697
- position: "fixed",
698
- top: `${y}px`,
699
- left: `${x}px`,
700
- zIndex: "9999"
701
- };
702
- }
703
- function stopPositioning() {
704
- stopAutoUpdate?.();
705
- stopAutoUpdate = null;
706
- }
707
- function startPositioning() {
708
- const trigger = triggerRef.value;
709
- const panel = dropdownRef.value;
710
- if (!trigger || !panel) return;
711
- stopPositioning();
712
- stopAutoUpdate = autoUpdate(trigger, panel, () => void updateDropdownPosition());
713
- }
714
666
  /** Moves focus into the calendar grid: selected day, else today, else the first day. */
715
667
  function focusCalendar() {
716
668
  const panel = dropdownRef.value;
@@ -718,37 +670,50 @@ var DatePickerDateInternal_default = /* @__PURE__ */ defineComponent({
718
670
  (panel.querySelector(".mint-date-picker__day--selected") ?? panel.querySelector(".mint-date-picker__day--today") ?? panel.querySelector(".mint-date-picker__day:not([disabled])"))?.focus();
719
671
  }
720
672
  watch(isOpen, async (opened) => {
721
- if (!opened) {
722
- stopPositioning();
723
- return;
724
- }
673
+ if (!opened) return;
725
674
  if (selectedDate.value) setCurrentMonthFromDate(selectedDate.value);
726
675
  await nextTick();
727
- startPositioning();
728
676
  await nextTick();
729
677
  focusCalendar();
730
678
  });
731
- onBeforeUnmount(stopPositioning);
732
679
  return (_ctx, _cache) => {
733
- return openBlock(), createElementBlock("div", _hoisted_1$9, [createElementVNode("div", _hoisted_2$9, [createElementVNode("input", {
734
- ref_key: "triggerRef",
735
- ref: triggerRef,
736
- type: "text",
737
- readonly: "",
738
- "aria-haspopup": "dialog",
739
- "aria-expanded": unref(isOpen),
740
- value: displayValue.value,
741
- placeholder: __props.placeholder || "Select date",
742
- disabled: __props.disabled,
743
- class: normalizeClass([
744
- "mint-date-picker__input",
745
- `mint-date-picker__input--${__props.size}`,
746
- __props.invalid ? "mint-date-picker__input--error" : "",
747
- __props.disabled ? "mint-date-picker__input--disabled" : ""
748
- ]),
749
- onClick: toggleCalendar,
750
- onKeydown: handleTriggerKeydown
751
- }, null, 42, _hoisted_3$9), _cache[0] || (_cache[0] = createStaticVNode("<div class=\"mint-date-picker__icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M8 2v4\"></path><path d=\"M16 2v4\"></path><rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\"></rect><path d=\"M3 10h18\"></path></svg></div>", 1))]), (openBlock(), createBlock(Teleport, { to: "body" }, [createVNode(Transition, {
680
+ return openBlock(), createElementBlock("div", _hoisted_1$9, [createElementVNode("div", _hoisted_2$9, [
681
+ _cache[2] || (_cache[2] = createStaticVNode("<div class=\"mint-date-picker__icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M8 2v4\"></path><path d=\"M16 2v4\"></path><rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\"></rect><path d=\"M3 10h18\"></path></svg></div>", 1)),
682
+ createElementVNode("input", {
683
+ ref_key: "triggerRef",
684
+ ref: triggerRef,
685
+ type: "text",
686
+ readonly: "",
687
+ "aria-haspopup": "dialog",
688
+ "aria-expanded": unref(isOpen),
689
+ value: displayValue.value,
690
+ placeholder: __props.placeholder || "Select date",
691
+ disabled: __props.disabled,
692
+ class: normalizeClass([
693
+ "mint-date-picker__input",
694
+ `mint-date-picker__input--${__props.size}`,
695
+ __props.invalid ? "mint-date-picker__input--error" : "",
696
+ __props.disabled ? "mint-date-picker__input--disabled" : ""
697
+ ]),
698
+ onClick: toggleCalendar,
699
+ onKeydown: handleTriggerKeydown
700
+ }, null, 42, _hoisted_3$9),
701
+ __props.clearable && __props.modelValue && !__props.disabled ? (openBlock(), createElementBlock("button", {
702
+ key: 0,
703
+ type: "button",
704
+ class: "mint-date-picker__clear-btn",
705
+ "aria-label": "Clear date",
706
+ onClick: withModifiers(clear, ["stop"])
707
+ }, [..._cache[1] || (_cache[1] = [createElementVNode("svg", {
708
+ viewBox: "0 0 24 24",
709
+ fill: "none",
710
+ stroke: "currentColor",
711
+ "stroke-width": "2",
712
+ "stroke-linecap": "round",
713
+ "stroke-linejoin": "round",
714
+ "aria-hidden": "true"
715
+ }, [createElementVNode("path", { d: "M18 6 6 18" }), createElementVNode("path", { d: "m6 6 12 12" })], -1)])])) : createCommentVNode("", true)
716
+ ]), (openBlock(), createBlock(Teleport, { to: "body" }, [createVNode(Transition, {
752
717
  "enter-active-class": "mint-date-picker__dropdown-enter-active",
753
718
  "enter-from-class": "mint-date-picker__dropdown-enter-from",
754
719
  "enter-to-class": "mint-date-picker__dropdown-enter-to",
@@ -761,9 +726,10 @@ var DatePickerDateInternal_default = /* @__PURE__ */ defineComponent({
761
726
  ref_key: "dropdownRef",
762
727
  ref: dropdownRef,
763
728
  class: "mint-popover mint-date-picker__dropdown",
764
- style: normalizeStyle(dropdownStyle.value),
729
+ style: normalizeStyle(unref(dropdownStyle)),
765
730
  role: "dialog",
766
- "aria-label": "Date picker"
731
+ "aria-label": "Date picker",
732
+ onKeydown: _cache[0] || (_cache[0] = withKeys(withModifiers(($event) => unref(close)(true), ["prevent"]), ["escape"]))
767
733
  }, [createVNode(CalendarGridPanelInternal_default, {
768
734
  "week-days": unref(weekDays),
769
735
  "month-year": unref(monthYear),
@@ -779,148 +745,13 @@ var DatePickerDateInternal_default = /* @__PURE__ */ defineComponent({
779
745
  "selected-date",
780
746
  "onPreviousMonth",
781
747
  "onNextMonth"
782
- ]), createElementVNode("div", _hoisted_4$9, [createElementVNode("button", {
783
- type: "button",
784
- class: "mint-date-picker__footer-btn mint-date-picker__today-btn",
785
- onClick: goToToday
786
- }, " Today "), __props.clearable && __props.modelValue ? (openBlock(), createElementBlock("button", {
787
- key: 0,
788
- type: "button",
789
- class: "mint-date-picker__footer-btn mint-date-picker__clear-btn",
790
- onClick: clear
791
- }, " Clear ")) : createCommentVNode("", true)])], 4)) : createCommentVNode("", true)]),
748
+ ])], 36)) : createCommentVNode("", true)]),
792
749
  _: 1
793
750
  })]))], 512);
794
751
  };
795
752
  }
796
753
  });
797
754
  //#endregion
798
- //#region src/utils/time.ts
799
- var time_exports = /* @__PURE__ */ __exportAll({
800
- addMinutes: () => addMinutes,
801
- compareTime: () => compareTime,
802
- durationMinutes: () => durationMinutes,
803
- findAvailableSlots: () => findAvailableSlots,
804
- findNearestTimeSlotIndex: () => findNearestTimeSlotIndex,
805
- formatDuration: () => formatDuration,
806
- formatTime: () => formatTime,
807
- formatTimeSlot: () => formatTimeSlot,
808
- fromMinutes: () => fromMinutes,
809
- generateTimeSlots: () => generateTimeSlots,
810
- isTimeInRange: () => isTimeInRange,
811
- parseTime: () => parseTime,
812
- rangesOverlap: () => rangesOverlap,
813
- snapToSlot: () => snapToSlot,
814
- toMinutes: () => toMinutes
815
- });
816
- function parseTime(time) {
817
- const [h, m] = time.split(":").map(Number);
818
- return {
819
- hour: h,
820
- minute: m
821
- };
822
- }
823
- function formatTime(hour, minute, format = "24h") {
824
- if (format === "24h") return `${String(hour).padStart(2, "0")}:${String(minute).padStart(2, "0")}`;
825
- const period = hour >= 12 ? "PM" : "AM";
826
- return `${hour === 0 ? 12 : hour > 12 ? hour - 12 : hour}:${String(minute).padStart(2, "0")} ${period}`;
827
- }
828
- function formatTimeSlot(time, format = "24h") {
829
- const { hour, minute } = parseTime(time);
830
- return formatTime(hour, minute, format);
831
- }
832
- function generateTimeSlots(start, end, stepMinutes) {
833
- const slots = [];
834
- const s = parseTime(start);
835
- const e = parseTime(end);
836
- const startMin = s.hour * 60 + s.minute;
837
- const endMin = e.hour * 60 + e.minute;
838
- for (let m = startMin; m <= endMin; m += stepMinutes) {
839
- const hour = Math.floor(m / 60);
840
- const minute = m % 60;
841
- if (hour >= 24) break;
842
- slots.push(formatTime(hour, minute));
843
- }
844
- return slots;
845
- }
846
- function rangesOverlap(a, b) {
847
- const aStart = toMinutes(a.start);
848
- const aEnd = toMinutes(a.end);
849
- const bStart = toMinutes(b.start);
850
- return aStart < toMinutes(b.end) && bStart < aEnd;
851
- }
852
- function durationMinutes(start, end) {
853
- return toMinutes(end) - toMinutes(start);
854
- }
855
- function formatDuration(minutes) {
856
- if (minutes < 0) return "-" + formatDuration(-minutes);
857
- const h = Math.floor(minutes / 60);
858
- const m = minutes % 60;
859
- if (h === 0) return `${m}m`;
860
- if (m === 0) return `${h}h`;
861
- return `${h}h ${m}m`;
862
- }
863
- function isTimeInRange(time, start, end) {
864
- const t = toMinutes(time);
865
- return t >= toMinutes(start) && t <= toMinutes(end);
866
- }
867
- function findAvailableSlots(dayStart, dayEnd, occupied, minDuration) {
868
- const sorted = [...occupied].sort((a, b) => toMinutes(a.start) - toMinutes(b.start));
869
- const available = [];
870
- let cursor = toMinutes(dayStart);
871
- const end = toMinutes(dayEnd);
872
- for (const slot of sorted) {
873
- const slotStart = toMinutes(slot.start);
874
- const slotEnd = toMinutes(slot.end);
875
- if (slotStart > cursor && slotStart - cursor >= minDuration) available.push({
876
- start: fromMinutes(cursor),
877
- end: fromMinutes(slotStart)
878
- });
879
- cursor = Math.max(cursor, slotEnd);
880
- }
881
- if (end > cursor && end - cursor >= minDuration) available.push({
882
- start: fromMinutes(cursor),
883
- end: fromMinutes(end)
884
- });
885
- return available;
886
- }
887
- function snapToSlot(time, stepMinutes) {
888
- const total = toMinutes(time);
889
- return fromMinutes(Math.round(total / stepMinutes) * stepMinutes);
890
- }
891
- function addMinutes(time, minutes) {
892
- const total = toMinutes(time) + minutes;
893
- return fromMinutes(Math.max(0, Math.min(total, 1439)));
894
- }
895
- function compareTime(a, b) {
896
- const ma = toMinutes(a);
897
- const mb = toMinutes(b);
898
- if (ma < mb) return -1;
899
- if (ma > mb) return 1;
900
- return 0;
901
- }
902
- function findNearestTimeSlotIndex(time, slots) {
903
- if (slots.length === 0) return -1;
904
- const target = toMinutes(time);
905
- let bestIndex = 0;
906
- let bestDiff = Infinity;
907
- for (let index = 0; index < slots.length; index++) {
908
- const diff = Math.abs(toMinutes(slots[index]) - target);
909
- if (diff < bestDiff) {
910
- bestDiff = diff;
911
- bestIndex = index;
912
- }
913
- }
914
- return bestIndex;
915
- }
916
- function toMinutes(time) {
917
- const { hour, minute } = parseTime(time);
918
- return hour * 60 + minute;
919
- }
920
- function fromMinutes(total) {
921
- return formatTime(Math.floor(total / 60) % 24, total % 60);
922
- }
923
- //#endregion
924
755
  //#region src/components/internal/DatePickerDateTimeInternal.vue?vue&type=script&setup=true&lang.ts
925
756
  var _hoisted_1$8 = {
926
757
  ref: "root",
@@ -935,7 +766,7 @@ var _hoisted_3$8 = [
935
766
  ];
936
767
  var _hoisted_4$8 = { class: "mint-datetime-picker__calendar-section" };
937
768
  var _hoisted_5$7 = { class: "mint-datetime-picker__time-section" };
938
- var _hoisted_6$7 = { class: "mint-datetime-picker__time-grid" };
769
+ var _hoisted_6$6 = { class: "mint-datetime-picker__time-grid" };
939
770
  var _hoisted_7$6 = ["disabled", "onClick"];
940
771
  var _hoisted_8$5 = { class: "mint-datetime-picker__footer" };
941
772
  //#endregion
@@ -970,10 +801,12 @@ var DatePickerDateTimeInternal_default = /* @__PURE__ */ defineComponent({
970
801
  const props = __props;
971
802
  const emit = __emit;
972
803
  const dropdownRef = ref(null);
804
+ const rootRef = useTemplateRef("root");
973
805
  const { isOpen, open, close, toggle } = useDropdownState({
974
- rootRef: useTemplateRef("root"),
806
+ rootRef,
975
807
  triggerRef: useTemplateRef("trigger")
976
808
  });
809
+ const { style: dropdownStyle } = useFloatingPanel(rootRef, dropdownRef, isOpen);
977
810
  useFocusTrap({
978
811
  containerRef: dropdownRef,
979
812
  active: isOpen
@@ -998,11 +831,8 @@ var DatePickerDateTimeInternal_default = /* @__PURE__ */ defineComponent({
998
831
  });
999
832
  const displayValue = computed(() => {
1000
833
  if (!selectedDate.value) return "";
1001
- return `${selectedDate.value.toLocaleDateString(props.locale, {
1002
- year: "numeric",
1003
- month: "short",
1004
- day: "numeric"
1005
- })} ${formatTime(selectedDate.value.getHours(), selectedDate.value.getMinutes(), props.timeFormat)}`;
834
+ const timeStr = formatTime(selectedDate.value.getHours(), selectedDate.value.getMinutes(), props.timeFormat);
835
+ return `${formatDateValue(selectedDate.value)} ${timeStr}`;
1006
836
  });
1007
837
  const timeSlots = computed(() => {
1008
838
  return generateTimeSlots("00:00", "23:59", props.timeStep);
@@ -1084,47 +914,25 @@ var DatePickerDateTimeInternal_default = /* @__PURE__ */ defineComponent({
1084
914
  focusCalendar();
1085
915
  });
1086
916
  return (_ctx, _cache) => {
1087
- return openBlock(), createElementBlock("div", _hoisted_1$8, [createElementVNode("div", _hoisted_2$8, [
1088
- _cache[0] || (_cache[0] = createElementVNode("div", { class: "mint-datetime-picker__icon-calendar" }, [createElementVNode("svg", {
1089
- fill: "none",
1090
- stroke: "currentColor",
1091
- viewBox: "0 0 24 24"
1092
- }, [createElementVNode("path", {
1093
- "stroke-linecap": "round",
1094
- "stroke-linejoin": "round",
1095
- "stroke-width": "2",
1096
- d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"
1097
- })])], -1)),
1098
- createElementVNode("input", {
1099
- ref: "trigger",
1100
- type: "text",
1101
- readonly: "",
1102
- "aria-haspopup": "dialog",
1103
- "aria-expanded": unref(isOpen),
1104
- value: displayValue.value,
1105
- placeholder: __props.placeholder,
1106
- disabled: __props.disabled,
1107
- class: normalizeClass([
1108
- "mint-datetime-picker__input",
1109
- `mint-datetime-picker__input--${__props.size}`,
1110
- __props.invalid ? "mint-datetime-picker__input--error" : "",
1111
- __props.disabled ? "mint-datetime-picker__input--disabled" : ""
1112
- ]),
1113
- "aria-label": "Select date and time",
1114
- onClick: toggleDropdown,
1115
- onKeydown: handleTriggerKeydown
1116
- }, null, 42, _hoisted_3$8),
1117
- _cache[1] || (_cache[1] = createElementVNode("div", { class: "mint-datetime-picker__icon-clock" }, [createElementVNode("svg", {
1118
- fill: "none",
1119
- stroke: "currentColor",
1120
- viewBox: "0 0 24 24"
1121
- }, [createElementVNode("path", {
1122
- "stroke-linecap": "round",
1123
- "stroke-linejoin": "round",
1124
- "stroke-width": "2",
1125
- d: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"
1126
- })])], -1))
1127
- ]), createVNode(Transition, {
917
+ return openBlock(), createElementBlock("div", _hoisted_1$8, [createElementVNode("div", _hoisted_2$8, [_cache[1] || (_cache[1] = createStaticVNode("<div class=\"mint-datetime-picker__icon-calendar\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M8 2v4\"></path><path d=\"M16 2v4\"></path><rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\"></rect><path d=\"M3 10h18\"></path></svg></div>", 1)), createElementVNode("input", {
918
+ ref: "trigger",
919
+ type: "text",
920
+ readonly: "",
921
+ "aria-haspopup": "dialog",
922
+ "aria-expanded": unref(isOpen),
923
+ value: displayValue.value,
924
+ placeholder: __props.placeholder,
925
+ disabled: __props.disabled,
926
+ class: normalizeClass([
927
+ "mint-datetime-picker__input",
928
+ `mint-datetime-picker__input--${__props.size}`,
929
+ __props.invalid ? "mint-datetime-picker__input--error" : "",
930
+ __props.disabled ? "mint-datetime-picker__input--disabled" : ""
931
+ ]),
932
+ "aria-label": "Select date and time",
933
+ onClick: toggleDropdown,
934
+ onKeydown: handleTriggerKeydown
935
+ }, null, 42, _hoisted_3$8)]), createVNode(Transition, {
1128
936
  "enter-active-class": "mint-datetime-picker__dropdown-enter-active",
1129
937
  "enter-from-class": "mint-datetime-picker__dropdown-enter-from",
1130
938
  "enter-to-class": "mint-datetime-picker__dropdown-enter-to",
@@ -1137,8 +945,10 @@ var DatePickerDateTimeInternal_default = /* @__PURE__ */ defineComponent({
1137
945
  ref_key: "dropdownRef",
1138
946
  ref: dropdownRef,
1139
947
  class: "mint-popover mint-datetime-picker__dropdown",
948
+ style: normalizeStyle(unref(dropdownStyle)),
1140
949
  role: "dialog",
1141
- "aria-label": "Date and time picker"
950
+ "aria-label": "Date and time picker",
951
+ onKeydown: _cache[0] || (_cache[0] = withKeys(withModifiers(($event) => unref(close)(true), ["prevent"]), ["escape"]))
1142
952
  }, [
1143
953
  createElementVNode("div", _hoisted_4$8, [createVNode(CalendarGridPanelInternal_default, {
1144
954
  "week-days": unref(weekDays),
@@ -1159,7 +969,7 @@ var DatePickerDateTimeInternal_default = /* @__PURE__ */ defineComponent({
1159
969
  "onNextMonth"
1160
970
  ])]),
1161
971
  _cache[3] || (_cache[3] = createElementVNode("div", { class: "mint-datetime-picker__divider" }, null, -1)),
1162
- createElementVNode("div", _hoisted_5$7, [_cache[2] || (_cache[2] = createElementVNode("div", { class: "mint-datetime-picker__time-label" }, "Time", -1)), createElementVNode("div", _hoisted_6$7, [(openBlock(true), createElementBlock(Fragment, null, renderList(timeSlots.value, (time) => {
972
+ createElementVNode("div", _hoisted_5$7, [_cache[2] || (_cache[2] = createElementVNode("div", { class: "mint-datetime-picker__time-label" }, "Time", -1)), createElementVNode("div", _hoisted_6$6, [(openBlock(true), createElementBlock(Fragment, null, renderList(timeSlots.value, (time) => {
1163
973
  return openBlock(), createElementBlock("button", {
1164
974
  key: time,
1165
975
  type: "button",
@@ -1186,7 +996,7 @@ var DatePickerDateTimeInternal_default = /* @__PURE__ */ defineComponent({
1186
996
  class: "mint-datetime-picker__footer-btn mint-datetime-picker__footer-btn--muted",
1187
997
  onClick: clear
1188
998
  }, " Clear ")) : createCommentVNode("", true)])
1189
- ], 512)) : createCommentVNode("", true)]),
999
+ ], 36)) : createCommentVNode("", true)]),
1190
1000
  _: 1
1191
1001
  })], 512);
1192
1002
  };
@@ -1203,18 +1013,14 @@ var _hoisted_2$7 = [
1203
1013
  "aria-controls",
1204
1014
  "aria-activedescendant"
1205
1015
  ];
1206
- var _hoisted_3$7 = {
1207
- key: 0,
1208
- class: "mint-popover mint-time-picker__dropdown"
1209
- };
1210
- var _hoisted_4$7 = [
1016
+ var _hoisted_3$7 = [
1211
1017
  "id",
1212
1018
  "aria-selected",
1213
1019
  "aria-disabled",
1214
1020
  "onClick"
1215
1021
  ];
1216
- var _hoisted_5$6 = { class: "mint-time-picker__slot-time" };
1217
- var _hoisted_6$6 = {
1022
+ var _hoisted_4$7 = { class: "mint-time-picker__slot-time" };
1023
+ var _hoisted_5$6 = {
1218
1024
  key: 0,
1219
1025
  class: "mint-time-picker__slot-reason"
1220
1026
  };
@@ -1250,16 +1056,21 @@ var DatePickerTimeInternal_default = /* @__PURE__ */ defineComponent({
1250
1056
  const props = __props;
1251
1057
  const emit = __emit;
1252
1058
  const listRef = ref(null);
1059
+ const dropdownRef = ref(null);
1253
1060
  const highlightedIndex = ref(-1);
1254
1061
  const listboxId = `mint-time-picker-listbox-${useId().replace(/:/g, "")}`;
1062
+ const rootRef = useTemplateRef("root");
1255
1063
  const { isOpen, open, close, toggle } = useDropdownState({
1256
- rootRef: useTemplateRef("root"),
1064
+ rootRef,
1257
1065
  triggerRef: useTemplateRef("trigger")
1258
1066
  });
1067
+ const { style: dropdownStyle } = useFloatingPanel(rootRef, dropdownRef, isOpen, { matchWidth: true });
1259
1068
  /** Id of the highlighted slot, published to the input as `aria-activedescendant`. */
1260
1069
  const activeSlotId = computed(() => isOpen.value && highlightedIndex.value >= 0 ? `${listboxId}-option-${highlightedIndex.value}` : void 0);
1261
1070
  const slots = computed(() => {
1262
- return generateTimeSlots(props.min ?? "00:00", props.max ?? "23:59", props.step);
1071
+ const start = props.min ?? "00:00";
1072
+ const end = props.max ?? "23:59";
1073
+ return generateTimeSlots(start, end, props.step);
1263
1074
  });
1264
1075
  const displayValue = computed(() => {
1265
1076
  if (!props.modelValue) return "";
@@ -1382,6 +1193,19 @@ var DatePickerTimeInternal_default = /* @__PURE__ */ defineComponent({
1382
1193
  class: "mint-time-picker",
1383
1194
  onKeydown: handleKeydown
1384
1195
  }, [createElementVNode("div", _hoisted_1$7, [
1196
+ _cache[1] || (_cache[1] = createElementVNode("div", { class: "mint-time-picker__icon" }, [createElementVNode("svg", {
1197
+ viewBox: "0 0 24 24",
1198
+ fill: "none",
1199
+ stroke: "currentColor",
1200
+ "stroke-width": "2",
1201
+ "stroke-linecap": "round",
1202
+ "stroke-linejoin": "round",
1203
+ "aria-hidden": "true"
1204
+ }, [createElementVNode("circle", {
1205
+ cx: "12",
1206
+ cy: "12",
1207
+ r: "10"
1208
+ }), createElementVNode("path", { d: "M12 6v6l4 2" })])], -1)),
1385
1209
  createElementVNode("input", {
1386
1210
  ref: "trigger",
1387
1211
  type: "text",
@@ -1415,19 +1239,7 @@ var DatePickerTimeInternal_default = /* @__PURE__ */ defineComponent({
1415
1239
  "stroke-width": "2",
1416
1240
  "stroke-linecap": "round",
1417
1241
  "stroke-linejoin": "round"
1418
- }, [createElementVNode("path", { d: "M18 6 6 18" }), createElementVNode("path", { d: "m6 6 12 12" })], -1)])])) : createCommentVNode("", true),
1419
- _cache[1] || (_cache[1] = createElementVNode("div", { class: "mint-time-picker__icon" }, [createElementVNode("svg", {
1420
- viewBox: "0 0 24 24",
1421
- fill: "none",
1422
- stroke: "currentColor",
1423
- "stroke-width": "2",
1424
- "stroke-linecap": "round",
1425
- "stroke-linejoin": "round"
1426
- }, [createElementVNode("circle", {
1427
- cx: "12",
1428
- cy: "12",
1429
- r: "10"
1430
- }), createElementVNode("path", { d: "M12 6v6l4 2" })])], -1))
1242
+ }, [createElementVNode("path", { d: "M18 6 6 18" }), createElementVNode("path", { d: "m6 6 12 12" })], -1)])])) : createCommentVNode("", true)
1431
1243
  ]), createVNode(Transition, {
1432
1244
  "enter-active-class": "mint-time-picker__dropdown-enter-active",
1433
1245
  "enter-from-class": "mint-time-picker__dropdown-enter-from",
@@ -1436,7 +1248,13 @@ var DatePickerTimeInternal_default = /* @__PURE__ */ defineComponent({
1436
1248
  "leave-from-class": "mint-time-picker__dropdown-leave-from",
1437
1249
  "leave-to-class": "mint-time-picker__dropdown-leave-to"
1438
1250
  }, {
1439
- default: withCtx(() => [unref(isOpen) ? (openBlock(), createElementBlock("div", _hoisted_3$7, [createElementVNode("ul", {
1251
+ default: withCtx(() => [unref(isOpen) ? (openBlock(), createElementBlock("div", {
1252
+ key: 0,
1253
+ ref_key: "dropdownRef",
1254
+ ref: dropdownRef,
1255
+ class: "mint-popover mint-time-picker__dropdown",
1256
+ style: normalizeStyle(unref(dropdownStyle))
1257
+ }, [createElementVNode("ul", {
1440
1258
  id: listboxId,
1441
1259
  ref_key: "listRef",
1442
1260
  ref: listRef,
@@ -1457,21 +1275,8 @@ var DatePickerTimeInternal_default = /* @__PURE__ */ defineComponent({
1457
1275
  index === highlightedIndex.value && !isSlotDisabled(slot) ? "mint-menu-item--active mint-time-picker__slot--highlighted" : ""
1458
1276
  ]),
1459
1277
  onClick: ($event) => selectSlot(slot)
1460
- }, [
1461
- createElementVNode("span", _hoisted_5$6, toDisplayString(unref(formatTimeSlot)(slot, __props.format)), 1),
1462
- slotReason(slot) ? (openBlock(), createElementBlock("span", _hoisted_6$6, toDisplayString(slotReason(slot)), 1)) : createCommentVNode("", true),
1463
- _cache[2] || (_cache[2] = createElementVNode("svg", {
1464
- class: "mint-menu-item__check",
1465
- viewBox: "0 0 16 16",
1466
- fill: "none",
1467
- stroke: "currentColor",
1468
- "stroke-width": "2",
1469
- "stroke-linecap": "round",
1470
- "stroke-linejoin": "round",
1471
- "aria-hidden": "true"
1472
- }, [createElementVNode("path", { d: "M3.5 8.5l3 3 6-7" })], -1))
1473
- ], 10, _hoisted_4$7);
1474
- }), 128))], 512)])) : createCommentVNode("", true)]),
1278
+ }, [createElementVNode("span", _hoisted_4$7, toDisplayString(unref(formatTimeSlot)(slot, __props.format)), 1), slotReason(slot) ? (openBlock(), createElementBlock("span", _hoisted_5$6, toDisplayString(slotReason(slot)), 1)) : createCommentVNode("", true)], 10, _hoisted_3$7);
1279
+ }), 128))], 512)], 4)) : createCommentVNode("", true)]),
1475
1280
  _: 1
1476
1281
  })], 544);
1477
1282
  };
@@ -1762,34 +1567,12 @@ var NumberUnitInputInternal_default = /* @__PURE__ */ defineComponent({
1762
1567
  emit("update:unit", newUnitValue);
1763
1568
  }
1764
1569
  const menuRef = ref(null);
1765
- const menuStyle = ref({ opacity: "0" });
1766
1570
  const { isOpen, rootRef, open, close } = useDropdownState({
1767
1571
  triggerRef: useTemplateRef("trigger"),
1768
- closeOnScroll: true,
1769
- insideRefs: [menuRef],
1770
- onOpen: () => {
1771
- menuStyle.value = { opacity: "0" };
1772
- }
1773
- });
1774
- /** Teleported + fixed like ActionMenu, so overflow:hidden/auto ancestors never clip the menu. */
1775
- watch(isOpen, async (opened) => {
1776
- if (!opened) return;
1777
- await nextTick();
1778
- if (!rootRef.value || !menuRef.value) return;
1779
- const { x, y } = await computePosition(rootRef.value, menuRef.value, {
1780
- placement: "bottom-end",
1781
- strategy: "fixed",
1782
- middleware: [
1783
- offset(4),
1784
- flip(),
1785
- shift({ padding: 8 })
1786
- ]
1787
- });
1788
- menuStyle.value = {
1789
- left: `${x}px`,
1790
- top: `${y}px`
1791
- };
1572
+ insideRefs: [menuRef]
1792
1573
  });
1574
+ /** Teleported + fixed like ActionMenu, so overflow:hidden/auto ancestors never clip the menu; it follows the field on scroll. */
1575
+ const { style: menuStyle } = useFloatingPanel(rootRef, menuRef, isOpen, { placement: "bottom-end" });
1793
1576
  function menuItems() {
1794
1577
  return menuRef.value ? Array.from(menuRef.value.querySelectorAll("[role=\"option\"]")) : [];
1795
1578
  }
@@ -1860,7 +1643,7 @@ var NumberUnitInputInternal_default = /* @__PURE__ */ defineComponent({
1860
1643
  ref_key: "menuRef",
1861
1644
  ref: menuRef,
1862
1645
  class: "mint-popover mint-unit-input__menu",
1863
- style: normalizeStyle(menuStyle.value),
1646
+ style: normalizeStyle(unref(menuStyle)),
1864
1647
  role: "listbox",
1865
1648
  "aria-label": "Unit",
1866
1649
  onKeydown: _cache[1] || (_cache[1] = (...args) => unref(handlePanelKeydown) && unref(handlePanelKeydown)(...args))
@@ -2178,30 +1961,97 @@ var NumberInput_default = /* @__PURE__ */ defineComponent({
2178
1961
  disabled: __props.disabled || !canDecrement.value,
2179
1962
  class: "mint-number-input__stepper mint-number-input__stepper--down",
2180
1963
  onClick: decrement
2181
- }, [..._cache[5] || (_cache[5] = [createElementVNode("svg", {
2182
- viewBox: "0 0 10 10",
2183
- fill: "none",
2184
- stroke: "currentColor",
2185
- "stroke-width": "1.6",
2186
- "stroke-linecap": "round"
2187
- }, [createElementVNode("path", { d: "M2 5h6" })], -1)])], 8, _hoisted_6$4), createElementVNode("button", {
1964
+ }, [createVNode(unref(ChevronDown), {
1965
+ size: 12,
1966
+ "stroke-width": 2.25
1967
+ })], 8, _hoisted_6$4), createElementVNode("button", {
2188
1968
  type: "button",
2189
1969
  tabindex: "-1",
2190
1970
  "aria-label": "Increase value",
2191
1971
  disabled: __props.disabled || !canIncrement.value,
2192
1972
  class: "mint-number-input__stepper mint-number-input__stepper--up",
2193
1973
  onClick: increment
2194
- }, [..._cache[6] || (_cache[6] = [createElementVNode("svg", {
2195
- viewBox: "0 0 10 10",
2196
- fill: "none",
2197
- stroke: "currentColor",
2198
- "stroke-width": "1.6",
2199
- "stroke-linecap": "round"
2200
- }, [createElementVNode("path", { d: "M5 2v6" }), createElementVNode("path", { d: "M2 5h6" })], -1)])], 8, _hoisted_7$4)])])], 6));
1974
+ }, [createVNode(unref(ChevronUp), {
1975
+ size: 12,
1976
+ "stroke-width": 2.25
1977
+ })], 8, _hoisted_7$4)])])], 6));
2201
1978
  };
2202
1979
  }
2203
1980
  });
2204
1981
  //#endregion
1982
+ //#region src/composables/usePlatform.ts
1983
+ var platformContext = ref({
1984
+ isIntegrated: false,
1985
+ theme: "system"
1986
+ });
1987
+ function storedTheme() {
1988
+ try {
1989
+ const s = localStorage.getItem("mint-settings");
1990
+ if (s) return JSON.parse(s).theme || "system";
1991
+ } catch {}
1992
+ return "system";
1993
+ }
1994
+ function detectPlatform() {
1995
+ const platformData = window.__MINT_PLATFORM__;
1996
+ if (platformData) {
1997
+ platformContext.value = {
1998
+ ...platformData,
1999
+ isIntegrated: true,
2000
+ theme: storedTheme()
2001
+ };
2002
+ return;
2003
+ }
2004
+ platformContext.value = {
2005
+ isIntegrated: new URLSearchParams(window.location.search).has("mint-plugin"),
2006
+ theme: storedTheme()
2007
+ };
2008
+ }
2009
+ var ACCESS_PERMISSIONS = {
2010
+ use: ["plugins.use"],
2011
+ configure: ["plugins.use", "plugins.configure"]
2012
+ };
2013
+ /**
2014
+ * Read the platform context the MINT platform injects into a plugin page.
2015
+ *
2016
+ * `can(access)` answers with the same three levels as the Python `access`
2017
+ * option. A page with no signed-in user passes every check when it runs
2018
+ * standalone or the platform reports `authRequired: false`; the platform
2019
+ * still checks every request.
2020
+ *
2021
+ * @example
2022
+ * ```typescript
2023
+ * const platform = usePlatform()
2024
+ * const canConfigure = computed(() => platform.can('configure'))
2025
+ * ```
2026
+ */
2027
+ function usePlatform() {
2028
+ detectPlatform();
2029
+ const integrated = computed(() => platformContext.value.isIntegrated);
2030
+ const plugin = computed(() => platformContext.value.plugin);
2031
+ const user = computed(() => platformContext.value.user);
2032
+ const theme = computed(() => platformContext.value.theme);
2033
+ const features = computed(() => platformContext.value.features);
2034
+ function can(access) {
2035
+ const current = user.value;
2036
+ if (!current) return !integrated.value || platformContext.value.authRequired === false;
2037
+ if (isAdminUser(current)) return true;
2038
+ if (access === "admin" || !hasAllPermissions(current, ACCESS_PERMISSIONS[access])) return false;
2039
+ const visible = getRoleInfo(current)?.plugin_access;
2040
+ if (!visible || visible === "all") return true;
2041
+ const names = [plugin.value?.id, plugin.value?.route_prefix?.replace(/^\/+|\/+$/g, "")];
2042
+ return Array.isArray(visible) && names.some((name) => !!name && visible.includes(name));
2043
+ }
2044
+ return {
2045
+ integrated,
2046
+ plugin,
2047
+ user,
2048
+ theme,
2049
+ features,
2050
+ isAdmin: computed(() => can("admin")),
2051
+ can
2052
+ };
2053
+ }
2054
+ //#endregion
2205
2055
  //#region src/composables/eventStream.ts
2206
2056
  var EventStreamResponseError = class extends Error {
2207
2057
  response;
@@ -5050,79 +4900,6 @@ function optionValue(option) {
5050
4900
  return option;
5051
4901
  }
5052
4902
  //#endregion
5053
- //#region src/composables/usePlatform.ts
5054
- var platformContext = ref({
5055
- isIntegrated: false,
5056
- theme: "system"
5057
- });
5058
- function storedTheme() {
5059
- try {
5060
- const s = localStorage.getItem("mint-settings");
5061
- if (s) return JSON.parse(s).theme || "system";
5062
- } catch {}
5063
- return "system";
5064
- }
5065
- function detectPlatform() {
5066
- const platformData = window.__MINT_PLATFORM__;
5067
- if (platformData) {
5068
- platformContext.value = {
5069
- ...platformData,
5070
- isIntegrated: true,
5071
- theme: storedTheme()
5072
- };
5073
- return;
5074
- }
5075
- platformContext.value = {
5076
- isIntegrated: new URLSearchParams(window.location.search).has("mint-plugin"),
5077
- theme: storedTheme()
5078
- };
5079
- }
5080
- var ACCESS_PERMISSIONS = {
5081
- use: ["plugins.use"],
5082
- configure: ["plugins.use", "plugins.configure"]
5083
- };
5084
- /**
5085
- * Read the platform context the MINT platform injects into a plugin page.
5086
- *
5087
- * `can(access)` answers with the same three levels as the Python `access`
5088
- * option. A page with no signed-in user passes every check when it runs
5089
- * standalone or the platform reports `authRequired: false`; the platform
5090
- * still checks every request.
5091
- *
5092
- * @example
5093
- * ```typescript
5094
- * const platform = usePlatform()
5095
- * const canConfigure = computed(() => platform.can('configure'))
5096
- * ```
5097
- */
5098
- function usePlatform() {
5099
- detectPlatform();
5100
- const integrated = computed(() => platformContext.value.isIntegrated);
5101
- const plugin = computed(() => platformContext.value.plugin);
5102
- const user = computed(() => platformContext.value.user);
5103
- const theme = computed(() => platformContext.value.theme);
5104
- const features = computed(() => platformContext.value.features);
5105
- function can(access) {
5106
- const current = user.value;
5107
- if (!current) return !integrated.value || platformContext.value.authRequired === false;
5108
- if (isAdminUser(current)) return true;
5109
- if (access === "admin" || !hasAllPermissions(current, ACCESS_PERMISSIONS[access])) return false;
5110
- const visible = getRoleInfo(current)?.plugin_access;
5111
- if (!visible || visible === "all") return true;
5112
- const names = [plugin.value?.id, plugin.value?.route_prefix?.replace(/^\/+|\/+$/g, "")];
5113
- return Array.isArray(visible) && names.some((name) => !!name && visible.includes(name));
5114
- }
5115
- return {
5116
- integrated,
5117
- plugin,
5118
- user,
5119
- theme,
5120
- features,
5121
- isAdmin: computed(() => can("admin")),
5122
- can
5123
- };
5124
- }
5125
- //#endregion
5126
4903
  //#region src/components/StepWizard.vue?vue&type=script&setup=true&lang.ts
5127
4904
  var _hoisted_1 = {
5128
4905
  key: 0,
@@ -5165,7 +4942,8 @@ var StepWizard_default = /* @__PURE__ */ defineComponent({
5165
4942
  type: Boolean,
5166
4943
  default: true
5167
4944
  },
5168
- size: { default: "md" }
4945
+ size: { default: "md" },
4946
+ orientation: { default: "horizontal" }
5169
4947
  },
5170
4948
  emits: [
5171
4949
  "update:modelValue",
@@ -5232,7 +5010,11 @@ var StepWizard_default = /* @__PURE__ */ defineComponent({
5232
5010
  __expose({ setStepValid });
5233
5011
  return (_ctx, _cache) => {
5234
5012
  return openBlock(), createElementBlock("div", {
5235
- class: normalizeClass(["mint-wizard", `mint-wizard--${props.size}`]),
5013
+ class: normalizeClass([
5014
+ "mint-wizard",
5015
+ `mint-wizard--${props.size}`,
5016
+ { "mint-wizard--vertical": props.orientation === "vertical" }
5017
+ ]),
5236
5018
  tabindex: "0",
5237
5019
  onKeydown: handleKeydown
5238
5020
  }, [
@@ -5457,6 +5239,6 @@ function useListReorder(options) {
5457
5239
  };
5458
5240
  }
5459
5241
  //#endregion
5460
- export { createGeneratedAnalysisTransport as A, defineDataFrame as B, useSequenceUtils as C, GeneratedPathInput_default as D, renderFormulaParts as E, compareTime as F, useSortedItems as G, definePluginWorkspaceView as H, durationMinutes as I, BaseSlider_default as K, formatTime as L, createEventStream as M, NumberInput_default as N, _plugin_vue_export_helper_default as O, DatePicker_default as P, time_exports as R, SequenceInput_default as S, formula_exports as T, defineWellPlate as U, definePlateEditor as V, compareSortValues as W, getFieldRegistryEntry as _, StepWizard_default as a, useConcentrationUnits as b, normalizeControlDefinition as c, humanize as d, numericValue as f, replaceRecord as g, recordValue as h, useReorderAnnouncer as i, useJobsEndpoint as j, GENERATED_JOBS_API_KEY as k, normalizeControls as l, orderedUnique as m, reorderList as n, usePlatform as o, omitUndefined as p, BaseRadioGroup_default as q, useListReorder as r, defaultValueForControl as s, REORDER_ANNOUNCER_STYLE as t, normalizeOption as u, getTypeDefault as v, FormulaInput_default as w, MoleculeInput_default as x, ConcentrationInput_default as y, applySpecDefaults as z };
5242
+ export { useJobsEndpoint as A, compareSortValues as B, FormulaInput_default as C, _plugin_vue_export_helper_default as D, GeneratedPathInput_default as E, applySpecDefaults as F, BaseSlider_default as H, defineDataFrame as I, definePlateEditor as L, usePlatform as M, NumberInput_default as N, GENERATED_JOBS_API_KEY as O, DatePicker_default as P, definePluginWorkspaceView as R, useSequenceUtils as S, renderFormulaParts as T, BaseRadioGroup_default as U, useSortedItems as V, getTypeDefault as _, StepWizard_default as a, MoleculeInput_default as b, normalizeControls as c, numericValue as d, omitUndefined as f, getFieldRegistryEntry as g, replaceRecord as h, useReorderAnnouncer as i, createEventStream as j, createGeneratedAnalysisTransport as k, normalizeOption as l, recordValue as m, reorderList as n, defaultValueForControl as o, orderedUnique as p, useListReorder as r, normalizeControlDefinition as s, REORDER_ANNOUNCER_STYLE as t, humanize as u, ConcentrationInput_default as v, formula_exports as w, SequenceInput_default as x, useConcentrationUnits as y, defineWellPlate as z };
5461
5243
 
5462
- //# sourceMappingURL=useListReorder-CcbEYxX-.js.map
5244
+ //# sourceMappingURL=useListReorder-DsuzwWGS.js.map