@morscherlab/mint-sdk 1.4.0-beta.2 → 1.4.0-beta.21

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,7 +1,8 @@
1
- import { a as __exportAll, i as BaseButton_default, r as useEventListener } from "./BaseModal-DfRIuVoj.js";
2
- import { t as useExperimentStore } from "./experiment-43OJtH7R.js";
3
- import { Fragment, Teleport, TransitionGroup, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createTextVNode, createVNode, defineComponent, guardReactiveProps, mergeProps, nextTick, normalizeClass, normalizeProps, normalizeStyle, onBeforeUnmount, onScopeDispose, openBlock, provide, reactive, ref, renderList, renderSlot, toDisplayString, toValue, unref, useAttrs, useId, useSlots, useTemplateRef, vModelText, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
4
- import { computePosition, flip, offset, shift } from "@floating-ui/dom";
1
+ import { a as BaseButton_default, i as useEventListener, o as __exportAll, t as useDropdownState } from "./useDropdownState-uFIz6Yv8.js";
2
+ import { t as useExperimentStore } from "./experiment-DyO54FQB.js";
3
+ import { Fragment, Teleport, TransitionGroup, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createTextVNode, createVNode, defineComponent, guardReactiveProps, mergeProps, nextTick, normalizeClass, normalizeProps, normalizeStyle, onBeforeUnmount, onScopeDispose, openBlock, provide, ref, renderList, renderSlot, toDisplayString, toValue, unref, useAttrs, useId, useSlots, useTemplateRef, vModelText, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
4
+ import { Check, ChevronDown, ChevronsUpDown, X } from "lucide-vue-next";
5
+ import { autoUpdate, computePosition, flip, hide, offset, shift, size } from "@floating-ui/dom";
5
6
  //#region src/components/BaseInput.vue?vue&type=script&setup=true&lang.ts
6
7
  var _hoisted_1$12 = [
7
8
  "value",
@@ -206,6 +207,84 @@ function findOptionByDomValue(options, value) {
206
207
  return options.find((option) => String(option.value) === value);
207
208
  }
208
209
  //#endregion
210
+ //#region src/composables/useFloatingPanel.ts
211
+ /**
212
+ * Places `floating` next to `reference` with fixed positioning (offset, flip,
213
+ * shift, size, hide). A fixed panel escapes the `overflow` of its ancestors (a
214
+ * modal body) unless one of them has a transform, so it can stay in the DOM right
215
+ * after its trigger: Tab order, focus traps and outside-click checks are those of
216
+ * an in-place panel. The size middleware publishes the free height as
217
+ * `--mint-floating-available-height`; a panel whose list scrolls caps its
218
+ * `max-height` with it.
219
+ */
220
+ function useFloatingPanel(reference, floating, open, options = {}) {
221
+ const style = ref({
222
+ position: "fixed",
223
+ left: "0px",
224
+ top: "0px"
225
+ });
226
+ const placement = ref(toValue(options.placement) ?? "bottom-start");
227
+ async function update() {
228
+ const referenceEl = toValue(reference);
229
+ const floatingEl = floating.value;
230
+ if (!referenceEl || !floatingEl) return;
231
+ const result = await computePosition(referenceEl, floatingEl, {
232
+ placement: toValue(options.placement) ?? "bottom-start",
233
+ strategy: "fixed",
234
+ middleware: [
235
+ offset(options.offset ?? 4),
236
+ flip(),
237
+ shift({ padding: 8 }),
238
+ size({
239
+ padding: 8,
240
+ apply({ availableHeight, rects, elements }) {
241
+ const target = elements.floating.style;
242
+ target.setProperty("--mint-floating-available-height", `${Math.max(0, availableHeight)}px`);
243
+ if (options.matchWidth) {
244
+ target.minWidth = `${rects.reference.width}px`;
245
+ target.maxWidth = "28rem";
246
+ }
247
+ }
248
+ }),
249
+ hide()
250
+ ]
251
+ });
252
+ const next = {
253
+ position: "fixed",
254
+ left: `${result.x}px`,
255
+ top: `${result.y}px`
256
+ };
257
+ if (result.middlewareData.hide?.referenceHidden) next.visibility = "hidden";
258
+ const current = style.value;
259
+ if (current.left !== next.left || current.top !== next.top || current.visibility !== next.visibility) style.value = next;
260
+ placement.value = result.placement;
261
+ }
262
+ let stop;
263
+ function release() {
264
+ stop?.();
265
+ stop = void 0;
266
+ }
267
+ watch([
268
+ open,
269
+ () => toValue(reference),
270
+ floating
271
+ ], ([isOpen, referenceEl, floatingEl]) => {
272
+ release();
273
+ if (!isOpen || !referenceEl || !floatingEl) return;
274
+ if (options.follow ?? true) stop = autoUpdate(referenceEl, floatingEl, () => void update());
275
+ else update();
276
+ }, {
277
+ flush: "post",
278
+ immediate: true
279
+ });
280
+ onScopeDispose(release);
281
+ return {
282
+ style,
283
+ placement,
284
+ update
285
+ };
286
+ }
287
+ //#endregion
209
288
  //#region src/composables/useSelectionLimit.ts
210
289
  /** Shared cap logic for chip, tag, and multi-select controls. */
211
290
  function useSelectionLimit(options) {
@@ -327,25 +406,38 @@ function uniqueValues(values) {
327
406
  }
328
407
  //#endregion
329
408
  //#region src/components/internal/SelectMultipleInternal.vue?vue&type=script&setup=true&lang.ts
330
- var _hoisted_1$11 = {
409
+ var _hoisted_1$11 = [
410
+ "tabindex",
411
+ "aria-expanded",
412
+ "aria-disabled",
413
+ "aria-invalid",
414
+ "aria-labelledby",
415
+ "aria-describedby"
416
+ ];
417
+ var _hoisted_2$11 = { class: "mint-multi-select__chips" };
418
+ var _hoisted_3$11 = ["aria-label", "onClick"];
419
+ var _hoisted_4$8 = {
331
420
  key: 0,
332
421
  class: "mint-multi-select__placeholder"
333
422
  };
334
- var _hoisted_2$11 = ["aria-invalid"];
335
- var _hoisted_3$11 = [
336
- "aria-checked",
337
- "disabled",
338
- "onClick",
339
- "onKeydown"
423
+ var _hoisted_5$8 = { class: "mint-searchable-select__search-wrap" };
424
+ var _hoisted_6$8 = ["aria-expanded", "aria-activedescendant"];
425
+ var _hoisted_7$7 = [
426
+ "id",
427
+ "aria-selected",
428
+ "aria-disabled",
429
+ "onMouseenter",
430
+ "onClick"
340
431
  ];
341
- var _hoisted_4$8 = { class: "mint-multi-select__chip-label" };
342
- var _hoisted_5$8 = {
343
- key: 1,
344
- class: "mint-multi-select__summary"
432
+ var _hoisted_8$3 = { class: "mint-menu-item__label" };
433
+ var _hoisted_9$3 = {
434
+ key: 0,
435
+ class: "mint-searchable-select__empty"
345
436
  };
346
437
  //#endregion
347
438
  //#region src/components/internal/SelectMultipleInternal.vue
348
439
  var SelectMultipleInternal_default = /* @__PURE__ */ defineComponent({
440
+ inheritAttrs: false,
349
441
  __name: "SelectMultipleInternal",
350
442
  props: {
351
443
  modelValue: {},
@@ -360,79 +452,211 @@ var SelectMultipleInternal_default = /* @__PURE__ */ defineComponent({
360
452
  default: false
361
453
  },
362
454
  max: { default: void 0 },
363
- size: { default: "md" }
455
+ size: { default: "md" },
456
+ ariaLabelledby: { default: void 0 },
457
+ ariaDescribedby: { default: void 0 }
364
458
  },
365
459
  emits: ["update:modelValue"],
366
460
  setup(__props, { emit: __emit }) {
367
- /** BaseSelect with `multiple`: a checkbox chip list with an optional selection cap (`max`). */
461
+ /** BaseSelect with `multiple`: a field of removable chips that opens a filterable checkbox listbox, capped by `max`. */
368
462
  const props = __props;
463
+ const attrs = useAttrs();
464
+ const fieldAttrs = computed(() => {
465
+ const { class: _class, style: _style, ...rest } = attrs;
466
+ return rest;
467
+ });
369
468
  const emit = __emit;
469
+ const listboxId = `mint-multi-select-${useId().replace(/:/g, "")}`;
470
+ const root = ref(null);
471
+ const field = ref(null);
472
+ const search = ref(null);
473
+ const panel = ref(null);
474
+ const open = ref(false);
475
+ const query = ref("");
476
+ const activeIndex = ref(-1);
370
477
  const normalizedOptions = computed(() => props.options.map(normalizeOptionInput));
371
- const optionSelection = useListSelection({
478
+ const selection = useListSelection({
372
479
  selected: () => props.modelValue,
373
480
  items: normalizedOptions,
374
481
  getValue: (option) => option.value,
375
482
  disabled: () => props.disabled,
376
483
  max: () => props.max
377
484
  });
378
- const canSelectMore = optionSelection.canAddMore;
379
- function isSelected(value) {
380
- return optionSelection.isSelected(value);
485
+ const chips = computed(() => props.modelValue.map((value) => ({
486
+ value,
487
+ label: normalizedOptions.value.find((option) => option.value === value)?.label ?? String(value)
488
+ })));
489
+ const visibleOptions = computed(() => {
490
+ const needle = query.value.trim().toLocaleLowerCase();
491
+ if (!needle) return normalizedOptions.value;
492
+ return normalizedOptions.value.filter((option) => option.label.toLocaleLowerCase().includes(needle));
493
+ });
494
+ const activeDescendant = computed(() => activeIndex.value >= 0 ? `${listboxId}-option-${activeIndex.value}` : void 0);
495
+ function isUnavailable(option) {
496
+ return !!option.disabled || !selection.isSelected(option.value) && !selection.canAddMore.value;
381
497
  }
382
- function toggleOption(option) {
383
- if (props.disabled || option.disabled) return;
384
- if (isSelected(option.value) || canSelectMore.value) emit("update:modelValue", optionSelection.toggleValue(option.value));
498
+ async function openPanel() {
499
+ if (props.disabled || open.value) return;
500
+ query.value = "";
501
+ open.value = true;
502
+ activeIndex.value = visibleOptions.value.length > 0 ? 0 : -1;
503
+ await nextTick();
504
+ search.value?.focus();
385
505
  }
386
- function handleKeydown(event, option) {
387
- if (event.key === "Enter" || event.key === " ") {
388
- event.preventDefault();
389
- toggleOption(option);
506
+ async function closePanel(restoreFocus = false) {
507
+ open.value = false;
508
+ query.value = "";
509
+ activeIndex.value = -1;
510
+ if (restoreFocus) {
511
+ await nextTick();
512
+ field.value?.focus();
390
513
  }
391
514
  }
392
- const selectedLabels = computed(() => {
393
- return props.modelValue.map((v) => normalizedOptions.value.find((o) => o.value === v)?.label).filter(Boolean);
515
+ function moveActive(direction) {
516
+ const count = visibleOptions.value.length;
517
+ if (count === 0) return;
518
+ const start = activeIndex.value < 0 ? direction === 1 ? -1 : count : activeIndex.value;
519
+ activeIndex.value = (start + direction + count) % count;
520
+ nextTick(() => document.getElementById(activeDescendant.value ?? "")?.scrollIntoView({ block: "nearest" }));
521
+ }
522
+ function toggle(option) {
523
+ if (props.disabled || isUnavailable(option)) return;
524
+ emit("update:modelValue", selection.toggleValue(option.value));
525
+ }
526
+ function remove(value) {
527
+ if (props.disabled) return;
528
+ emit("update:modelValue", props.modelValue.filter((selected) => selected !== value));
529
+ }
530
+ function handleFieldKeydown(event) {
531
+ if (event.key !== "Enter" && event.key !== " " && event.key !== "ArrowDown") return;
532
+ event.preventDefault();
533
+ openPanel();
534
+ }
535
+ function handleSearchKeydown(event) {
536
+ if (event.key === "ArrowDown") moveActive(1);
537
+ else if (event.key === "ArrowUp") moveActive(-1);
538
+ else if (event.key === "Enter") {
539
+ const option = visibleOptions.value[activeIndex.value];
540
+ if (option) toggle(option);
541
+ } else if (event.key === "Escape") closePanel(true);
542
+ else if (event.key === "Backspace" && query.value === "" && props.modelValue.length > 0) remove(props.modelValue[props.modelValue.length - 1]);
543
+ else return;
544
+ event.preventDefault();
545
+ }
546
+ const { style: panelStyle } = useFloatingPanel(field, panel, open, { matchWidth: true });
547
+ watch(visibleOptions, (options) => {
548
+ activeIndex.value = options.length > 0 ? 0 : -1;
549
+ });
550
+ watch(() => props.disabled, (disabled) => {
551
+ if (disabled) closePanel();
552
+ });
553
+ useEventListener(() => document, "pointerdown", (event) => {
554
+ if (open.value && !root.value?.contains(event.target)) closePanel();
394
555
  });
395
556
  return (_ctx, _cache) => {
396
- return openBlock(), createElementBlock("div", { class: normalizeClass([
397
- "mint-multi-select",
398
- `mint-multi-select--${__props.size}`,
399
- __props.disabled ? "mint-multi-select--disabled" : "",
400
- __props.invalid ? "mint-multi-select--error" : ""
401
- ]) }, [
402
- __props.modelValue.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_1$11, toDisplayString(__props.placeholder), 1)) : createCommentVNode("", true),
403
- createElementVNode("div", {
404
- class: "mint-multi-select__options",
405
- role: "group",
406
- "aria-invalid": __props.invalid || void 0
407
- }, [(openBlock(true), createElementBlock(Fragment, null, renderList(normalizedOptions.value, (option) => {
408
- return openBlock(), createElementBlock("button", {
409
- key: String(option.value),
410
- type: "button",
411
- role: "checkbox",
412
- "aria-checked": isSelected(option.value),
413
- disabled: __props.disabled || option.disabled || !isSelected(option.value) && !unref(canSelectMore),
414
- class: normalizeClass([
415
- "mint-multi-select__chip",
416
- `mint-multi-select__chip--${__props.size}`,
417
- isSelected(option.value) ? "mint-multi-select__chip--active" : "",
418
- option.disabled ? "mint-multi-select__chip--disabled" : "",
419
- !isSelected(option.value) && !unref(canSelectMore) ? "mint-multi-select__chip--disabled" : ""
420
- ]),
421
- onClick: ($event) => toggleOption(option),
422
- onKeydown: ($event) => handleKeydown($event, option)
423
- }, [_cache[0] || (_cache[0] = createElementVNode("svg", {
424
- class: "mint-multi-select__chip-check",
425
- viewBox: "0 0 24 24",
426
- fill: "none",
427
- stroke: "currentColor",
428
- "stroke-width": "2.5",
429
- "stroke-linecap": "round",
430
- "stroke-linejoin": "round",
431
- "aria-hidden": "true"
432
- }, [createElementVNode("path", { d: "M20 6 9 17l-5-5" })], -1)), createElementVNode("span", _hoisted_4$8, toDisplayString(option.label), 1)], 42, _hoisted_3$11);
433
- }), 128))], 8, _hoisted_2$11),
434
- __props.modelValue.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_5$8, toDisplayString(selectedLabels.value.join(", ")), 1)) : createCommentVNode("", true)
435
- ], 2);
557
+ return openBlock(), createElementBlock("div", {
558
+ ref_key: "root",
559
+ ref: root,
560
+ class: normalizeClass([
561
+ "mint-multi-select",
562
+ `mint-multi-select--${__props.size}`,
563
+ _ctx.$attrs.class
564
+ ]),
565
+ style: normalizeStyle(_ctx.$attrs.style),
566
+ onFocusout: _cache[3] || (_cache[3] = ($event) => !root.value?.contains($event.relatedTarget) && closePanel())
567
+ }, [createElementVNode("div", mergeProps(fieldAttrs.value, {
568
+ ref_key: "field",
569
+ ref: field,
570
+ role: "combobox",
571
+ tabindex: __props.disabled ? void 0 : 0,
572
+ class: ["mint-multi-select__field", {
573
+ "mint-multi-select__field--open": open.value,
574
+ "mint-multi-select__field--error": __props.invalid,
575
+ "mint-multi-select__field--disabled": __props.disabled
576
+ }],
577
+ "aria-haspopup": "listbox",
578
+ "aria-expanded": open.value,
579
+ "aria-controls": listboxId,
580
+ "aria-disabled": __props.disabled || void 0,
581
+ "aria-invalid": __props.invalid || void 0,
582
+ "aria-labelledby": __props.ariaLabelledby || void 0,
583
+ "aria-describedby": __props.ariaDescribedby || void 0,
584
+ onClick: _cache[0] || (_cache[0] = ($event) => open.value ? closePanel() : openPanel()),
585
+ onKeydown: withModifiers(handleFieldKeydown, ["self"])
586
+ }), [createElementVNode("div", _hoisted_2$11, [(openBlock(true), createElementBlock(Fragment, null, renderList(chips.value, (chip) => {
587
+ return openBlock(), createElementBlock("span", {
588
+ key: String(chip.value),
589
+ class: "mint-multi-select__chip"
590
+ }, [createTextVNode(toDisplayString(chip.label) + " ", 1), !__props.disabled ? (openBlock(), createElementBlock("button", {
591
+ key: 0,
592
+ type: "button",
593
+ tabindex: "-1",
594
+ class: "mint-multi-select__chip-remove",
595
+ "aria-label": `Remove ${chip.label}`,
596
+ onClick: withModifiers(($event) => remove(chip.value), ["stop"])
597
+ }, [createVNode(unref(X), {
598
+ size: 11,
599
+ "stroke-width": 2.25,
600
+ "aria-hidden": "true"
601
+ })], 8, _hoisted_3$11)) : createCommentVNode("", true)]);
602
+ }), 128)), chips.value.length === 0 ? (openBlock(), createElementBlock("span", _hoisted_4$8, toDisplayString(__props.placeholder), 1)) : createCommentVNode("", true)]), createVNode(unref(ChevronDown), {
603
+ class: "mint-multi-select__icon",
604
+ size: 14,
605
+ "aria-hidden": "true"
606
+ })], 16, _hoisted_1$11), open.value ? (openBlock(), createElementBlock("div", {
607
+ key: 0,
608
+ ref_key: "panel",
609
+ ref: panel,
610
+ class: "mint-popover mint-searchable-select__panel",
611
+ style: normalizeStyle(unref(panelStyle))
612
+ }, [createElementVNode("div", _hoisted_5$8, [_cache[4] || (_cache[4] = createElementVNode("svg", {
613
+ viewBox: "0 0 20 20",
614
+ fill: "none",
615
+ stroke: "currentColor",
616
+ "aria-hidden": "true"
617
+ }, [createElementVNode("circle", {
618
+ cx: "8.5",
619
+ cy: "8.5",
620
+ r: "5.5"
621
+ }), createElementVNode("path", { d: "m13 13 4 4" })], -1)), withDirectives(createElementVNode("input", {
622
+ ref_key: "search",
623
+ ref: search,
624
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => query.value = $event),
625
+ role: "combobox",
626
+ type: "search",
627
+ class: "mint-searchable-select__search",
628
+ placeholder: "Filter…",
629
+ "aria-label": "Filter options",
630
+ "aria-expanded": open.value,
631
+ "aria-controls": listboxId,
632
+ "aria-activedescendant": activeDescendant.value,
633
+ "aria-autocomplete": "list",
634
+ onKeydown: handleSearchKeydown
635
+ }, null, 40, _hoisted_6$8), [[vModelText, query.value]])]), createElementVNode("ul", {
636
+ id: listboxId,
637
+ class: "mint-searchable-select__list",
638
+ role: "listbox",
639
+ "aria-multiselectable": "true"
640
+ }, [(openBlock(true), createElementBlock(Fragment, null, renderList(visibleOptions.value, (option, index) => {
641
+ return openBlock(), createElementBlock("li", {
642
+ id: `${listboxId}-option-${index}`,
643
+ key: String(option.value),
644
+ role: "option",
645
+ class: normalizeClass(["mint-menu-item mint-multi-select__option", { "mint-menu-item--active": activeIndex.value === index }]),
646
+ "aria-selected": unref(selection).isSelected(option.value),
647
+ "aria-disabled": isUnavailable(option) || void 0,
648
+ onMousedown: _cache[2] || (_cache[2] = withModifiers(() => {}, ["prevent"])),
649
+ onMouseenter: ($event) => !isUnavailable(option) && (activeIndex.value = index),
650
+ onClick: ($event) => toggle(option)
651
+ }, [createElementVNode("span", {
652
+ class: normalizeClass(["mint-multi-select__check", { "mint-multi-select__check--on": unref(selection).isSelected(option.value) }]),
653
+ "aria-hidden": "true"
654
+ }, [unref(selection).isSelected(option.value) ? (openBlock(), createBlock(unref(Check), {
655
+ key: 0,
656
+ size: 10,
657
+ "stroke-width": 3.5
658
+ })) : createCommentVNode("", true)], 2), createElementVNode("span", _hoisted_8$3, toDisplayString(option.label), 1)], 42, _hoisted_7$7);
659
+ }), 128)), visibleOptions.value.length === 0 ? (openBlock(), createElementBlock("li", _hoisted_9$3, "No matching options")) : createCommentVNode("", true)])], 4)) : createCommentVNode("", true)], 38);
436
660
  };
437
661
  }
438
662
  });
@@ -445,39 +669,35 @@ var _hoisted_1$10 = [
445
669
  "aria-invalid",
446
670
  "aria-expanded"
447
671
  ];
448
- var _hoisted_2$10 = {
449
- key: 0,
450
- class: "mint-popover mint-searchable-select__panel"
451
- };
452
- var _hoisted_3$10 = { class: "mint-searchable-select__search-wrap" };
453
- var _hoisted_4$7 = [
672
+ var _hoisted_2$10 = { class: "mint-searchable-select__search-wrap" };
673
+ var _hoisted_3$10 = [
454
674
  "placeholder",
455
675
  "aria-label",
456
676
  "aria-expanded",
457
677
  "aria-activedescendant"
458
678
  ];
459
- var _hoisted_5$7 = [
679
+ var _hoisted_4$7 = [
460
680
  "id",
461
681
  "aria-selected",
462
682
  "aria-disabled",
463
683
  "onMouseenter",
464
684
  "onClick"
465
685
  ];
466
- var _hoisted_6$7 = { class: "mint-menu-item__text mint-searchable-select__option-text" };
467
- var _hoisted_7$6 = { class: "mint-menu-item__label mint-searchable-select__option-label" };
468
- var _hoisted_8$2 = {
686
+ var _hoisted_5$7 = { class: "mint-menu-item__text mint-searchable-select__option-text" };
687
+ var _hoisted_6$7 = { class: "mint-menu-item__label mint-searchable-select__option-label" };
688
+ var _hoisted_7$6 = {
469
689
  key: 0,
470
690
  class: "mint-menu-item__description mint-searchable-select__option-description"
471
691
  };
472
- var _hoisted_9$2 = {
692
+ var _hoisted_8$2 = {
473
693
  key: 0,
474
694
  class: "mint-menu-item__meta mint-searchable-select__option-meta"
475
695
  };
476
- var _hoisted_10$2 = {
696
+ var _hoisted_9$2 = {
477
697
  key: 0,
478
698
  class: "mint-searchable-select__empty"
479
699
  };
480
- var _hoisted_11$2 = {
700
+ var _hoisted_10$2 = {
481
701
  key: 0,
482
702
  class: "mint-searchable-select__footer"
483
703
  };
@@ -519,6 +739,7 @@ var SelectSearchableInternal_default = /* @__PURE__ */ defineComponent({
519
739
  const root = ref(null);
520
740
  const trigger = ref(null);
521
741
  const search = ref(null);
742
+ const panel = ref(null);
522
743
  const open = ref(false);
523
744
  const query = ref("");
524
745
  const activeIndex = ref(-1);
@@ -594,6 +815,7 @@ var SelectSearchableInternal_default = /* @__PURE__ */ defineComponent({
594
815
  if (event.key === "ArrowUp") moveActive(-1);
595
816
  });
596
817
  }
818
+ const { style: panelStyle } = useFloatingPanel(trigger, panel, open, { matchWidth: true });
597
819
  watch(visibleOptions, (options) => {
598
820
  activeIndex.value = firstEnabledIndex(options);
599
821
  });
@@ -629,18 +851,17 @@ var SelectSearchableInternal_default = /* @__PURE__ */ defineComponent({
629
851
  "aria-haspopup": "listbox",
630
852
  onClick: _cache[0] || (_cache[0] = ($event) => open.value ? closePanel() : openPanel()),
631
853
  onKeydown: handleTriggerKeydown
632
- }), [createElementVNode("span", { class: normalizeClass(["mint-searchable-select__value", { "mint-searchable-select__value--placeholder": !selectedOption.value }]) }, toDisplayString(selectedOption.value?.label ?? __props.placeholder), 3), _cache[4] || (_cache[4] = createElementVNode("svg", {
633
- viewBox: "0 0 20 20",
634
- fill: "none",
635
- stroke: "currentColor",
854
+ }), [createElementVNode("span", { class: normalizeClass(["mint-searchable-select__value", { "mint-searchable-select__value--placeholder": !selectedOption.value }]) }, toDisplayString(selectedOption.value?.label ?? __props.placeholder), 3), createVNode(unref(ChevronsUpDown), {
855
+ size: 14,
636
856
  "aria-hidden": "true"
637
- }, [createElementVNode("path", {
638
- "stroke-linecap": "round",
639
- "stroke-linejoin": "round",
640
- "stroke-width": "1.75",
641
- d: "m6 8 4 4 4-4"
642
- })], -1))], 16, _hoisted_1$10), open.value ? (openBlock(), createElementBlock("div", _hoisted_2$10, [
643
- createElementVNode("div", _hoisted_3$10, [_cache[5] || (_cache[5] = createElementVNode("svg", {
857
+ })], 16, _hoisted_1$10), open.value ? (openBlock(), createElementBlock("div", {
858
+ key: 0,
859
+ ref_key: "panel",
860
+ ref: panel,
861
+ class: "mint-popover mint-searchable-select__panel",
862
+ style: normalizeStyle(unref(panelStyle))
863
+ }, [
864
+ createElementVNode("div", _hoisted_2$10, [_cache[4] || (_cache[4] = createElementVNode("svg", {
644
865
  viewBox: "0 0 20 20",
645
866
  fill: "none",
646
867
  stroke: "currentColor",
@@ -663,7 +884,7 @@ var SelectSearchableInternal_default = /* @__PURE__ */ defineComponent({
663
884
  "aria-activedescendant": activeDescendant.value,
664
885
  "aria-autocomplete": "list",
665
886
  onKeydown: handleSearchKeydown
666
- }, null, 40, _hoisted_4$7), [[vModelText, query.value]])]),
887
+ }, null, 40, _hoisted_3$10), [[vModelText, query.value]])]),
667
888
  createElementVNode("ul", {
668
889
  id: listboxId,
669
890
  class: "mint-searchable-select__list",
@@ -688,9 +909,9 @@ var SelectSearchableInternal_default = /* @__PURE__ */ defineComponent({
688
909
  selected: __props.modelValue === option.value,
689
910
  active: activeIndex.value === index
690
911
  }, () => [
691
- createElementVNode("span", _hoisted_6$7, [createElementVNode("span", _hoisted_7$6, toDisplayString(option.label), 1), (option.disabled ? option.disabledReason || option.description : option.description) ? (openBlock(), createElementBlock("span", _hoisted_8$2, toDisplayString(option.disabled ? option.disabledReason || option.description : option.description), 1)) : createCommentVNode("", true)]),
692
- option.meta ? (openBlock(), createElementBlock("span", _hoisted_9$2, toDisplayString(option.meta), 1)) : createCommentVNode("", true),
693
- _cache[6] || (_cache[6] = createElementVNode("svg", {
912
+ createElementVNode("span", _hoisted_5$7, [createElementVNode("span", _hoisted_6$7, toDisplayString(option.label), 1), (option.disabled ? option.disabledReason || option.description : option.description) ? (openBlock(), createElementBlock("span", _hoisted_7$6, toDisplayString(option.disabled ? option.disabledReason || option.description : option.description), 1)) : createCommentVNode("", true)]),
913
+ option.meta ? (openBlock(), createElementBlock("span", _hoisted_8$2, toDisplayString(option.meta), 1)) : createCommentVNode("", true),
914
+ _cache[5] || (_cache[5] = createElementVNode("svg", {
694
915
  class: "mint-menu-item__check mint-searchable-select__check",
695
916
  viewBox: "0 0 20 20",
696
917
  fill: "none",
@@ -702,10 +923,10 @@ var SelectSearchableInternal_default = /* @__PURE__ */ defineComponent({
702
923
  "stroke-width": "2",
703
924
  d: "m5 10 3 3 7-7"
704
925
  })], -1))
705
- ])], 42, _hoisted_5$7);
706
- }), 128)), visibleOptions.value.length === 0 ? (openBlock(), createElementBlock("li", _hoisted_10$2, toDisplayString(__props.noResultsText), 1)) : createCommentVNode("", true)]),
707
- _ctx.$slots.footer ? (openBlock(), createElementBlock("div", _hoisted_11$2, [renderSlot(_ctx.$slots, "footer")])) : createCommentVNode("", true)
708
- ])) : createCommentVNode("", true)], 38);
926
+ ])], 42, _hoisted_4$7);
927
+ }), 128)), visibleOptions.value.length === 0 ? (openBlock(), createElementBlock("li", _hoisted_9$2, toDisplayString(__props.noResultsText), 1)) : createCommentVNode("", true)]),
928
+ _ctx.$slots.footer ? (openBlock(), createElementBlock("div", _hoisted_10$2, [renderSlot(_ctx.$slots, "footer")])) : createCommentVNode("", true)
929
+ ], 4)) : createCommentVNode("", true)], 38);
709
930
  };
710
931
  }
711
932
  });
@@ -758,7 +979,7 @@ var BaseSelect_default = /* @__PURE__ */ defineComponent({
758
979
  /**
759
980
  * Select one or several options.
760
981
  * Default: a native `<select>`. `searchable`: a listbox with a search field and the `#option` / `#footer` slots.
761
- * `multiple`: a checkbox chip list bound to an array, capped by `max`.
982
+ * `multiple`: a field of removable chips with a filterable checkbox listbox, bound to an array and capped by `max`.
762
983
  *
763
984
  * @example
764
985
  * ```vue
@@ -804,6 +1025,7 @@ var BaseSelect_default = /* @__PURE__ */ defineComponent({
804
1025
  invalid: __props.invalid,
805
1026
  max: __props.max,
806
1027
  size: __props.size,
1028
+ "aria-labelledby": __props.ariaLabelledby,
807
1029
  "aria-describedby": __props.ariaDescribedby,
808
1030
  "onUpdate:modelValue": update
809
1031
  }), null, 16, [
@@ -814,6 +1036,7 @@ var BaseSelect_default = /* @__PURE__ */ defineComponent({
814
1036
  "invalid",
815
1037
  "max",
816
1038
  "size",
1039
+ "aria-labelledby",
817
1040
  "aria-describedby"
818
1041
  ])) : __props.searchable ? (openBlock(), createBlock(SelectSearchableInternal_default, mergeProps({ key: 1 }, unref(attrs), {
819
1042
  "model-value": singleValue.value,
@@ -900,41 +1123,16 @@ var Tooltip_default = /* @__PURE__ */ defineComponent({
900
1123
  const props = __props;
901
1124
  const tooltipId = `mint-tooltip-${Math.random().toString(36).slice(2, 9)}`;
902
1125
  const visible = ref(false);
903
- const actualPlacement = ref(props.position);
904
1126
  const triggerRef = ref(null);
905
1127
  const contentRef = ref(null);
906
- const coords = ref({
907
- top: "0px",
908
- left: "0px"
909
- });
910
1128
  let timeoutId;
911
- async function updatePosition() {
912
- if (!triggerRef.value || !contentRef.value) return;
913
- const { x, y, placement } = await computePosition(triggerRef.value, contentRef.value, {
914
- placement: props.position,
915
- middleware: [
916
- offset(6),
917
- flip(),
918
- shift({ padding: 8 })
919
- ]
920
- });
921
- coords.value = {
922
- top: `${y}px`,
923
- left: `${x}px`
924
- };
925
- actualPlacement.value = placement;
926
- }
927
- useEventListener(() => window, "scroll", updatePosition, {
928
- passive: true,
929
- capture: true,
930
- enabled: visible
1129
+ const { style: coords, placement: actualPlacement } = useFloatingPanel(triggerRef, contentRef, visible, {
1130
+ placement: () => props.position,
1131
+ offset: 6
931
1132
  });
932
- useEventListener(() => window, "resize", updatePosition, { enabled: visible });
933
- async function show() {
934
- timeoutId = setTimeout(async () => {
1133
+ function show() {
1134
+ timeoutId = setTimeout(() => {
935
1135
  visible.value = true;
936
- await nextTick();
937
- await updatePosition();
938
1136
  }, props.delay);
939
1137
  }
940
1138
  function hide() {
@@ -966,12 +1164,11 @@ var Tooltip_default = /* @__PURE__ */ defineComponent({
966
1164
  ref: contentRef,
967
1165
  class: normalizeClass([
968
1166
  "mint-tooltip__content",
969
- `mint-tooltip__content--${actualPlacement.value}`,
1167
+ `mint-tooltip__content--${unref(actualPlacement)}`,
970
1168
  __props.maxWidth ? "mint-tooltip__content--multiline" : ""
971
1169
  ]),
972
1170
  style: normalizeStyle({
973
- top: coords.value.top,
974
- left: coords.value.left,
1171
+ ...unref(coords),
975
1172
  maxWidth: resolvedMaxWidth(__props.maxWidth)
976
1173
  }),
977
1174
  role: "tooltip"
@@ -1430,6 +1627,7 @@ var EmptyState_default = /* @__PURE__ */ defineComponent({
1430
1627
  ]),
1431
1628
  __props.actionLabel ? (openBlock(), createElementBlock("div", _hoisted_7$4, [createVNode(BaseButton_default, {
1432
1629
  variant: "secondary",
1630
+ size: "sm",
1433
1631
  onClick: _cache[0] || (_cache[0] = ($event) => emit("action"))
1434
1632
  }, {
1435
1633
  default: withCtx(() => [createTextVNode(toDisplayString(__props.actionLabel), 1)]),
@@ -1504,62 +1702,150 @@ var FormField_default = /* @__PURE__ */ defineComponent({
1504
1702
  }
1505
1703
  });
1506
1704
  //#endregion
1507
- //#region src/composables/useDropdownState.ts
1508
- /**
1509
- * Shared disclosure state for dropdown-style SDK components: open/close state,
1510
- * outside-click and Escape closing, optional scroll/resize closing, and focus
1511
- * return to the trigger. `close(returnFocus)` mirrors `useMenuKeyboard`'s
1512
- * contract, so the two compose directly.
1513
- */
1514
- function useDropdownState(options = {}) {
1515
- const isOpen = ref(false);
1516
- const rootRef = options.rootRef ?? ref(null);
1517
- const triggerRef = options.triggerRef ?? ref(null);
1518
- const closeOnOutsideClick = options.closeOnOutsideClick ?? true;
1519
- const closeOnEscape = options.closeOnEscape ?? true;
1520
- const closeOnScroll = options.closeOnScroll ?? false;
1521
- function open() {
1522
- if (isOpen.value) return;
1523
- isOpen.value = true;
1524
- options.onOpen?.();
1525
- }
1526
- function close(returnFocus = false) {
1527
- if (!isOpen.value) return;
1528
- isOpen.value = false;
1529
- options.onClose?.();
1530
- if (returnFocus) nextTick(() => triggerRef.value?.focus());
1531
- }
1532
- function toggle() {
1533
- if (isOpen.value) close();
1534
- else open();
1535
- }
1536
- function handleClickOutside(event) {
1537
- if (!closeOnOutsideClick || !isOpen.value || !rootRef.value) return;
1538
- const target = event.target;
1539
- if (target instanceof Node && !rootRef.value.contains(target) && !options.insideRefs?.some((ref) => ref.value?.contains(target))) close();
1540
- }
1541
- function handleKeydown(event) {
1542
- if (closeOnEscape && event.key === "Escape") close(true);
1705
+ //#region src/utils/time.ts
1706
+ var time_exports = /* @__PURE__ */ __exportAll({
1707
+ addMinutes: () => addMinutes,
1708
+ compareTime: () => compareTime,
1709
+ durationMinutes: () => durationMinutes,
1710
+ findAvailableSlots: () => findAvailableSlots,
1711
+ findNearestTimeSlotIndex: () => findNearestTimeSlotIndex,
1712
+ formatDuration: () => formatDuration,
1713
+ formatRelativeTime: () => formatRelativeTime,
1714
+ formatTime: () => formatTime,
1715
+ formatTimeSlot: () => formatTimeSlot,
1716
+ fromMinutes: () => fromMinutes,
1717
+ generateTimeSlots: () => generateTimeSlots,
1718
+ isTimeInRange: () => isTimeInRange,
1719
+ parseTime: () => parseTime,
1720
+ rangesOverlap: () => rangesOverlap,
1721
+ snapToSlot: () => snapToSlot,
1722
+ toMinutes: () => toMinutes
1723
+ });
1724
+ function parseTime(time) {
1725
+ const [h, m] = time.split(":").map(Number);
1726
+ return {
1727
+ hour: h,
1728
+ minute: m
1729
+ };
1730
+ }
1731
+ function formatTime(hour, minute, format = "24h") {
1732
+ if (format === "24h") return `${String(hour).padStart(2, "0")}:${String(minute).padStart(2, "0")}`;
1733
+ const period = hour >= 12 ? "PM" : "AM";
1734
+ return `${hour === 0 ? 12 : hour > 12 ? hour - 12 : hour}:${String(minute).padStart(2, "0")} ${period}`;
1735
+ }
1736
+ function formatTimeSlot(time, format = "24h") {
1737
+ const { hour, minute } = parseTime(time);
1738
+ return formatTime(hour, minute, format);
1739
+ }
1740
+ function generateTimeSlots(start, end, stepMinutes) {
1741
+ const slots = [];
1742
+ const s = parseTime(start);
1743
+ const e = parseTime(end);
1744
+ const startMin = s.hour * 60 + s.minute;
1745
+ const endMin = e.hour * 60 + e.minute;
1746
+ for (let m = startMin; m <= endMin; m += stepMinutes) {
1747
+ const hour = Math.floor(m / 60);
1748
+ const minute = m % 60;
1749
+ if (hour >= 24) break;
1750
+ slots.push(formatTime(hour, minute));
1543
1751
  }
1544
- function handleViewportChange() {
1545
- if (isOpen.value) close();
1752
+ return slots;
1753
+ }
1754
+ function rangesOverlap(a, b) {
1755
+ const aStart = toMinutes(a.start);
1756
+ const aEnd = toMinutes(a.end);
1757
+ const bStart = toMinutes(b.start);
1758
+ return aStart < toMinutes(b.end) && bStart < aEnd;
1759
+ }
1760
+ function durationMinutes(start, end) {
1761
+ return toMinutes(end) - toMinutes(start);
1762
+ }
1763
+ function formatDuration(minutes) {
1764
+ if (minutes < 0) return "-" + formatDuration(-minutes);
1765
+ const h = Math.floor(minutes / 60);
1766
+ const m = minutes % 60;
1767
+ if (h === 0) return `${m}m`;
1768
+ if (m === 0) return `${h}h`;
1769
+ return `${h}h ${m}m`;
1770
+ }
1771
+ function isTimeInRange(time, start, end) {
1772
+ const t = toMinutes(time);
1773
+ return t >= toMinutes(start) && t <= toMinutes(end);
1774
+ }
1775
+ function findAvailableSlots(dayStart, dayEnd, occupied, minDuration) {
1776
+ const sorted = [...occupied].sort((a, b) => toMinutes(a.start) - toMinutes(b.start));
1777
+ const available = [];
1778
+ let cursor = toMinutes(dayStart);
1779
+ const end = toMinutes(dayEnd);
1780
+ for (const slot of sorted) {
1781
+ const slotStart = toMinutes(slot.start);
1782
+ const slotEnd = toMinutes(slot.end);
1783
+ if (slotStart > cursor && slotStart - cursor >= minDuration) available.push({
1784
+ start: fromMinutes(cursor),
1785
+ end: fromMinutes(slotStart)
1786
+ });
1787
+ cursor = Math.max(cursor, slotEnd);
1546
1788
  }
1547
- if (closeOnOutsideClick) useEventListener(() => document, "click", handleClickOutside);
1548
- if (closeOnEscape) useEventListener(() => document, "keydown", handleKeydown);
1549
- if (closeOnScroll) {
1550
- useEventListener(() => window, "scroll", handleViewportChange, true);
1551
- useEventListener(() => window, "resize", handleViewportChange);
1789
+ if (end > cursor && end - cursor >= minDuration) available.push({
1790
+ start: fromMinutes(cursor),
1791
+ end: fromMinutes(end)
1792
+ });
1793
+ return available;
1794
+ }
1795
+ function snapToSlot(time, stepMinutes) {
1796
+ const total = toMinutes(time);
1797
+ return fromMinutes(Math.round(total / stepMinutes) * stepMinutes);
1798
+ }
1799
+ function addMinutes(time, minutes) {
1800
+ const total = toMinutes(time) + minutes;
1801
+ return fromMinutes(Math.max(0, Math.min(total, 1439)));
1802
+ }
1803
+ function compareTime(a, b) {
1804
+ const ma = toMinutes(a);
1805
+ const mb = toMinutes(b);
1806
+ if (ma < mb) return -1;
1807
+ if (ma > mb) return 1;
1808
+ return 0;
1809
+ }
1810
+ function findNearestTimeSlotIndex(time, slots) {
1811
+ if (slots.length === 0) return -1;
1812
+ const target = toMinutes(time);
1813
+ let bestIndex = 0;
1814
+ let bestDiff = Infinity;
1815
+ for (let index = 0; index < slots.length; index++) {
1816
+ const diff = Math.abs(toMinutes(slots[index]) - target);
1817
+ if (diff < bestDiff) {
1818
+ bestDiff = diff;
1819
+ bestIndex = index;
1820
+ }
1552
1821
  }
1553
- return {
1554
- isOpen,
1555
- rootRef,
1556
- triggerRef,
1557
- open,
1558
- close,
1559
- toggle,
1560
- handleClickOutside,
1561
- handleKeydown
1562
- };
1822
+ return bestIndex;
1823
+ }
1824
+ var relativeTimeFormat = new Intl.RelativeTimeFormat("en", { numeric: "auto" });
1825
+ /**
1826
+ * "in 5 minutes" / "2 hours ago" up to a week, then a locale date.
1827
+ * With `weeks`, times up to five weeks away read as a week count first.
1828
+ */
1829
+ function formatRelativeTime(value, { weeks = false } = {}) {
1830
+ const date = value instanceof Date ? value : new Date(value);
1831
+ const diffSec = Math.round((date.getTime() - Date.now()) / 1e3);
1832
+ const diffMin = Math.round(diffSec / 60);
1833
+ const diffHr = Math.round(diffMin / 60);
1834
+ const diffDay = Math.round(diffHr / 24);
1835
+ const diffWeek = Math.round(diffDay / 7);
1836
+ if (Math.abs(diffSec) < 60) return relativeTimeFormat.format(diffSec, "second");
1837
+ if (Math.abs(diffMin) < 60) return relativeTimeFormat.format(diffMin, "minute");
1838
+ if (Math.abs(diffHr) < 24) return relativeTimeFormat.format(diffHr, "hour");
1839
+ if (Math.abs(diffDay) < 7) return relativeTimeFormat.format(diffDay, "day");
1840
+ if (weeks && Math.abs(diffWeek) < 5) return relativeTimeFormat.format(diffWeek, "week");
1841
+ return date.toLocaleDateString();
1842
+ }
1843
+ function toMinutes(time) {
1844
+ const { hour, minute } = parseTime(time);
1845
+ return hour * 60 + minute;
1846
+ }
1847
+ function fromMinutes(total) {
1848
+ return formatTime(Math.floor(total / 60) % 24, total % 60);
1563
1849
  }
1564
1850
  //#endregion
1565
1851
  //#region src/composables/useMenuKeyboard.ts
@@ -1669,9 +1955,9 @@ var _hoisted_9$1 = {
1669
1955
  var _hoisted_10$1 = { class: "mint-file-uploader__folder-info" };
1670
1956
  var _hoisted_11$1 = { class: "mint-file-uploader__folder-details" };
1671
1957
  var _hoisted_12$1 = { class: "mint-file-uploader__folder-name" };
1672
- var _hoisted_13$1 = { class: "mint-file-uploader__folder-count" };
1673
- var _hoisted_14$1 = { class: "mint-file-uploader__file-info" };
1674
- var _hoisted_15$1 = { class: "mint-file-uploader__file-meta" };
1958
+ var _hoisted_13 = { class: "mint-file-uploader__folder-count" };
1959
+ var _hoisted_14 = { class: "mint-file-uploader__file-info" };
1960
+ var _hoisted_15 = { class: "mint-file-uploader__file-meta" };
1675
1961
  var _hoisted_16 = { class: "mint-file-uploader__file-name" };
1676
1962
  var _hoisted_17 = { class: "mint-file-uploader__file-size" };
1677
1963
  var _hoisted_18 = ["aria-label", "onClick"];
@@ -2011,7 +2297,7 @@ var FileUploader_default = /* @__PURE__ */ defineComponent({
2011
2297
  "stroke-linecap": "round",
2012
2298
  "stroke-linejoin": "round",
2013
2299
  viewBox: "0 0 24 24"
2014
- }, [createElementVNode("path", { d: "m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2" })])], -1)), createElementVNode("div", _hoisted_11$1, [createElementVNode("span", _hoisted_12$1, toDisplayString(folderName.value), 1), createElementVNode("span", _hoisted_13$1, toDisplayString(selectedFiles.value.length) + " file" + toDisplayString(selectedFiles.value.length !== 1 ? "s" : ""), 1)])]), createElementVNode("button", {
2300
+ }, [createElementVNode("path", { d: "m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2" })])], -1)), createElementVNode("div", _hoisted_11$1, [createElementVNode("span", _hoisted_12$1, toDisplayString(folderName.value), 1), createElementVNode("span", _hoisted_13, toDisplayString(selectedFiles.value.length) + " file" + toDisplayString(selectedFiles.value.length !== 1 ? "s" : ""), 1)])]), createElementVNode("button", {
2015
2301
  type: "button",
2016
2302
  "aria-label": "Clear folder",
2017
2303
  class: "mint-file-uploader__remove-btn",
@@ -2035,10 +2321,10 @@ var FileUploader_default = /* @__PURE__ */ defineComponent({
2035
2321
  return openBlock(), createElementBlock("li", {
2036
2322
  key: `${file.name}-${file.size}-${index}`,
2037
2323
  class: "mint-file-uploader__file"
2038
- }, [createElementVNode("div", _hoisted_14$1, [createElementVNode("span", {
2324
+ }, [createElementVNode("div", _hoisted_14, [createElementVNode("span", {
2039
2325
  class: "mint-file-uploader__file-badge",
2040
2326
  style: normalizeStyle({ "--badge-color": getFileType(file.name).color })
2041
- }, toDisplayString(getFileType(file.name).label), 5), createElementVNode("div", _hoisted_15$1, [createElementVNode("span", _hoisted_16, toDisplayString(file.name), 1), createElementVNode("span", _hoisted_17, toDisplayString(formatFileSize(file.size)), 1)])]), createElementVNode("button", {
2327
+ }, toDisplayString(getFileType(file.name).label), 5), createElementVNode("div", _hoisted_15, [createElementVNode("span", _hoisted_16, toDisplayString(file.name), 1), createElementVNode("span", _hoisted_17, toDisplayString(formatFileSize(file.size)), 1)])]), createElementVNode("button", {
2042
2328
  type: "button",
2043
2329
  "aria-label": `Remove ${file.name}`,
2044
2330
  class: "mint-file-uploader__remove-btn",
@@ -2169,10 +2455,19 @@ function useAppExperiment(options = {}) {
2169
2455
  const showDetach = computed(() => experimentId.value !== null);
2170
2456
  const saveDisabled = computed(() => toValue(options.saveDisabled) ?? false);
2171
2457
  const saveDisabledMessage = computed(() => toValue(options.saveDisabledMessage));
2458
+ const dirty = computed(() => toValue(options.dirty) ?? false);
2459
+ const experimentOwner = computed(() => {
2460
+ const owner = store.current?.created_by_user;
2461
+ return owner ? [owner.first_name, owner.last_name].filter(Boolean).join(" ") || owner.username : void 0;
2462
+ });
2172
2463
  const popover = computed(() => ({
2173
2464
  experimentName: experimentName.value,
2174
2465
  experimentCode: experimentCode.value,
2175
2466
  experimentStatus: experimentStatus.value,
2467
+ experimentId: experimentId.value,
2468
+ experimentProject: store.current?.project_name || store.current?.project || void 0,
2469
+ experimentOwner: experimentOwner.value,
2470
+ experimentUpdatedAt: store.current?.updated_at,
2176
2471
  isResolving: isResolving.value,
2177
2472
  error: error.value ?? void 0,
2178
2473
  showSave: showSave.value,
@@ -2180,7 +2475,8 @@ function useAppExperiment(options = {}) {
2180
2475
  saveDisabled: saveDisabled.value,
2181
2476
  saveDisabledMessage: saveDisabledMessage.value,
2182
2477
  saveLoading: saveLoading.value,
2183
- saveSuccessMessage: saveSuccessMessage.value
2478
+ saveSuccessMessage: saveSuccessMessage.value,
2479
+ dirty: dirty.value
2184
2480
  }));
2185
2481
  const selectorModal = computed(() => ({
2186
2482
  open: showModal.value,
@@ -2200,6 +2496,7 @@ function useAppExperiment(options = {}) {
2200
2496
  saveLoading.value = true;
2201
2497
  try {
2202
2498
  const message = await options.onSave();
2499
+ await store.refresh();
2203
2500
  if (message) {
2204
2501
  saveSuccessMessage.value = message;
2205
2502
  if (successTimer) clearTimeout(successTimer);
@@ -2256,6 +2553,66 @@ function useAppExperiment(options = {}) {
2256
2553
  };
2257
2554
  }
2258
2555
  //#endregion
2556
+ //#region src/jobs.ts
2557
+ var ACTIVE_JOB_STATUSES = /* @__PURE__ */ new Set([
2558
+ "awaiting_input",
2559
+ "queued",
2560
+ "running"
2561
+ ]);
2562
+ var TERMINAL_JOB_STATUSES = /* @__PURE__ */ new Set([
2563
+ "completed",
2564
+ "failed",
2565
+ "cancelled"
2566
+ ]);
2567
+ /** Resolve action support while retaining one-cycle legacy status inference. */
2568
+ function resolveJobCapabilities(job) {
2569
+ const legacyCanCancel = job.status === "queued" || job.status === "running";
2570
+ const legacyCanDelete = TERMINAL_JOB_STATUSES.has(job.status);
2571
+ return {
2572
+ can_cancel: typeof job.can_cancel === "boolean" ? job.can_cancel : legacyCanCancel,
2573
+ can_delete: typeof job.can_delete === "boolean" ? job.can_delete : legacyCanDelete
2574
+ };
2575
+ }
2576
+ /** Clamp invalid or out-of-range progress values for safe display. */
2577
+ function normalizeJobPercent(value) {
2578
+ if (!Number.isFinite(value)) return 0;
2579
+ return Math.min(100, Math.max(0, value));
2580
+ }
2581
+ /** Create a detached canonical state without changing the transport input. */
2582
+ function normalizeJobState(job) {
2583
+ const capabilities = resolveJobCapabilities(job);
2584
+ return {
2585
+ ...job,
2586
+ definition_id: job.definition_id ?? (typeof job.metadata.definition_id === "string" ? job.metadata.definition_id : null),
2587
+ result_status: job.result_status ?? (job.status === "completed" && job.metadata.has_result === true ? "available" : "none"),
2588
+ result_expires_at: job.result_expires_at ?? null,
2589
+ progress: {
2590
+ ...job.progress,
2591
+ percent: normalizeJobPercent(job.progress.percent)
2592
+ },
2593
+ warnings: [...job.warnings],
2594
+ folders: [...job.folders],
2595
+ metadata: { ...job.metadata },
2596
+ ...capabilities
2597
+ };
2598
+ }
2599
+ function isActiveJobStatus(status) {
2600
+ return ACTIVE_JOB_STATUSES.has(status);
2601
+ }
2602
+ function isTerminalJobStatus(status) {
2603
+ return TERMINAL_JOB_STATUSES.has(status);
2604
+ }
2605
+ function jobStatusLabel(status) {
2606
+ return {
2607
+ awaiting_input: "Waiting for input",
2608
+ queued: "Queued",
2609
+ running: "Running",
2610
+ completed: "Completed",
2611
+ failed: "Failed",
2612
+ cancelled: "Cancelled"
2613
+ }[status];
2614
+ }
2615
+ //#endregion
2259
2616
  //#region src/utils/pluginSecrets.ts
2260
2617
  var pluginSecrets_exports = /* @__PURE__ */ __exportAll({
2261
2618
  FORMAT_KEY: () => FORMAT_KEY,
@@ -2722,66 +3079,6 @@ var TagsInput_default = /* @__PURE__ */ defineComponent({
2722
3079
  }
2723
3080
  });
2724
3081
  //#endregion
2725
- //#region src/jobs.ts
2726
- var ACTIVE_JOB_STATUSES = /* @__PURE__ */ new Set([
2727
- "awaiting_input",
2728
- "queued",
2729
- "running"
2730
- ]);
2731
- var TERMINAL_JOB_STATUSES = /* @__PURE__ */ new Set([
2732
- "completed",
2733
- "failed",
2734
- "cancelled"
2735
- ]);
2736
- /** Resolve action support while retaining one-cycle legacy status inference. */
2737
- function resolveJobCapabilities(job) {
2738
- const legacyCanCancel = job.status === "queued" || job.status === "running";
2739
- const legacyCanDelete = TERMINAL_JOB_STATUSES.has(job.status);
2740
- return {
2741
- can_cancel: typeof job.can_cancel === "boolean" ? job.can_cancel : legacyCanCancel,
2742
- can_delete: typeof job.can_delete === "boolean" ? job.can_delete : legacyCanDelete
2743
- };
2744
- }
2745
- /** Clamp invalid or out-of-range progress values for safe display. */
2746
- function normalizeJobPercent(value) {
2747
- if (!Number.isFinite(value)) return 0;
2748
- return Math.min(100, Math.max(0, value));
2749
- }
2750
- /** Create a detached canonical state without changing the transport input. */
2751
- function normalizeJobState(job) {
2752
- const capabilities = resolveJobCapabilities(job);
2753
- return {
2754
- ...job,
2755
- definition_id: job.definition_id ?? (typeof job.metadata.definition_id === "string" ? job.metadata.definition_id : null),
2756
- result_status: job.result_status ?? (job.status === "completed" && job.metadata.has_result === true ? "available" : "none"),
2757
- result_expires_at: job.result_expires_at ?? null,
2758
- progress: {
2759
- ...job.progress,
2760
- percent: normalizeJobPercent(job.progress.percent)
2761
- },
2762
- warnings: [...job.warnings],
2763
- folders: [...job.folders],
2764
- metadata: { ...job.metadata },
2765
- ...capabilities
2766
- };
2767
- }
2768
- function isActiveJobStatus(status) {
2769
- return ACTIVE_JOB_STATUSES.has(status);
2770
- }
2771
- function isTerminalJobStatus(status) {
2772
- return TERMINAL_JOB_STATUSES.has(status);
2773
- }
2774
- function jobStatusLabel(status) {
2775
- return {
2776
- awaiting_input: "Waiting for input",
2777
- queued: "Queued",
2778
- running: "Running",
2779
- completed: "Completed",
2780
- failed: "Failed",
2781
- cancelled: "Cancelled"
2782
- }[status];
2783
- }
2784
- //#endregion
2785
3082
  //#region src/composables/platformContextHelpers.ts
2786
3083
  function getInjectedPlatformContext() {
2787
3084
  if (typeof window === "undefined") return void 0;
@@ -2846,31 +3143,28 @@ var _hoisted_3 = {
2846
3143
  role: "alert"
2847
3144
  };
2848
3145
  var _hoisted_4 = ["aria-label"];
2849
- var _hoisted_5 = ["aria-expanded", "onClick"];
2850
- var _hoisted_6 = { class: "mint-resource-picker__group-label" };
2851
- var _hoisted_7 = { class: "mint-resource-picker__group-count" };
2852
- var _hoisted_8 = [
3146
+ var _hoisted_5 = [
2853
3147
  "id",
2854
3148
  "aria-selected",
2855
3149
  "onClick",
2856
3150
  "onMouseenter"
2857
3151
  ];
2858
- var _hoisted_9 = { class: "mint-resource-picker__text" };
2859
- var _hoisted_10 = { class: "mint-resource-picker__title" };
2860
- var _hoisted_11 = {
3152
+ var _hoisted_6 = { class: "mint-resource-picker__text" };
3153
+ var _hoisted_7 = { class: "mint-resource-picker__title" };
3154
+ var _hoisted_8 = {
2861
3155
  key: 0,
2862
3156
  class: "mint-resource-picker__meta"
2863
3157
  };
2864
- var _hoisted_12 = {
3158
+ var _hoisted_9 = {
2865
3159
  key: 0,
2866
3160
  class: "mint-resource-picker__code mint-exp-code mint-exp-code--sm"
2867
3161
  };
2868
- var _hoisted_13 = { key: 1 };
2869
- var _hoisted_14 = {
3162
+ var _hoisted_10 = { key: 1 };
3163
+ var _hoisted_11 = {
2870
3164
  key: 0,
2871
3165
  class: "mint-resource-picker__aside"
2872
3166
  };
2873
- var _hoisted_15 = {
3167
+ var _hoisted_12 = {
2874
3168
  key: 1,
2875
3169
  class: "mint-resource-picker__date"
2876
3170
  };
@@ -2880,7 +3174,6 @@ var ResourcePickerListInternal_default = /* @__PURE__ */ defineComponent({
2880
3174
  __name: "ResourcePickerListInternal",
2881
3175
  props: {
2882
3176
  items: {},
2883
- groups: { default: null },
2884
3177
  itemKey: {},
2885
3178
  describe: {},
2886
3179
  selectedKey: { default: null },
@@ -2893,12 +3186,13 @@ var ResourcePickerListInternal_default = /* @__PURE__ */ defineComponent({
2893
3186
  },
2894
3187
  error: { default: null },
2895
3188
  emptyTitle: { default: "Nothing found" },
2896
- emptyDescription: { default: "Try adjusting your search or filters." }
3189
+ emptyDescription: { default: "Try adjusting your search or filters." },
3190
+ autofocusSearch: { type: Boolean }
2897
3191
  },
2898
3192
  emits: ["select", "update:search"],
2899
3193
  setup(__props, { emit: __emit }) {
2900
3194
  /**
2901
- * Searchable, optionally grouped single-select list shared by the experiment and
3195
+ * Searchable single-select list shared by the experiment and
2902
3196
  * artifact selector modals: two-line rows (title, then code + meta) with status and date
2903
3197
  * in a right-hand column, a filled selected row, skeleton,
2904
3198
  * error and empty states, and the combobox keyboard model (↑ ↓ Enter).
@@ -2906,35 +3200,24 @@ var ResourcePickerListInternal_default = /* @__PURE__ */ defineComponent({
2906
3200
  const props = __props;
2907
3201
  const emit = __emit;
2908
3202
  const listId = `mint-resource-picker-${useId().replace(/:/g, "")}`;
2909
- const collapsed = reactive(/* @__PURE__ */ new Set());
2910
3203
  const activeIndex = ref(-1);
2911
3204
  const listRef = ref(null);
2912
- const visibleGroups = computed(() => props.groups?.map((group) => ({
2913
- ...group,
2914
- rows: collapsed.has(group.label) ? [] : group.items
2915
- })));
2916
- /** Keyboard order: the rows on screen, top to bottom. */
2917
- const flat = computed(() => visibleGroups.value ? visibleGroups.value.flatMap((group) => group.rows) : props.items);
2918
- const indexByKey = computed(() => new Map(flat.value.map((item, i) => [props.itemKey(item), i])));
3205
+ const indexByKey = computed(() => new Map(props.items.map((item, i) => [props.itemKey(item), i])));
2919
3206
  const showList = computed(() => !props.loading && !props.error && props.items.length > 0);
2920
3207
  function optionId(item) {
2921
3208
  return `${listId}-${props.itemKey(item)}`;
2922
3209
  }
2923
3210
  const activeDescendant = computed(() => {
2924
- const item = flat.value[activeIndex.value];
3211
+ const item = props.items[activeIndex.value];
2925
3212
  return item === void 0 ? void 0 : optionId(item);
2926
3213
  });
2927
3214
  function indexOf(item) {
2928
3215
  return indexByKey.value.get(props.itemKey(item)) ?? -1;
2929
3216
  }
2930
- function toggleGroup(label) {
2931
- if (collapsed.has(label)) collapsed.delete(label);
2932
- else collapsed.add(label);
2933
- }
2934
3217
  function keydown(event) {
2935
3218
  const target = event.target;
2936
3219
  if (target !== event.currentTarget && !target?.closest(".mint-resource-picker__search")) return;
2937
- const rows = flat.value;
3220
+ const rows = props.items;
2938
3221
  if (!rows.length) return;
2939
3222
  if (event.key === "ArrowDown" || event.key === "ArrowUp") {
2940
3223
  event.preventDefault();
@@ -2945,116 +3228,91 @@ var ResourcePickerListInternal_default = /* @__PURE__ */ defineComponent({
2945
3228
  emit("select", rows[activeIndex.value]);
2946
3229
  }
2947
3230
  }
2948
- watch(() => [props.items, props.groups], () => {
3231
+ watch(() => props.items, () => {
2949
3232
  activeIndex.value = -1;
2950
3233
  });
2951
3234
  return (_ctx, _cache) => {
2952
3235
  return openBlock(), createElementBlock("div", {
2953
3236
  class: "mint-resource-picker",
2954
3237
  onKeydown: keydown
2955
- }, [
2956
- createElementVNode("div", _hoisted_1, [createVNode(BaseInput_default, {
2957
- class: "mint-resource-picker__search",
2958
- "model-value": __props.search,
2959
- placeholder: __props.placeholder,
2960
- size: "sm",
2961
- type: "search",
2962
- role: "combobox",
2963
- "aria-label": `Search ${__props.label.toLowerCase()}`,
2964
- "aria-expanded": showList.value,
2965
- "aria-controls": listId,
2966
- "aria-activedescendant": activeDescendant.value,
2967
- "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => emit("update:search", String($event ?? "")))
2968
- }, {
2969
- prefix: withCtx(() => [..._cache[2] || (_cache[2] = [createElementVNode("svg", {
2970
- viewBox: "0 0 16 16",
2971
- fill: "none",
2972
- stroke: "currentColor",
2973
- "stroke-width": "1.5",
2974
- "aria-hidden": "true"
2975
- }, [createElementVNode("path", { d: "M7 11.5a4.5 4.5 0 1 1 0-9 4.5 4.5 0 0 1 0 9zM10.5 10.5L14 14" })], -1)])]),
2976
- _: 1
2977
- }, 8, [
2978
- "model-value",
2979
- "placeholder",
2980
- "aria-label",
2981
- "aria-expanded",
2982
- "aria-activedescendant"
2983
- ]), renderSlot(_ctx.$slots, "filters")]),
2984
- renderSlot(_ctx.$slots, "advanced"),
2985
- __props.loading ? (openBlock(), createElementBlock("div", _hoisted_2, [(openBlock(), createElementBlock(Fragment, null, renderList(4, (n) => {
2986
- return createElementVNode("div", {
2987
- key: n,
2988
- class: "mint-resource-picker__skeleton-row"
2989
- }, [createVNode(Skeleton_default, {
2990
- width: `${40 + n * 10}%`,
2991
- height: "0.75rem"
2992
- }, null, 8, ["width"]), createVNode(Skeleton_default, {
2993
- width: "30%",
2994
- height: "0.625rem"
2995
- })]);
2996
- }), 64))])) : __props.error ? (openBlock(), createElementBlock("div", _hoisted_3, toDisplayString(__props.error), 1)) : !__props.items.length ? (openBlock(), createBlock(EmptyState_default, {
2997
- key: 2,
2998
- title: __props.emptyTitle,
2999
- description: __props.emptyDescription,
3000
- size: "sm"
3001
- }, null, 8, ["title", "description"])) : (openBlock(), createElementBlock("div", {
3002
- key: 3,
3003
- id: listId,
3004
- ref_key: "listRef",
3005
- ref: listRef,
3006
- class: "mint-resource-picker__frame mint-resource-picker__list",
3007
- role: "listbox",
3008
- "aria-label": __props.label
3009
- }, [(openBlock(true), createElementBlock(Fragment, null, renderList(visibleGroups.value ?? [{
3010
- label: "",
3011
- items: __props.items,
3012
- rows: __props.items
3013
- }], (group) => {
3014
- return openBlock(), createElementBlock(Fragment, { key: group.label }, [visibleGroups.value ? (openBlock(), createElementBlock("button", {
3238
+ }, [createElementVNode("div", _hoisted_1, [createVNode(BaseInput_default, {
3239
+ class: "mint-resource-picker__search",
3240
+ "model-value": __props.search,
3241
+ placeholder: __props.placeholder,
3242
+ size: "sm",
3243
+ type: "search",
3244
+ autofocus: __props.autofocusSearch,
3245
+ role: "combobox",
3246
+ "aria-label": `Search ${__props.label.toLowerCase()}`,
3247
+ "aria-expanded": showList.value,
3248
+ "aria-controls": listId,
3249
+ "aria-activedescendant": activeDescendant.value,
3250
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => emit("update:search", String($event ?? "")))
3251
+ }, {
3252
+ prefix: withCtx(() => [..._cache[2] || (_cache[2] = [createElementVNode("svg", {
3253
+ viewBox: "0 0 16 16",
3254
+ fill: "none",
3255
+ stroke: "currentColor",
3256
+ "stroke-width": "1.5",
3257
+ "aria-hidden": "true"
3258
+ }, [createElementVNode("path", { d: "M7 11.5a4.5 4.5 0 1 1 0-9 4.5 4.5 0 0 1 0 9zM10.5 10.5L14 14" })], -1)])]),
3259
+ _: 1
3260
+ }, 8, [
3261
+ "model-value",
3262
+ "placeholder",
3263
+ "autofocus",
3264
+ "aria-label",
3265
+ "aria-expanded",
3266
+ "aria-activedescendant"
3267
+ ]), renderSlot(_ctx.$slots, "filters")]), __props.loading ? (openBlock(), createElementBlock("div", _hoisted_2, [(openBlock(), createElementBlock(Fragment, null, renderList(4, (n) => {
3268
+ return createElementVNode("div", {
3269
+ key: n,
3270
+ class: "mint-resource-picker__skeleton-row"
3271
+ }, [createVNode(Skeleton_default, {
3272
+ width: `${40 + n * 10}%`,
3273
+ height: "0.75rem"
3274
+ }, null, 8, ["width"]), createVNode(Skeleton_default, {
3275
+ width: "30%",
3276
+ height: "0.625rem"
3277
+ })]);
3278
+ }), 64))])) : __props.error ? (openBlock(), createElementBlock("div", _hoisted_3, toDisplayString(__props.error), 1)) : !__props.items.length ? (openBlock(), createBlock(EmptyState_default, {
3279
+ key: 2,
3280
+ title: __props.emptyTitle,
3281
+ description: __props.emptyDescription,
3282
+ size: "sm"
3283
+ }, null, 8, ["title", "description"])) : (openBlock(), createElementBlock("div", {
3284
+ key: 3,
3285
+ id: listId,
3286
+ ref_key: "listRef",
3287
+ ref: listRef,
3288
+ class: "mint-resource-picker__frame mint-resource-picker__list",
3289
+ role: "listbox",
3290
+ "aria-label": __props.label
3291
+ }, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item) => {
3292
+ return openBlock(), createElementBlock("div", {
3293
+ id: optionId(item),
3294
+ key: __props.itemKey(item),
3295
+ role: "option",
3296
+ "aria-selected": __props.itemKey(item) === __props.selectedKey,
3297
+ class: normalizeClass(["mint-resource-picker__row", {
3298
+ "mint-resource-picker__row--selected": __props.itemKey(item) === __props.selectedKey,
3299
+ "mint-resource-picker__row--active": indexOf(item) === activeIndex.value
3300
+ }]),
3301
+ onClick: ($event) => emit("select", item),
3302
+ onMouseenter: ($event) => activeIndex.value = indexOf(item)
3303
+ }, [
3304
+ createElementVNode("span", _hoisted_6, [createElementVNode("span", _hoisted_7, toDisplayString(__props.describe(item).title), 1), __props.describe(item).code || __props.describe(item).meta?.length ? (openBlock(), createElementBlock("span", _hoisted_8, [__props.describe(item).code ? (openBlock(), createElementBlock("span", _hoisted_9, toDisplayString(__props.describe(item).code), 1)) : createCommentVNode("", true), __props.describe(item).meta?.length ? (openBlock(), createElementBlock("span", _hoisted_10, toDisplayString(__props.describe(item).meta.join(" · ")), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true)]),
3305
+ __props.describe(item).status || __props.describe(item).date ? (openBlock(), createElementBlock("span", _hoisted_11, [__props.describe(item).status ? (openBlock(), createElementBlock("span", {
3015
3306
  key: 0,
3016
- type: "button",
3017
- class: "mint-resource-picker__group",
3018
- "aria-expanded": !collapsed.has(group.label),
3019
- onClick: ($event) => toggleGroup(group.label)
3020
- }, [
3021
- _cache[3] || (_cache[3] = createElementVNode("svg", {
3022
- class: "mint-resource-picker__chevron",
3023
- viewBox: "0 0 16 16",
3024
- fill: "none",
3025
- stroke: "currentColor",
3026
- "stroke-width": "1.5",
3027
- "aria-hidden": "true"
3028
- }, [createElementVNode("path", { d: "M4 6l4 4 4-4" })], -1)),
3029
- createElementVNode("span", _hoisted_6, toDisplayString(group.label), 1),
3030
- createElementVNode("span", _hoisted_7, toDisplayString(group.items.length), 1)
3031
- ], 8, _hoisted_5)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(group.rows, (item) => {
3032
- return openBlock(), createElementBlock("div", {
3033
- id: optionId(item),
3034
- key: __props.itemKey(item),
3035
- role: "option",
3036
- "aria-selected": __props.itemKey(item) === __props.selectedKey,
3037
- class: normalizeClass(["mint-resource-picker__row", {
3038
- "mint-resource-picker__row--selected": __props.itemKey(item) === __props.selectedKey,
3039
- "mint-resource-picker__row--active": indexOf(item) === activeIndex.value
3040
- }]),
3041
- onClick: ($event) => emit("select", item),
3042
- onMouseenter: ($event) => activeIndex.value = indexOf(item)
3043
- }, [
3044
- createElementVNode("span", _hoisted_9, [createElementVNode("span", _hoisted_10, toDisplayString(__props.describe(item).title), 1), __props.describe(item).code || __props.describe(item).meta?.length ? (openBlock(), createElementBlock("span", _hoisted_11, [__props.describe(item).code ? (openBlock(), createElementBlock("span", _hoisted_12, toDisplayString(__props.describe(item).code), 1)) : createCommentVNode("", true), __props.describe(item).meta?.length ? (openBlock(), createElementBlock("span", _hoisted_13, toDisplayString(__props.describe(item).meta.join(" · ")), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true)]),
3045
- __props.describe(item).status || __props.describe(item).date ? (openBlock(), createElementBlock("span", _hoisted_14, [__props.describe(item).status ? (openBlock(), createElementBlock("span", {
3046
- key: 0,
3047
- class: normalizeClass(["mint-resource-picker__status", `mint-resource-picker__status--${__props.describe(item).status.tone}`])
3048
- }, toDisplayString(__props.describe(item).status.label), 3)) : createCommentVNode("", true), __props.describe(item).date ? (openBlock(), createElementBlock("span", _hoisted_15, toDisplayString(__props.describe(item).date), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true),
3049
- _ctx.$slots.actions ? (openBlock(), createElementBlock("span", {
3050
- key: 1,
3051
- class: "mint-resource-picker__actions",
3052
- onClick: _cache[1] || (_cache[1] = withModifiers(() => {}, ["stop"]))
3053
- }, [renderSlot(_ctx.$slots, "actions", { item })])) : createCommentVNode("", true)
3054
- ], 42, _hoisted_8);
3055
- }), 128))], 64);
3056
- }), 128))], 8, _hoisted_4))
3057
- ], 32);
3307
+ class: normalizeClass(["mint-resource-picker__status", `mint-resource-picker__status--${__props.describe(item).status.tone}`])
3308
+ }, toDisplayString(__props.describe(item).status.label), 3)) : createCommentVNode("", true), __props.describe(item).date ? (openBlock(), createElementBlock("span", _hoisted_12, toDisplayString(__props.describe(item).date), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true),
3309
+ _ctx.$slots.actions ? (openBlock(), createElementBlock("span", {
3310
+ key: 1,
3311
+ class: "mint-resource-picker__actions",
3312
+ onClick: _cache[1] || (_cache[1] = withModifiers(() => {}, ["stop"]))
3313
+ }, [renderSlot(_ctx.$slots, "actions", { item })])) : createCommentVNode("", true)
3314
+ ], 42, _hoisted_5);
3315
+ }), 128))], 8, _hoisted_4))], 32);
3058
3316
  };
3059
3317
  }
3060
3318
  });
@@ -3065,6 +3323,6 @@ function isRecord(value) {
3065
3323
  return typeof value === "object" && value !== null && !Array.isArray(value);
3066
3324
  }
3067
3325
  //#endregion
3068
- export { useRovingFocus as A, formatExperimentDate as C, useDropdownState as D, useMenuKeyboard as E, useSelectionLimit as F, normalizeOptionInput as I, BaseInput_default as L, Tooltip_default as M, BaseSelect_default as N, FormField_default as O, useListSelection as P, experimentIdFromRoute as S, FileUploader_default as T, APP_EXPERIMENT_KEY as _, parseExperimentId as a, SORT_OPTIONS as b, isTerminalJobStatus as c, normalizeJobState as d, resolveJobCapabilities as f, pluginSecrets_exports as g, FORMAT_KEY as h, getInjectedPlatformContext as i, BaseCheckbox_default as j, EmptyState_default as k, jobStatusLabel as l, SecretInput_default as m, ResourcePickerListInternal_default as n, resolveCurrentPluginId as o, TagsInput_default as p, Skeleton_default as r, isActiveJobStatus as s, isRecord as t, normalizeJobPercent as u, useAppExperiment as v, resolveExperimentCode as w, datePresetToISO as x, DATE_PRESET_OPTIONS as y };
3326
+ export { formatRelativeTime as A, Tooltip_default as B, formatExperimentDate as C, compareTime as D, useMenuKeyboard as E, toMinutes as F, normalizeOptionInput as G, useListSelection as H, FormField_default as I, BaseInput_default as K, EmptyState_default as L, formatTimeSlot as M, generateTimeSlots as N, durationMinutes as O, time_exports as P, useRovingFocus as R, experimentIdFromRoute as S, FileUploader_default as T, useSelectionLimit as U, BaseSelect_default as V, useFloatingPanel as W, APP_EXPERIMENT_KEY as _, parseExperimentId as a, SORT_OPTIONS as b, SecretInput_default as c, isActiveJobStatus as d, isTerminalJobStatus as f, resolveJobCapabilities as g, normalizeJobState as h, getInjectedPlatformContext as i, formatTime as j, findNearestTimeSlotIndex as k, FORMAT_KEY as l, normalizeJobPercent as m, ResourcePickerListInternal_default as n, resolveCurrentPluginId as o, jobStatusLabel as p, Skeleton_default as r, TagsInput_default as s, isRecord as t, pluginSecrets_exports as u, useAppExperiment as v, resolveExperimentCode as w, datePresetToISO as x, DATE_PRESET_OPTIONS as y, BaseCheckbox_default as z };
3069
3327
 
3070
- //# sourceMappingURL=records-BzTcxekG.js.map
3328
+ //# sourceMappingURL=records-D4aQXyZu.js.map