@morscherlab/mint-sdk 1.2.0-beta.7 → 1.2.0-beta.9

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 (307) hide show
  1. package/README.md +30 -0
  2. package/dist/{ExperimentPopover-CfOdh5Rm.js → ExperimentPopover-oL0fg_A0.js} +5 -3
  3. package/dist/ExperimentPopover-oL0fg_A0.js.map +1 -0
  4. package/dist/{ExperimentSelectorModal-DvIagrxY.js → ExperimentSelectorModal-BeEOomw_.js} +4 -4
  5. package/dist/ExperimentSelectorModal-BeEOomw_.js.map +1 -0
  6. package/dist/{SettingsModal-W3TYfnP9.js → SettingsModal-Dphh3RrI.js} +4 -4
  7. package/dist/SettingsModal-Dphh3RrI.js.map +1 -0
  8. package/dist/{EmptyState-NBqf2_8z.js → Skeleton-DxtwJ5gt.js} +110 -92
  9. package/dist/Skeleton-DxtwJ5gt.js.map +1 -0
  10. package/dist/__tests__/components/ExperimentTimeline.test.d.ts +1 -0
  11. package/dist/__tests__/composables/useListReorder.test.d.ts +1 -0
  12. package/dist/__tests__/styles/cssTokens.test.d.ts +1 -0
  13. package/dist/components/ActionMenu.vue.d.ts +1 -1
  14. package/dist/components/AppPluginSwitcher.vue.d.ts +2 -0
  15. package/dist/components/AuditTrail.vue.d.ts +13 -0
  16. package/dist/components/BatchProgressList.vue.d.ts +17 -0
  17. package/dist/components/DataFrame.vue.d.ts +14 -2
  18. package/dist/components/DatePicker.vue.d.ts +1 -1
  19. package/dist/components/DateTimePicker.vue.d.ts +2 -0
  20. package/dist/components/ExperimentDataViewer.vue.d.ts +26 -1
  21. package/dist/components/ExperimentPopover.vue.d.ts +1 -0
  22. package/dist/components/ExperimentTimeline.vue.d.ts +29 -1
  23. package/dist/components/LcmsSequenceTable.vue.d.ts +29 -1
  24. package/dist/components/ProgressBar.vue.d.ts +1 -1
  25. package/dist/components/ProtocolStepEditor.vue.d.ts +1 -0
  26. package/dist/components/ReagentList.vue.d.ts +29 -1
  27. package/dist/components/SampleHierarchyTree.vue.d.ts +29 -1
  28. package/dist/components/SampleSelector.drag.d.ts +13 -0
  29. package/dist/components/SampleSelector.tree.d.ts +2 -0
  30. package/dist/components/SampleSelector.vue.d.ts +34 -1
  31. package/dist/components/ScheduleCalendar.vue.d.ts +20 -0
  32. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +1 -0
  33. package/dist/components/TimePicker.vue.d.ts +1 -0
  34. package/dist/components/WellPlate.geometry.d.ts +15 -0
  35. package/dist/components/WellPlate.interaction.d.ts +13 -0
  36. package/dist/components/WellPlate.vue.d.ts +29 -0
  37. package/dist/components/index.js +6 -6
  38. package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +2 -0
  39. package/dist/components/internal/DataStateInternal.vue.d.ts +43 -0
  40. package/dist/{components-B80gV0P6.js → components-CgAUzF8F.js} +1930 -1688
  41. package/dist/components-CgAUzF8F.js.map +1 -0
  42. package/dist/composables/controlSchemaTypes.d.ts +34 -0
  43. package/dist/composables/index.d.ts +1 -0
  44. package/dist/composables/index.js +9 -9
  45. package/dist/composables/useDropdownState.d.ts +18 -2
  46. package/dist/composables/useEventStream.d.ts +9 -0
  47. package/dist/composables/useListReorder.d.ts +90 -0
  48. package/dist/composables/useMenuKeyboard.d.ts +2 -2
  49. package/dist/composables/usePluginConfig.d.ts +3 -1
  50. package/dist/composables/useRequestSyncState.d.ts +42 -2
  51. package/dist/composables/useScheduleDrag.d.ts +1 -0
  52. package/dist/{composables-C8mmD5ta.js → composables-B_pia3hO.js} +13 -69
  53. package/dist/composables-B_pia3hO.js.map +1 -0
  54. package/dist/{useApi-CDBq6z23.js → errors-_W0-LbA6.js} +102 -3
  55. package/dist/errors-_W0-LbA6.js.map +1 -0
  56. package/dist/{experiment-Y9Iz7KYi.js → experiment-Cwl9AYxw.js} +3 -8
  57. package/dist/experiment-Cwl9AYxw.js.map +1 -0
  58. package/dist/experiment-utils-DV3DrvE_.js.map +1 -1
  59. package/dist/index.js +14 -14
  60. package/dist/install.js +2 -7
  61. package/dist/install.js.map +1 -1
  62. package/dist/permissions.d.ts +42 -1
  63. package/dist/permissions.js +20 -10
  64. package/dist/permissions.js.map +1 -1
  65. package/dist/stores/index.d.ts +1 -1
  66. package/dist/stores/index.js +3 -3
  67. package/dist/stores/settings.d.ts +31 -1
  68. package/dist/styles.css +9572 -27877
  69. package/dist/templates/index.js +2 -4
  70. package/dist/{templates-CK72aKO1.js → templates-Qq113pyZ.js} +291 -85
  71. package/dist/templates-Qq113pyZ.js.map +1 -0
  72. package/dist/{useControlSchema-_OVhavKq.js → useControlSchema-aMZlb4Sc.js} +197 -1089
  73. package/dist/useControlSchema-aMZlb4Sc.js.map +1 -0
  74. package/dist/{useDropdownState-D5G4UvWd.js → useDropdownState-DitCtrTT.js} +21 -5
  75. package/dist/useDropdownState-DitCtrTT.js.map +1 -0
  76. package/dist/{useExperimentSelector-DSEckf_g.js → useExperimentSelector-I8HC8hUu.js} +3 -3
  77. package/dist/{useExperimentSelector-DSEckf_g.js.map → useExperimentSelector-I8HC8hUu.js.map} +1 -1
  78. package/dist/{useFormBuilder-Bd714C7y.js → useFormBuilder-TCxNnqeb.js} +2 -2
  79. package/dist/{useFormBuilder-Bd714C7y.js.map → useFormBuilder-TCxNnqeb.js.map} +1 -1
  80. package/dist/{useProtocolTemplates-Dq5Pzwyd.js → useProtocolTemplates-BmX_iVBR.js} +185 -157
  81. package/dist/useProtocolTemplates-BmX_iVBR.js.map +1 -0
  82. package/dist/utils/color.d.ts +13 -0
  83. package/dist/utils/errors.d.ts +9 -0
  84. package/package.json +1 -1
  85. package/src/__tests__/components/ActionMenu.test.ts +94 -0
  86. package/src/__tests__/components/DataFrame.test.ts +183 -11
  87. package/src/__tests__/components/DataStates.test.ts +176 -0
  88. package/src/__tests__/components/DatePicker.test.ts +76 -0
  89. package/src/__tests__/components/DateTimePicker.test.ts +36 -0
  90. package/src/__tests__/components/ExperimentTimeline.test.ts +63 -0
  91. package/src/__tests__/components/GroupAssigner.test.ts +53 -0
  92. package/src/__tests__/components/LcmsSequenceTable.test.ts +22 -0
  93. package/src/__tests__/components/RackEditor.test.ts +35 -0
  94. package/src/__tests__/components/ReagentList.test.ts +64 -2
  95. package/src/__tests__/components/RetiredStyles.test.ts +31 -0
  96. package/src/__tests__/components/SampleSelector.drag.test.ts +51 -1
  97. package/src/__tests__/components/ScheduleCalendar.test.ts +63 -0
  98. package/src/__tests__/components/SegmentedControl.test.ts +88 -0
  99. package/src/__tests__/components/TimePicker.test.ts +61 -0
  100. package/src/__tests__/components/WellPlate.interaction.test.ts +59 -0
  101. package/src/__tests__/composables/useDropdownState.test.ts +58 -1
  102. package/src/__tests__/composables/useListReorder.test.ts +145 -0
  103. package/src/__tests__/composables/useRequestSyncState.test.ts +140 -0
  104. package/src/__tests__/stores/settings.test.ts +71 -1
  105. package/src/__tests__/styles/cssTokens.test.ts +131 -0
  106. package/src/__tests__/utils/permissions.test.ts +68 -0
  107. package/src/components/ActionMenu.vue +45 -88
  108. package/src/components/AlertBox.vue +0 -4
  109. package/src/components/AppAvatarMenu.vue +2 -14
  110. package/src/components/AppLayout.vue +0 -4
  111. package/src/components/AppPluginSwitcher.story.vue +87 -0
  112. package/src/components/AppPluginSwitcher.vue +2 -5
  113. package/src/components/AppSidebar.vue +0 -4
  114. package/src/components/AppToastContainer.vue +6 -8
  115. package/src/components/AppTopBar.vue +0 -4
  116. package/src/components/ArtifactSaveDialog.vue +0 -4
  117. package/src/components/ArtifactSelectorModal.vue +0 -4
  118. package/src/components/AuditTrail.story.vue +18 -0
  119. package/src/components/AuditTrail.vue +27 -7
  120. package/src/components/AutoGroupModal.vue +0 -4
  121. package/src/components/Avatar.vue +0 -4
  122. package/src/components/BaseButton.vue +0 -4
  123. package/src/components/BaseCheckbox.vue +0 -4
  124. package/src/components/BaseInput.vue +0 -4
  125. package/src/components/BaseModal.vue +0 -4
  126. package/src/components/BasePill.vue +0 -4
  127. package/src/components/BaseRadioGroup.vue +0 -4
  128. package/src/components/BaseSelect.vue +0 -4
  129. package/src/components/BaseSlider.vue +0 -4
  130. package/src/components/BaseTabs.vue +0 -4
  131. package/src/components/BaseTextarea.vue +0 -4
  132. package/src/components/BaseToggle.vue +0 -4
  133. package/src/components/BatchProgressList.story.vue +18 -0
  134. package/src/components/BatchProgressList.vue +32 -4
  135. package/src/components/Breadcrumb.vue +0 -4
  136. package/src/components/Calendar.vue +0 -4
  137. package/src/components/ChartContainer.story.vue +1 -1
  138. package/src/components/ChartContainer.vue +0 -4
  139. package/src/components/ChemicalFormula.vue +0 -4
  140. package/src/components/CollapsibleCard.vue +0 -4
  141. package/src/components/ColorSlider.vue +0 -4
  142. package/src/components/ConcentrationInput.vue +0 -4
  143. package/src/components/ConfirmDialog.vue +0 -4
  144. package/src/components/DataFrame.story.vue +14 -0
  145. package/src/components/DataFrame.vue +97 -23
  146. package/src/components/DatePicker.vue +73 -27
  147. package/src/components/DateTimePicker.vue +45 -17
  148. package/src/components/Divider.vue +0 -4
  149. package/src/components/DoseCalculator.vue +0 -4
  150. package/src/components/DropdownButton.vue +2 -14
  151. package/src/components/EmptyState.vue +0 -4
  152. package/src/components/ExperimentCodeBadge.vue +0 -4
  153. package/src/components/ExperimentDataViewer.story.vue +3 -0
  154. package/src/components/ExperimentDataViewer.vue +33 -13
  155. package/src/components/ExperimentPopover.vue +2 -5
  156. package/src/components/ExperimentSelectorModal.vue +0 -4
  157. package/src/components/ExperimentTimeline.story.vue +18 -0
  158. package/src/components/ExperimentTimeline.vue +81 -75
  159. package/src/components/FileUploader.vue +0 -4
  160. package/src/components/FitPanel.vue +0 -4
  161. package/src/components/FormActions.story.vue +96 -0
  162. package/src/components/FormActions.vue +0 -4
  163. package/src/components/FormBuilder.vue +0 -4
  164. package/src/components/FormField.vue +0 -4
  165. package/src/components/FormulaInput.vue +0 -4
  166. package/src/components/GeneratedPathInput.story.vue +68 -0
  167. package/src/components/GeneratedPlotlyResult.story.vue +96 -0
  168. package/src/components/GeneratedPlotlyResult.vue +3 -3
  169. package/src/components/GeneratedPluginView.story.vue +145 -0
  170. package/src/components/GeneratedPluginView.vue +10 -10
  171. package/src/components/GeneratedResultRenderer.story.vue +117 -0
  172. package/src/components/GeneratedResultRenderer.vue +4 -4
  173. package/src/components/GroupAssigner.vue +67 -5
  174. package/src/components/IconButton.vue +0 -4
  175. package/src/components/InstrumentAlertLog.vue +0 -4
  176. package/src/components/InstrumentStateBadge.vue +0 -4
  177. package/src/components/InstrumentStatusCard.vue +0 -4
  178. package/src/components/JobsStatusTray.vue +0 -4
  179. package/src/components/LcmsSequenceTable.vue +81 -50
  180. package/src/components/LoadingSpinner.vue +0 -4
  181. package/src/components/MobileSupportGate.vue +0 -4
  182. package/src/components/MoleculeInput.vue +0 -4
  183. package/src/components/MultiSelect.vue +0 -4
  184. package/src/components/NumberInput.vue +0 -4
  185. package/src/components/PlateMapEditor.vue +3 -14
  186. package/src/components/PluginIcon.vue +0 -4
  187. package/src/components/ProgressBar.vue +0 -4
  188. package/src/components/ProtocolStepEditor.vue +2 -4
  189. package/src/components/RackEditor.vue +51 -70
  190. package/src/components/ReagentEditor.vue +0 -4
  191. package/src/components/ReagentList.story.vue +18 -0
  192. package/src/components/ReagentList.vue +127 -82
  193. package/src/components/ResourceCard.vue +0 -4
  194. package/src/components/RuntimeUpdateNotice.story.vue +49 -0
  195. package/src/components/RuntimeUpdateNotice.vue +4 -4
  196. package/src/components/SampleHierarchyTree.story.vue +18 -0
  197. package/src/components/SampleHierarchyTree.vue +32 -9
  198. package/src/components/SampleLegend.vue +2 -8
  199. package/src/components/SampleSelector.drag.ts +51 -0
  200. package/src/components/SampleSelector.story.vue +6 -0
  201. package/src/components/SampleSelector.tree.ts +2 -0
  202. package/src/components/SampleSelector.vue +49 -10
  203. package/src/components/SampleSelectorGroupNode.vue +19 -0
  204. package/src/components/ScheduleCalendar.story.vue +6 -0
  205. package/src/components/ScheduleCalendar.vue +82 -7
  206. package/src/components/ScientificNumber.vue +0 -4
  207. package/src/components/SectionCard.vue +0 -4
  208. package/src/components/SegmentedControl.vue +48 -5
  209. package/src/components/SequenceInput.vue +0 -4
  210. package/src/components/SequenceProgressBar.story.vue +110 -0
  211. package/src/components/SequenceProgressBar.vue +0 -4
  212. package/src/components/SettingsModal.vue +0 -4
  213. package/src/components/Skeleton.vue +0 -4
  214. package/src/components/SmartGroupFieldRecipe.vue +8 -6
  215. package/src/components/SmartGroupManual.vue +0 -4
  216. package/src/components/StatusIndicator.vue +0 -4
  217. package/src/components/StepWizard.vue +0 -4
  218. package/src/components/TagsInput.vue +4 -6
  219. package/src/components/ThemeToggle.vue +0 -4
  220. package/src/components/TimePicker.vue +36 -7
  221. package/src/components/TimeRangeInput.vue +0 -4
  222. package/src/components/Tooltip.story.vue +3 -3
  223. package/src/components/Tooltip.vue +0 -4
  224. package/src/components/UnitInput.vue +0 -4
  225. package/src/components/WellPlate.geometry.ts +60 -1
  226. package/src/components/WellPlate.interaction.ts +44 -0
  227. package/src/components/WellPlate.story.vue +8 -0
  228. package/src/components/WellPlate.vue +53 -7
  229. package/src/components/internal/AppTopBarPageSelectorInternal.vue +2 -5
  230. package/src/components/internal/AppTopBarPillNavInternal.vue +0 -4
  231. package/src/components/internal/DataStateInternal.vue +74 -0
  232. package/src/components/internal/FormSectionRenderer.vue +0 -4
  233. package/src/components/internal/WellEditPopupInternal.vue +0 -4
  234. package/src/composables/controlSchemaTypes.ts +34 -0
  235. package/src/composables/index.ts +10 -0
  236. package/src/composables/useDropdownState.ts +35 -5
  237. package/src/composables/useEventStream.ts +14 -2
  238. package/src/composables/useFileImport.ts +2 -7
  239. package/src/composables/useGeneratedAnalysis.ts +8 -9
  240. package/src/composables/useListReorder.story.vue +143 -0
  241. package/src/composables/useListReorder.ts +242 -0
  242. package/src/composables/useMenuKeyboard.ts +2 -2
  243. package/src/composables/useOptimisticMutation.ts +1 -15
  244. package/src/composables/usePluginConfig.ts +3 -1
  245. package/src/composables/useRackEditor.ts +2 -11
  246. package/src/composables/useRequestSyncState.ts +98 -28
  247. package/src/composables/useResourceCrud.ts +1 -15
  248. package/src/composables/useScheduleDrag.ts +37 -0
  249. package/src/composables/useWellPainting.ts +5 -29
  250. package/src/composables/useWellPlateEditor.ts +1 -11
  251. package/src/permissions.ts +48 -9
  252. package/src/stores/experiment.ts +2 -7
  253. package/src/stores/index.ts +9 -1
  254. package/src/stores/settings.ts +93 -1
  255. package/src/styles/components/audit-trail.css +5 -5
  256. package/src/styles/components/batch-progress-list.css +7 -0
  257. package/src/styles/components/color-slider.css +2 -2
  258. package/src/styles/components/data-state.css +30 -0
  259. package/src/styles/components/dataframe.css +29 -35
  260. package/src/styles/components/experiment-data-viewer.css +4 -4
  261. package/src/styles/components/experiment-timeline.css +3 -30
  262. package/src/styles/components/form-builder.css +5 -5
  263. package/src/styles/components/lcms-sequence-table.css +16 -1
  264. package/src/styles/components/multi-select.css +1 -1
  265. package/src/styles/components/reagent-list.css +38 -31
  266. package/src/styles/components/sample-hierarchy-tree.css +5 -19
  267. package/src/styles/components/sample-selector.css +9 -2
  268. package/src/styles/components/schedule-calendar.css +8 -0
  269. package/src/styles/components/scientific-number.css +1 -1
  270. package/src/styles/components/well-plate.css +8 -0
  271. package/src/styles/index.css +8 -0
  272. package/src/styles/variables.css +29 -0
  273. package/src/templates/builderPresetControls.ts +1 -1
  274. package/src/templates/componentPlateHelpers.ts +3 -1
  275. package/src/templates/doseResponseAdapters.ts +2 -13
  276. package/src/templates/elisaAssayCollectionBuilder.ts +2 -2
  277. package/src/templates/plateMapBuilder.ts +2 -2
  278. package/src/templates/qpcrPlateBuilder.ts +1 -1
  279. package/src/templates/templateValidators.ts +1 -1
  280. package/src/templates/timeCourseBuilder.ts +2 -2
  281. package/src/templates/wellPlateScreenCollectionBuilder.ts +2 -2
  282. package/src/utils/color.ts +51 -0
  283. package/src/utils/errors.ts +29 -0
  284. package/dist/EmptyState-NBqf2_8z.js.map +0 -1
  285. package/dist/ExperimentPopover-CfOdh5Rm.js.map +0 -1
  286. package/dist/ExperimentSelectorModal-DvIagrxY.js.map +0 -1
  287. package/dist/SettingsModal-W3TYfnP9.js.map +0 -1
  288. package/dist/components-B80gV0P6.js.map +0 -1
  289. package/dist/composables/autoGroupConstants.d.ts +0 -1
  290. package/dist/composables/autoGroupGrouping.d.ts +0 -3
  291. package/dist/composables/useAutoGroupInputSources.d.ts +0 -32
  292. package/dist/composables-C8mmD5ta.js.map +0 -1
  293. package/dist/experiment-Y9Iz7KYi.js.map +0 -1
  294. package/dist/templates/builderDefaults.d.ts +0 -1
  295. package/dist/templates/plateGeometry.d.ts +0 -4
  296. package/dist/templates-CK72aKO1.js.map +0 -1
  297. package/dist/useApi-CDBq6z23.js.map +0 -1
  298. package/dist/useControlSchema-_OVhavKq.js.map +0 -1
  299. package/dist/useDropdownState-D5G4UvWd.js.map +0 -1
  300. package/dist/useProtocolTemplates-Dq5Pzwyd.js.map +0 -1
  301. package/src/__tests__/composables/useAutoGroupInputSources.test.ts +0 -127
  302. package/src/composables/autoGroupConstants.ts +0 -4
  303. package/src/composables/autoGroupGrouping.ts +0 -148
  304. package/src/composables/useAutoGroupInputSources.ts +0 -147
  305. package/src/templates/builderDefaults.ts +0 -11
  306. package/src/templates/plateGeometry.ts +0 -62
  307. /package/dist/__tests__/{composables/useAutoGroupInputSources.test.d.ts → components/DataStates.test.d.ts} +0 -0
@@ -1,9 +1,10 @@
1
- import { c as formatExperimentDate, f as BaseModal_default, h as BaseButton_default, m as useEventListener } from "./experiment-utils-DV3DrvE_.js";
2
- import { a as BaseSelect_default, i as BasePill_default, n as Skeleton_default, o as normalizeOptionInput, r as useRequestSyncState, s as BaseInput_default, t as EmptyState_default } from "./EmptyState-NBqf2_8z.js";
3
- import { t as useDropdownState } from "./useDropdownState-D5G4UvWd.js";
4
- import { r as useApi } from "./useApi-CDBq6z23.js";
1
+ import { c as formatExperimentDate, f as BaseModal_default, h as BaseButton_default, m as useEventListener, p as useFocusTrap } from "./experiment-utils-DV3DrvE_.js";
2
+ import { a as BaseSelect_default, i as BasePill_default, n as useRequestSyncState, o as normalizeOptionInput, r as EmptyState_default, s as BaseInput_default, t as Skeleton_default } from "./Skeleton-DxtwJ5gt.js";
3
+ import { t as useDropdownState } from "./useDropdownState-DitCtrTT.js";
4
+ import { i as useApi, u as tryUseSettingsStore } from "./errors-_W0-LbA6.js";
5
5
  import { hasAllPermissions } from "./permissions.js";
6
- import { Fragment, Teleport, Transition, TransitionGroup, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createStaticVNode, createTextVNode, createVNode, defineComponent, getCurrentInstance, getCurrentScope, isRef, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, onScopeDispose, onUnmounted, openBlock, reactive, ref, renderList, renderSlot, shallowRef, toDisplayString, toValue, unref, useSlots, vModelText, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
6
+ import { Fragment, Teleport, Transition, TransitionGroup, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createStaticVNode, createTextVNode, createVNode, defineComponent, getCurrentInstance, getCurrentScope, isRef, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, onScopeDispose, onUnmounted, openBlock, reactive, ref, renderList, renderSlot, shallowRef, toDisplayString, toValue, unref, useId, useSlots, vModelText, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
7
+ import { autoUpdate, computePosition, flip, offset, shift } from "@floating-ui/dom";
7
8
  //#region src/components/BaseTextarea.vue?vue&type=script&setup=true&lang.ts
8
9
  var _hoisted_1$22 = [
9
10
  "value",
@@ -78,995 +79,10 @@ var BaseTextarea_default = /* @__PURE__ */ defineComponent({
78
79
  }
79
80
  });
80
81
  //#endregion
81
- //#region ../../node_modules/.bun/@floating-ui+utils@0.2.11/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs
82
- var min = Math.min;
83
- var max = Math.max;
84
- var round = Math.round;
85
- var createCoords = (v) => ({
86
- x: v,
87
- y: v
88
- });
89
- var oppositeSideMap = {
90
- left: "right",
91
- right: "left",
92
- bottom: "top",
93
- top: "bottom"
94
- };
95
- function clamp(start, value, end) {
96
- return max(start, min(value, end));
97
- }
98
- function evaluate(value, param) {
99
- return typeof value === "function" ? value(param) : value;
100
- }
101
- function getSide(placement) {
102
- return placement.split("-")[0];
103
- }
104
- function getAlignment(placement) {
105
- return placement.split("-")[1];
106
- }
107
- function getOppositeAxis(axis) {
108
- return axis === "x" ? "y" : "x";
109
- }
110
- function getAxisLength(axis) {
111
- return axis === "y" ? "height" : "width";
112
- }
113
- function getSideAxis(placement) {
114
- const firstChar = placement[0];
115
- return firstChar === "t" || firstChar === "b" ? "y" : "x";
116
- }
117
- function getAlignmentAxis(placement) {
118
- return getOppositeAxis(getSideAxis(placement));
119
- }
120
- function getAlignmentSides(placement, rects, rtl) {
121
- if (rtl === void 0) rtl = false;
122
- const alignment = getAlignment(placement);
123
- const alignmentAxis = getAlignmentAxis(placement);
124
- const length = getAxisLength(alignmentAxis);
125
- let mainAlignmentSide = alignmentAxis === "x" ? alignment === (rtl ? "end" : "start") ? "right" : "left" : alignment === "start" ? "bottom" : "top";
126
- if (rects.reference[length] > rects.floating[length]) mainAlignmentSide = getOppositePlacement(mainAlignmentSide);
127
- return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];
128
- }
129
- function getExpandedPlacements(placement) {
130
- const oppositePlacement = getOppositePlacement(placement);
131
- return [
132
- getOppositeAlignmentPlacement(placement),
133
- oppositePlacement,
134
- getOppositeAlignmentPlacement(oppositePlacement)
135
- ];
136
- }
137
- function getOppositeAlignmentPlacement(placement) {
138
- return placement.includes("start") ? placement.replace("start", "end") : placement.replace("end", "start");
139
- }
140
- var lrPlacement = ["left", "right"];
141
- var rlPlacement = ["right", "left"];
142
- var tbPlacement = ["top", "bottom"];
143
- var btPlacement = ["bottom", "top"];
144
- function getSideList(side, isStart, rtl) {
145
- switch (side) {
146
- case "top":
147
- case "bottom":
148
- if (rtl) return isStart ? rlPlacement : lrPlacement;
149
- return isStart ? lrPlacement : rlPlacement;
150
- case "left":
151
- case "right": return isStart ? tbPlacement : btPlacement;
152
- default: return [];
153
- }
154
- }
155
- function getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {
156
- const alignment = getAlignment(placement);
157
- let list = getSideList(getSide(placement), direction === "start", rtl);
158
- if (alignment) {
159
- list = list.map((side) => side + "-" + alignment);
160
- if (flipAlignment) list = list.concat(list.map(getOppositeAlignmentPlacement));
161
- }
162
- return list;
163
- }
164
- function getOppositePlacement(placement) {
165
- const side = getSide(placement);
166
- return oppositeSideMap[side] + placement.slice(side.length);
167
- }
168
- function expandPaddingObject(padding) {
169
- return {
170
- top: 0,
171
- right: 0,
172
- bottom: 0,
173
- left: 0,
174
- ...padding
175
- };
176
- }
177
- function getPaddingObject(padding) {
178
- return typeof padding !== "number" ? expandPaddingObject(padding) : {
179
- top: padding,
180
- right: padding,
181
- bottom: padding,
182
- left: padding
183
- };
184
- }
185
- function rectToClientRect(rect) {
186
- const { x, y, width, height } = rect;
187
- return {
188
- width,
189
- height,
190
- top: y,
191
- left: x,
192
- right: x + width,
193
- bottom: y + height,
194
- x,
195
- y
196
- };
197
- }
198
- //#endregion
199
- //#region ../../node_modules/.bun/@floating-ui+core@1.7.5/node_modules/@floating-ui/core/dist/floating-ui.core.mjs
200
- function computeCoordsFromPlacement(_ref, placement, rtl) {
201
- let { reference, floating } = _ref;
202
- const sideAxis = getSideAxis(placement);
203
- const alignmentAxis = getAlignmentAxis(placement);
204
- const alignLength = getAxisLength(alignmentAxis);
205
- const side = getSide(placement);
206
- const isVertical = sideAxis === "y";
207
- const commonX = reference.x + reference.width / 2 - floating.width / 2;
208
- const commonY = reference.y + reference.height / 2 - floating.height / 2;
209
- const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;
210
- let coords;
211
- switch (side) {
212
- case "top":
213
- coords = {
214
- x: commonX,
215
- y: reference.y - floating.height
216
- };
217
- break;
218
- case "bottom":
219
- coords = {
220
- x: commonX,
221
- y: reference.y + reference.height
222
- };
223
- break;
224
- case "right":
225
- coords = {
226
- x: reference.x + reference.width,
227
- y: commonY
228
- };
229
- break;
230
- case "left":
231
- coords = {
232
- x: reference.x - floating.width,
233
- y: commonY
234
- };
235
- break;
236
- default: coords = {
237
- x: reference.x,
238
- y: reference.y
239
- };
240
- }
241
- switch (getAlignment(placement)) {
242
- case "start":
243
- coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);
244
- break;
245
- case "end":
246
- coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);
247
- break;
248
- }
249
- return coords;
250
- }
251
- /**
252
- * Resolves with an object of overflow side offsets that determine how much the
253
- * element is overflowing a given clipping boundary on each side.
254
- * - positive = overflowing the boundary by that number of pixels
255
- * - negative = how many pixels left before it will overflow
256
- * - 0 = lies flush with the boundary
257
- * @see https://floating-ui.com/docs/detectOverflow
258
- */
259
- async function detectOverflow(state, options) {
260
- var _await$platform$isEle;
261
- if (options === void 0) options = {};
262
- const { x, y, platform, rects, elements, strategy } = state;
263
- const { boundary = "clippingAncestors", rootBoundary = "viewport", elementContext = "floating", altBoundary = false, padding = 0 } = evaluate(options, state);
264
- const paddingObject = getPaddingObject(padding);
265
- const element = elements[altBoundary ? elementContext === "floating" ? "reference" : "floating" : elementContext];
266
- const clippingClientRect = rectToClientRect(await platform.getClippingRect({
267
- element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating)),
268
- boundary,
269
- rootBoundary,
270
- strategy
271
- }));
272
- const rect = elementContext === "floating" ? {
273
- x,
274
- y,
275
- width: rects.floating.width,
276
- height: rects.floating.height
277
- } : rects.reference;
278
- const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));
279
- const offsetScale = await (platform.isElement == null ? void 0 : platform.isElement(offsetParent)) ? await (platform.getScale == null ? void 0 : platform.getScale(offsetParent)) || {
280
- x: 1,
281
- y: 1
282
- } : {
283
- x: 1,
284
- y: 1
285
- };
286
- const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({
287
- elements,
288
- rect,
289
- offsetParent,
290
- strategy
291
- }) : rect);
292
- return {
293
- top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,
294
- bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,
295
- left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,
296
- right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x
297
- };
298
- }
299
- var MAX_RESET_COUNT = 50;
300
- /**
301
- * Computes the `x` and `y` coordinates that will place the floating element
302
- * next to a given reference element.
303
- *
304
- * This export does not have any `platform` interface logic. You will need to
305
- * write one for the platform you are using Floating UI with.
306
- */
307
- var computePosition$1 = async (reference, floating, config) => {
308
- const { placement = "bottom", strategy = "absolute", middleware = [], platform } = config;
309
- const platformWithDetectOverflow = platform.detectOverflow ? platform : {
310
- ...platform,
311
- detectOverflow
312
- };
313
- const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));
314
- let rects = await platform.getElementRects({
315
- reference,
316
- floating,
317
- strategy
318
- });
319
- let { x, y } = computeCoordsFromPlacement(rects, placement, rtl);
320
- let statefulPlacement = placement;
321
- let resetCount = 0;
322
- const middlewareData = {};
323
- for (let i = 0; i < middleware.length; i++) {
324
- const currentMiddleware = middleware[i];
325
- if (!currentMiddleware) continue;
326
- const { name, fn } = currentMiddleware;
327
- const { x: nextX, y: nextY, data, reset } = await fn({
328
- x,
329
- y,
330
- initialPlacement: placement,
331
- placement: statefulPlacement,
332
- strategy,
333
- middlewareData,
334
- rects,
335
- platform: platformWithDetectOverflow,
336
- elements: {
337
- reference,
338
- floating
339
- }
340
- });
341
- x = nextX != null ? nextX : x;
342
- y = nextY != null ? nextY : y;
343
- middlewareData[name] = {
344
- ...middlewareData[name],
345
- ...data
346
- };
347
- if (reset && resetCount < MAX_RESET_COUNT) {
348
- resetCount++;
349
- if (typeof reset === "object") {
350
- if (reset.placement) statefulPlacement = reset.placement;
351
- if (reset.rects) rects = reset.rects === true ? await platform.getElementRects({
352
- reference,
353
- floating,
354
- strategy
355
- }) : reset.rects;
356
- ({x, y} = computeCoordsFromPlacement(rects, statefulPlacement, rtl));
357
- }
358
- i = -1;
359
- }
360
- }
361
- return {
362
- x,
363
- y,
364
- placement: statefulPlacement,
365
- strategy,
366
- middlewareData
367
- };
368
- };
369
- /**
370
- * Optimizes the visibility of the floating element by flipping the `placement`
371
- * in order to keep it in view when the preferred placement(s) will overflow the
372
- * clipping boundary. Alternative to `autoPlacement`.
373
- * @see https://floating-ui.com/docs/flip
374
- */
375
- var flip$1 = function(options) {
376
- if (options === void 0) options = {};
377
- return {
378
- name: "flip",
379
- options,
380
- async fn(state) {
381
- var _middlewareData$arrow, _middlewareData$flip;
382
- const { placement, middlewareData, rects, initialPlacement, platform, elements } = state;
383
- const { mainAxis: checkMainAxis = true, crossAxis: checkCrossAxis = true, fallbackPlacements: specifiedFallbackPlacements, fallbackStrategy = "bestFit", fallbackAxisSideDirection = "none", flipAlignment = true, ...detectOverflowOptions } = evaluate(options, state);
384
- if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) return {};
385
- const side = getSide(placement);
386
- const initialSideAxis = getSideAxis(initialPlacement);
387
- const isBasePlacement = getSide(initialPlacement) === initialPlacement;
388
- const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));
389
- const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));
390
- const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== "none";
391
- if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));
392
- const placements = [initialPlacement, ...fallbackPlacements];
393
- const overflow = await platform.detectOverflow(state, detectOverflowOptions);
394
- const overflows = [];
395
- let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];
396
- if (checkMainAxis) overflows.push(overflow[side]);
397
- if (checkCrossAxis) {
398
- const sides = getAlignmentSides(placement, rects, rtl);
399
- overflows.push(overflow[sides[0]], overflow[sides[1]]);
400
- }
401
- overflowsData = [...overflowsData, {
402
- placement,
403
- overflows
404
- }];
405
- if (!overflows.every((side) => side <= 0)) {
406
- var _middlewareData$flip2, _overflowsData$filter;
407
- const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;
408
- const nextPlacement = placements[nextIndex];
409
- if (nextPlacement) {
410
- if (!(checkCrossAxis === "alignment" ? initialSideAxis !== getSideAxis(nextPlacement) : false) || overflowsData.every((d) => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) return {
411
- data: {
412
- index: nextIndex,
413
- overflows: overflowsData
414
- },
415
- reset: { placement: nextPlacement }
416
- };
417
- }
418
- let resetPlacement = (_overflowsData$filter = overflowsData.filter((d) => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;
419
- if (!resetPlacement) switch (fallbackStrategy) {
420
- case "bestFit": {
421
- var _overflowsData$filter2;
422
- const placement = (_overflowsData$filter2 = overflowsData.filter((d) => {
423
- if (hasFallbackAxisSideDirection) {
424
- const currentSideAxis = getSideAxis(d.placement);
425
- return currentSideAxis === initialSideAxis || currentSideAxis === "y";
426
- }
427
- return true;
428
- }).map((d) => [d.placement, d.overflows.filter((overflow) => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];
429
- if (placement) resetPlacement = placement;
430
- break;
431
- }
432
- case "initialPlacement":
433
- resetPlacement = initialPlacement;
434
- break;
435
- }
436
- if (placement !== resetPlacement) return { reset: { placement: resetPlacement } };
437
- }
438
- return {};
439
- }
440
- };
441
- };
442
- var originSides = /* @__PURE__ */ new Set(["left", "top"]);
443
- async function convertValueToCoords(state, options) {
444
- const { placement, platform, elements } = state;
445
- const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));
446
- const side = getSide(placement);
447
- const alignment = getAlignment(placement);
448
- const isVertical = getSideAxis(placement) === "y";
449
- const mainAxisMulti = originSides.has(side) ? -1 : 1;
450
- const crossAxisMulti = rtl && isVertical ? -1 : 1;
451
- const rawValue = evaluate(options, state);
452
- let { mainAxis, crossAxis, alignmentAxis } = typeof rawValue === "number" ? {
453
- mainAxis: rawValue,
454
- crossAxis: 0,
455
- alignmentAxis: null
456
- } : {
457
- mainAxis: rawValue.mainAxis || 0,
458
- crossAxis: rawValue.crossAxis || 0,
459
- alignmentAxis: rawValue.alignmentAxis
460
- };
461
- if (alignment && typeof alignmentAxis === "number") crossAxis = alignment === "end" ? alignmentAxis * -1 : alignmentAxis;
462
- return isVertical ? {
463
- x: crossAxis * crossAxisMulti,
464
- y: mainAxis * mainAxisMulti
465
- } : {
466
- x: mainAxis * mainAxisMulti,
467
- y: crossAxis * crossAxisMulti
468
- };
469
- }
470
- /**
471
- * Modifies the placement by translating the floating element along the
472
- * specified axes.
473
- * A number (shorthand for `mainAxis` or distance), or an axes configuration
474
- * object may be passed.
475
- * @see https://floating-ui.com/docs/offset
476
- */
477
- var offset$1 = function(options) {
478
- if (options === void 0) options = 0;
479
- return {
480
- name: "offset",
481
- options,
482
- async fn(state) {
483
- var _middlewareData$offse, _middlewareData$arrow;
484
- const { x, y, placement, middlewareData } = state;
485
- const diffCoords = await convertValueToCoords(state, options);
486
- if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) return {};
487
- return {
488
- x: x + diffCoords.x,
489
- y: y + diffCoords.y,
490
- data: {
491
- ...diffCoords,
492
- placement
493
- }
494
- };
495
- }
496
- };
497
- };
498
- /**
499
- * Optimizes the visibility of the floating element by shifting it in order to
500
- * keep it in view when it will overflow the clipping boundary.
501
- * @see https://floating-ui.com/docs/shift
502
- */
503
- var shift$1 = function(options) {
504
- if (options === void 0) options = {};
505
- return {
506
- name: "shift",
507
- options,
508
- async fn(state) {
509
- const { x, y, placement, platform } = state;
510
- const { mainAxis: checkMainAxis = true, crossAxis: checkCrossAxis = false, limiter = { fn: (_ref) => {
511
- let { x, y } = _ref;
512
- return {
513
- x,
514
- y
515
- };
516
- } }, ...detectOverflowOptions } = evaluate(options, state);
517
- const coords = {
518
- x,
519
- y
520
- };
521
- const overflow = await platform.detectOverflow(state, detectOverflowOptions);
522
- const crossAxis = getSideAxis(getSide(placement));
523
- const mainAxis = getOppositeAxis(crossAxis);
524
- let mainAxisCoord = coords[mainAxis];
525
- let crossAxisCoord = coords[crossAxis];
526
- if (checkMainAxis) {
527
- const minSide = mainAxis === "y" ? "top" : "left";
528
- const maxSide = mainAxis === "y" ? "bottom" : "right";
529
- const min = mainAxisCoord + overflow[minSide];
530
- const max = mainAxisCoord - overflow[maxSide];
531
- mainAxisCoord = clamp(min, mainAxisCoord, max);
532
- }
533
- if (checkCrossAxis) {
534
- const minSide = crossAxis === "y" ? "top" : "left";
535
- const maxSide = crossAxis === "y" ? "bottom" : "right";
536
- const min = crossAxisCoord + overflow[minSide];
537
- const max = crossAxisCoord - overflow[maxSide];
538
- crossAxisCoord = clamp(min, crossAxisCoord, max);
539
- }
540
- const limitedCoords = limiter.fn({
541
- ...state,
542
- [mainAxis]: mainAxisCoord,
543
- [crossAxis]: crossAxisCoord
544
- });
545
- return {
546
- ...limitedCoords,
547
- data: {
548
- x: limitedCoords.x - x,
549
- y: limitedCoords.y - y,
550
- enabled: {
551
- [mainAxis]: checkMainAxis,
552
- [crossAxis]: checkCrossAxis
553
- }
554
- }
555
- };
556
- }
557
- };
558
- };
559
- //#endregion
560
- //#region ../../node_modules/.bun/@floating-ui+utils@0.2.11/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs
561
- function hasWindow() {
562
- return typeof window !== "undefined";
563
- }
564
- function getNodeName(node) {
565
- if (isNode(node)) return (node.nodeName || "").toLowerCase();
566
- return "#document";
567
- }
568
- function getWindow(node) {
569
- var _node$ownerDocument;
570
- return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;
571
- }
572
- function getDocumentElement(node) {
573
- var _ref;
574
- return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;
575
- }
576
- function isNode(value) {
577
- if (!hasWindow()) return false;
578
- return value instanceof Node || value instanceof getWindow(value).Node;
579
- }
580
- function isElement(value) {
581
- if (!hasWindow()) return false;
582
- return value instanceof Element || value instanceof getWindow(value).Element;
583
- }
584
- function isHTMLElement(value) {
585
- if (!hasWindow()) return false;
586
- return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;
587
- }
588
- function isShadowRoot(value) {
589
- if (!hasWindow() || typeof ShadowRoot === "undefined") return false;
590
- return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;
591
- }
592
- function isOverflowElement(element) {
593
- const { overflow, overflowX, overflowY, display } = getComputedStyle$1(element);
594
- return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && display !== "inline" && display !== "contents";
595
- }
596
- function isTableElement(element) {
597
- return /^(table|td|th)$/.test(getNodeName(element));
598
- }
599
- function isTopLayer(element) {
600
- try {
601
- if (element.matches(":popover-open")) return true;
602
- } catch (_e) {}
603
- try {
604
- return element.matches(":modal");
605
- } catch (_e) {
606
- return false;
607
- }
608
- }
609
- var willChangeRe = /transform|translate|scale|rotate|perspective|filter/;
610
- var containRe = /paint|layout|strict|content/;
611
- var isNotNone = (value) => !!value && value !== "none";
612
- var isWebKitValue;
613
- function isContainingBlock(elementOrCss) {
614
- const css = isElement(elementOrCss) ? getComputedStyle$1(elementOrCss) : elementOrCss;
615
- return isNotNone(css.transform) || isNotNone(css.translate) || isNotNone(css.scale) || isNotNone(css.rotate) || isNotNone(css.perspective) || !isWebKit() && (isNotNone(css.backdropFilter) || isNotNone(css.filter)) || willChangeRe.test(css.willChange || "") || containRe.test(css.contain || "");
616
- }
617
- function getContainingBlock(element) {
618
- let currentNode = getParentNode(element);
619
- while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {
620
- if (isContainingBlock(currentNode)) return currentNode;
621
- else if (isTopLayer(currentNode)) return null;
622
- currentNode = getParentNode(currentNode);
623
- }
624
- return null;
625
- }
626
- function isWebKit() {
627
- if (isWebKitValue == null) isWebKitValue = typeof CSS !== "undefined" && CSS.supports && CSS.supports("-webkit-backdrop-filter", "none");
628
- return isWebKitValue;
629
- }
630
- function isLastTraversableNode(node) {
631
- return /^(html|body|#document)$/.test(getNodeName(node));
632
- }
633
- function getComputedStyle$1(element) {
634
- return getWindow(element).getComputedStyle(element);
635
- }
636
- function getNodeScroll(element) {
637
- if (isElement(element)) return {
638
- scrollLeft: element.scrollLeft,
639
- scrollTop: element.scrollTop
640
- };
641
- return {
642
- scrollLeft: element.scrollX,
643
- scrollTop: element.scrollY
644
- };
645
- }
646
- function getParentNode(node) {
647
- if (getNodeName(node) === "html") return node;
648
- const result = node.assignedSlot || node.parentNode || isShadowRoot(node) && node.host || getDocumentElement(node);
649
- return isShadowRoot(result) ? result.host : result;
650
- }
651
- function getNearestOverflowAncestor(node) {
652
- const parentNode = getParentNode(node);
653
- if (isLastTraversableNode(parentNode)) return node.ownerDocument ? node.ownerDocument.body : node.body;
654
- if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) return parentNode;
655
- return getNearestOverflowAncestor(parentNode);
656
- }
657
- function getOverflowAncestors(node, list, traverseIframes) {
658
- var _node$ownerDocument2;
659
- if (list === void 0) list = [];
660
- if (traverseIframes === void 0) traverseIframes = true;
661
- const scrollableAncestor = getNearestOverflowAncestor(node);
662
- const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);
663
- const win = getWindow(scrollableAncestor);
664
- if (isBody) {
665
- const frameElement = getFrameElement(win);
666
- return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);
667
- } else return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));
668
- }
669
- function getFrameElement(win) {
670
- return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;
671
- }
672
- //#endregion
673
- //#region ../../node_modules/.bun/@floating-ui+dom@1.7.6/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs
674
- function getCssDimensions(element) {
675
- const css = getComputedStyle$1(element);
676
- let width = parseFloat(css.width) || 0;
677
- let height = parseFloat(css.height) || 0;
678
- const hasOffset = isHTMLElement(element);
679
- const offsetWidth = hasOffset ? element.offsetWidth : width;
680
- const offsetHeight = hasOffset ? element.offsetHeight : height;
681
- const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;
682
- if (shouldFallback) {
683
- width = offsetWidth;
684
- height = offsetHeight;
685
- }
686
- return {
687
- width,
688
- height,
689
- $: shouldFallback
690
- };
691
- }
692
- function unwrapElement(element) {
693
- return !isElement(element) ? element.contextElement : element;
694
- }
695
- function getScale(element) {
696
- const domElement = unwrapElement(element);
697
- if (!isHTMLElement(domElement)) return createCoords(1);
698
- const rect = domElement.getBoundingClientRect();
699
- const { width, height, $ } = getCssDimensions(domElement);
700
- let x = ($ ? round(rect.width) : rect.width) / width;
701
- let y = ($ ? round(rect.height) : rect.height) / height;
702
- if (!x || !Number.isFinite(x)) x = 1;
703
- if (!y || !Number.isFinite(y)) y = 1;
704
- return {
705
- x,
706
- y
707
- };
708
- }
709
- var noOffsets = /* @__PURE__ */ createCoords(0);
710
- function getVisualOffsets(element) {
711
- const win = getWindow(element);
712
- if (!isWebKit() || !win.visualViewport) return noOffsets;
713
- return {
714
- x: win.visualViewport.offsetLeft,
715
- y: win.visualViewport.offsetTop
716
- };
717
- }
718
- function shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {
719
- if (isFixed === void 0) isFixed = false;
720
- if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) return false;
721
- return isFixed;
722
- }
723
- function getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {
724
- if (includeScale === void 0) includeScale = false;
725
- if (isFixedStrategy === void 0) isFixedStrategy = false;
726
- const clientRect = element.getBoundingClientRect();
727
- const domElement = unwrapElement(element);
728
- let scale = createCoords(1);
729
- if (includeScale) if (offsetParent) {
730
- if (isElement(offsetParent)) scale = getScale(offsetParent);
731
- } else scale = getScale(element);
732
- const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);
733
- let x = (clientRect.left + visualOffsets.x) / scale.x;
734
- let y = (clientRect.top + visualOffsets.y) / scale.y;
735
- let width = clientRect.width / scale.x;
736
- let height = clientRect.height / scale.y;
737
- if (domElement) {
738
- const win = getWindow(domElement);
739
- const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;
740
- let currentWin = win;
741
- let currentIFrame = getFrameElement(currentWin);
742
- while (currentIFrame && offsetParent && offsetWin !== currentWin) {
743
- const iframeScale = getScale(currentIFrame);
744
- const iframeRect = currentIFrame.getBoundingClientRect();
745
- const css = getComputedStyle$1(currentIFrame);
746
- const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;
747
- const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;
748
- x *= iframeScale.x;
749
- y *= iframeScale.y;
750
- width *= iframeScale.x;
751
- height *= iframeScale.y;
752
- x += left;
753
- y += top;
754
- currentWin = getWindow(currentIFrame);
755
- currentIFrame = getFrameElement(currentWin);
756
- }
757
- }
758
- return rectToClientRect({
759
- width,
760
- height,
761
- x,
762
- y
763
- });
764
- }
765
- function getWindowScrollBarX(element, rect) {
766
- const leftScroll = getNodeScroll(element).scrollLeft;
767
- if (!rect) return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;
768
- return rect.left + leftScroll;
769
- }
770
- function getHTMLOffset(documentElement, scroll) {
771
- const htmlRect = documentElement.getBoundingClientRect();
772
- return {
773
- x: htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect),
774
- y: htmlRect.top + scroll.scrollTop
775
- };
776
- }
777
- function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {
778
- let { elements, rect, offsetParent, strategy } = _ref;
779
- const isFixed = strategy === "fixed";
780
- const documentElement = getDocumentElement(offsetParent);
781
- const topLayer = elements ? isTopLayer(elements.floating) : false;
782
- if (offsetParent === documentElement || topLayer && isFixed) return rect;
783
- let scroll = {
784
- scrollLeft: 0,
785
- scrollTop: 0
786
- };
787
- let scale = createCoords(1);
788
- const offsets = createCoords(0);
789
- const isOffsetParentAnElement = isHTMLElement(offsetParent);
790
- if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
791
- if (getNodeName(offsetParent) !== "body" || isOverflowElement(documentElement)) scroll = getNodeScroll(offsetParent);
792
- if (isOffsetParentAnElement) {
793
- const offsetRect = getBoundingClientRect(offsetParent);
794
- scale = getScale(offsetParent);
795
- offsets.x = offsetRect.x + offsetParent.clientLeft;
796
- offsets.y = offsetRect.y + offsetParent.clientTop;
797
- }
798
- }
799
- const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);
800
- return {
801
- width: rect.width * scale.x,
802
- height: rect.height * scale.y,
803
- x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,
804
- y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y
805
- };
806
- }
807
- function getClientRects(element) {
808
- return Array.from(element.getClientRects());
809
- }
810
- function getDocumentRect(element) {
811
- const html = getDocumentElement(element);
812
- const scroll = getNodeScroll(element);
813
- const body = element.ownerDocument.body;
814
- const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);
815
- const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);
816
- let x = -scroll.scrollLeft + getWindowScrollBarX(element);
817
- const y = -scroll.scrollTop;
818
- if (getComputedStyle$1(body).direction === "rtl") x += max(html.clientWidth, body.clientWidth) - width;
819
- return {
820
- width,
821
- height,
822
- x,
823
- y
824
- };
825
- }
826
- var SCROLLBAR_MAX = 25;
827
- function getViewportRect(element, strategy) {
828
- const win = getWindow(element);
829
- const html = getDocumentElement(element);
830
- const visualViewport = win.visualViewport;
831
- let width = html.clientWidth;
832
- let height = html.clientHeight;
833
- let x = 0;
834
- let y = 0;
835
- if (visualViewport) {
836
- width = visualViewport.width;
837
- height = visualViewport.height;
838
- const visualViewportBased = isWebKit();
839
- if (!visualViewportBased || visualViewportBased && strategy === "fixed") {
840
- x = visualViewport.offsetLeft;
841
- y = visualViewport.offsetTop;
842
- }
843
- }
844
- const windowScrollbarX = getWindowScrollBarX(html);
845
- if (windowScrollbarX <= 0) {
846
- const doc = html.ownerDocument;
847
- const body = doc.body;
848
- const bodyStyles = getComputedStyle(body);
849
- const bodyMarginInline = doc.compatMode === "CSS1Compat" ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0;
850
- const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline);
851
- if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) width -= clippingStableScrollbarWidth;
852
- } else if (windowScrollbarX <= SCROLLBAR_MAX) width += windowScrollbarX;
853
- return {
854
- width,
855
- height,
856
- x,
857
- y
858
- };
859
- }
860
- function getInnerBoundingClientRect(element, strategy) {
861
- const clientRect = getBoundingClientRect(element, true, strategy === "fixed");
862
- const top = clientRect.top + element.clientTop;
863
- const left = clientRect.left + element.clientLeft;
864
- const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);
865
- return {
866
- width: element.clientWidth * scale.x,
867
- height: element.clientHeight * scale.y,
868
- x: left * scale.x,
869
- y: top * scale.y
870
- };
871
- }
872
- function getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {
873
- let rect;
874
- if (clippingAncestor === "viewport") rect = getViewportRect(element, strategy);
875
- else if (clippingAncestor === "document") rect = getDocumentRect(getDocumentElement(element));
876
- else if (isElement(clippingAncestor)) rect = getInnerBoundingClientRect(clippingAncestor, strategy);
877
- else {
878
- const visualOffsets = getVisualOffsets(element);
879
- rect = {
880
- x: clippingAncestor.x - visualOffsets.x,
881
- y: clippingAncestor.y - visualOffsets.y,
882
- width: clippingAncestor.width,
883
- height: clippingAncestor.height
884
- };
885
- }
886
- return rectToClientRect(rect);
887
- }
888
- function hasFixedPositionAncestor(element, stopNode) {
889
- const parentNode = getParentNode(element);
890
- if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) return false;
891
- return getComputedStyle$1(parentNode).position === "fixed" || hasFixedPositionAncestor(parentNode, stopNode);
892
- }
893
- function getClippingElementAncestors(element, cache) {
894
- const cachedResult = cache.get(element);
895
- if (cachedResult) return cachedResult;
896
- let result = getOverflowAncestors(element, [], false).filter((el) => isElement(el) && getNodeName(el) !== "body");
897
- let currentContainingBlockComputedStyle = null;
898
- const elementIsFixed = getComputedStyle$1(element).position === "fixed";
899
- let currentNode = elementIsFixed ? getParentNode(element) : element;
900
- while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {
901
- const computedStyle = getComputedStyle$1(currentNode);
902
- const currentNodeIsContaining = isContainingBlock(currentNode);
903
- if (!currentNodeIsContaining && computedStyle.position === "fixed") currentContainingBlockComputedStyle = null;
904
- if (elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === "static" && !!currentContainingBlockComputedStyle && (currentContainingBlockComputedStyle.position === "absolute" || currentContainingBlockComputedStyle.position === "fixed") || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode)) result = result.filter((ancestor) => ancestor !== currentNode);
905
- else currentContainingBlockComputedStyle = computedStyle;
906
- currentNode = getParentNode(currentNode);
907
- }
908
- cache.set(element, result);
909
- return result;
910
- }
911
- function getClippingRect(_ref) {
912
- let { element, boundary, rootBoundary, strategy } = _ref;
913
- const clippingAncestors = [...boundary === "clippingAncestors" ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary), rootBoundary];
914
- const firstRect = getClientRectFromClippingAncestor(element, clippingAncestors[0], strategy);
915
- let top = firstRect.top;
916
- let right = firstRect.right;
917
- let bottom = firstRect.bottom;
918
- let left = firstRect.left;
919
- for (let i = 1; i < clippingAncestors.length; i++) {
920
- const rect = getClientRectFromClippingAncestor(element, clippingAncestors[i], strategy);
921
- top = max(rect.top, top);
922
- right = min(rect.right, right);
923
- bottom = min(rect.bottom, bottom);
924
- left = max(rect.left, left);
925
- }
926
- return {
927
- width: right - left,
928
- height: bottom - top,
929
- x: left,
930
- y: top
931
- };
932
- }
933
- function getDimensions(element) {
934
- const { width, height } = getCssDimensions(element);
935
- return {
936
- width,
937
- height
938
- };
939
- }
940
- function getRectRelativeToOffsetParent(element, offsetParent, strategy) {
941
- const isOffsetParentAnElement = isHTMLElement(offsetParent);
942
- const documentElement = getDocumentElement(offsetParent);
943
- const isFixed = strategy === "fixed";
944
- const rect = getBoundingClientRect(element, true, isFixed, offsetParent);
945
- let scroll = {
946
- scrollLeft: 0,
947
- scrollTop: 0
948
- };
949
- const offsets = createCoords(0);
950
- function setLeftRTLScrollbarOffset() {
951
- offsets.x = getWindowScrollBarX(documentElement);
952
- }
953
- if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
954
- if (getNodeName(offsetParent) !== "body" || isOverflowElement(documentElement)) scroll = getNodeScroll(offsetParent);
955
- if (isOffsetParentAnElement) {
956
- const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);
957
- offsets.x = offsetRect.x + offsetParent.clientLeft;
958
- offsets.y = offsetRect.y + offsetParent.clientTop;
959
- } else if (documentElement) setLeftRTLScrollbarOffset();
960
- }
961
- if (isFixed && !isOffsetParentAnElement && documentElement) setLeftRTLScrollbarOffset();
962
- const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);
963
- return {
964
- x: rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x,
965
- y: rect.top + scroll.scrollTop - offsets.y - htmlOffset.y,
966
- width: rect.width,
967
- height: rect.height
968
- };
969
- }
970
- function isStaticPositioned(element) {
971
- return getComputedStyle$1(element).position === "static";
972
- }
973
- function getTrueOffsetParent(element, polyfill) {
974
- if (!isHTMLElement(element) || getComputedStyle$1(element).position === "fixed") return null;
975
- if (polyfill) return polyfill(element);
976
- let rawOffsetParent = element.offsetParent;
977
- if (getDocumentElement(element) === rawOffsetParent) rawOffsetParent = rawOffsetParent.ownerDocument.body;
978
- return rawOffsetParent;
979
- }
980
- function getOffsetParent(element, polyfill) {
981
- const win = getWindow(element);
982
- if (isTopLayer(element)) return win;
983
- if (!isHTMLElement(element)) {
984
- let svgOffsetParent = getParentNode(element);
985
- while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {
986
- if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) return svgOffsetParent;
987
- svgOffsetParent = getParentNode(svgOffsetParent);
988
- }
989
- return win;
990
- }
991
- let offsetParent = getTrueOffsetParent(element, polyfill);
992
- while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) offsetParent = getTrueOffsetParent(offsetParent, polyfill);
993
- if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) return win;
994
- return offsetParent || getContainingBlock(element) || win;
995
- }
996
- var getElementRects = async function(data) {
997
- const getOffsetParentFn = this.getOffsetParent || getOffsetParent;
998
- const getDimensionsFn = this.getDimensions;
999
- const floatingDimensions = await getDimensionsFn(data.floating);
1000
- return {
1001
- reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),
1002
- floating: {
1003
- x: 0,
1004
- y: 0,
1005
- width: floatingDimensions.width,
1006
- height: floatingDimensions.height
1007
- }
1008
- };
1009
- };
1010
- function isRTL(element) {
1011
- return getComputedStyle$1(element).direction === "rtl";
1012
- }
1013
- var platform = {
1014
- convertOffsetParentRelativeRectToViewportRelativeRect,
1015
- getDocumentElement,
1016
- getClippingRect,
1017
- getOffsetParent,
1018
- getElementRects,
1019
- getClientRects,
1020
- getDimensions,
1021
- getScale,
1022
- isElement,
1023
- isRTL
1024
- };
1025
- /**
1026
- * Modifies the placement by translating the floating element along the
1027
- * specified axes.
1028
- * A number (shorthand for `mainAxis` or distance), or an axes configuration
1029
- * object may be passed.
1030
- * @see https://floating-ui.com/docs/offset
1031
- */
1032
- var offset = offset$1;
1033
- /**
1034
- * Optimizes the visibility of the floating element by shifting it in order to
1035
- * keep it in view when it will overflow the clipping boundary.
1036
- * @see https://floating-ui.com/docs/shift
1037
- */
1038
- var shift = shift$1;
1039
- /**
1040
- * Optimizes the visibility of the floating element by flipping the `placement`
1041
- * in order to keep it in view when the preferred placement(s) will overflow the
1042
- * clipping boundary. Alternative to `autoPlacement`.
1043
- * @see https://floating-ui.com/docs/flip
1044
- */
1045
- var flip = flip$1;
1046
- /**
1047
- * Computes the `x` and `y` coordinates that will place the floating element
1048
- * next to a given reference element.
1049
- */
1050
- var computePosition = (reference, floating, options) => {
1051
- const cache = /* @__PURE__ */ new Map();
1052
- const mergedOptions = {
1053
- platform,
1054
- ...options
1055
- };
1056
- const platformWithCache = {
1057
- ...mergedOptions.platform,
1058
- _c: cache
1059
- };
1060
- return computePosition$1(reference, floating, {
1061
- ...mergedOptions,
1062
- platform: platformWithCache
1063
- });
1064
- };
1065
- //#endregion
1066
82
  //#region src/components/Tooltip.vue?vue&type=script&setup=true&lang.ts
1067
83
  var _hoisted_1$21 = ["aria-describedby"];
1068
84
  var _hoisted_2$20 = { class: "mint-tooltip__body" };
1069
- var _hoisted_3$18 = {
85
+ var _hoisted_3$19 = {
1070
86
  key: 0,
1071
87
  class: "mint-tooltip__shortcut"
1072
88
  };
@@ -1161,7 +177,7 @@ var Tooltip_default = /* @__PURE__ */ defineComponent({
1161
177
  maxWidth: resolvedMaxWidth(__props.maxWidth)
1162
178
  }),
1163
179
  role: "tooltip"
1164
- }, [createElementVNode("span", _hoisted_2$20, toDisplayString(__props.text), 1), __props.shortcut ? (openBlock(), createElementBlock("kbd", _hoisted_3$18, toDisplayString(__props.shortcut), 1)) : createCommentVNode("", true)], 6)) : createCommentVNode("", true)]))], 40, _hoisted_1$21);
180
+ }, [createElementVNode("span", _hoisted_2$20, toDisplayString(__props.text), 1), __props.shortcut ? (openBlock(), createElementBlock("kbd", _hoisted_3$19, toDisplayString(__props.shortcut), 1)) : createCommentVNode("", true)], 6)) : createCommentVNode("", true)]))], 40, _hoisted_1$21);
1165
181
  };
1166
182
  }
1167
183
  });
@@ -1178,7 +194,7 @@ var _hoisted_1$20 = {
1178
194
  "stroke-linejoin": "round"
1179
195
  };
1180
196
  var _hoisted_2$19 = ["d"];
1181
- var _hoisted_3$17 = ["d"];
197
+ var _hoisted_3$18 = ["d"];
1182
198
  var _hoisted_4$15 = {
1183
199
  key: 1,
1184
200
  class: "mint-checkbox__row-text-icon"
@@ -1250,7 +266,7 @@ var BaseCheckbox_default = /* @__PURE__ */ defineComponent({
1250
266
  }), 128)) : (openBlock(), createElementBlock("path", {
1251
267
  key: 1,
1252
268
  d: props.icon
1253
- }, null, 8, _hoisted_3$17))])) : (openBlock(), createElementBlock("span", _hoisted_4$15, toDisplayString(props.icon), 1))], 4)) : createCommentVNode("", true),
269
+ }, null, 8, _hoisted_3$18))])) : (openBlock(), createElementBlock("span", _hoisted_4$15, toDisplayString(props.icon), 1))], 4)) : createCommentVNode("", true),
1254
270
  props.variant === "row" && props.label ? (openBlock(), createElementBlock("span", _hoisted_5$13, [props.description ? (openBlock(), createBlock(Tooltip_default, {
1255
271
  key: 0,
1256
272
  text: props.description,
@@ -1312,7 +328,7 @@ var _hoisted_1$19 = {
1312
328
  "stroke-linejoin": "round"
1313
329
  };
1314
330
  var _hoisted_2$18 = ["d"];
1315
- var _hoisted_3$16 = ["d"];
331
+ var _hoisted_3$17 = ["d"];
1316
332
  var _hoisted_4$14 = {
1317
333
  key: 1,
1318
334
  class: "mint-toggle__row-text-icon"
@@ -1397,7 +413,7 @@ var BaseToggle_default = /* @__PURE__ */ defineComponent({
1397
413
  }), 128)) : (openBlock(), createElementBlock("path", {
1398
414
  key: 1,
1399
415
  d: __props.icon
1400
- }, null, 8, _hoisted_3$16))])) : (openBlock(), createElementBlock("span", _hoisted_4$14, toDisplayString(__props.icon), 1))], 4)) : createCommentVNode("", true),
416
+ }, null, 8, _hoisted_3$17))])) : (openBlock(), createElementBlock("span", _hoisted_4$14, toDisplayString(__props.icon), 1))], 4)) : createCommentVNode("", true),
1401
417
  __props.variant === "row" && __props.label ? (openBlock(), createElementBlock("span", _hoisted_5$12, [__props.description ? (openBlock(), createBlock(Tooltip_default, {
1402
418
  key: 0,
1403
419
  text: __props.description,
@@ -1449,7 +465,7 @@ var _hoisted_1$18 = [
1449
465
  "onChange"
1450
466
  ];
1451
467
  var _hoisted_2$17 = { class: "mint-radio-option__content" };
1452
- var _hoisted_3$15 = ["id"];
468
+ var _hoisted_3$16 = ["id"];
1453
469
  var _hoisted_4$13 = [
1454
470
  "name",
1455
471
  "value",
@@ -1522,7 +538,7 @@ var BaseRadioGroup_default = /* @__PURE__ */ defineComponent({
1522
538
  key: 0,
1523
539
  id: `${props.name}-${option.value}-desc`,
1524
540
  class: normalizeClass(["mint-radio-option__description", `mint-radio-option__description--${props.size}`])
1525
- }, toDisplayString(option.description), 11, _hoisted_3$15)) : createCommentVNode("", true)])], 64)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
541
+ }, toDisplayString(option.description), 11, _hoisted_3$16)) : createCommentVNode("", true)])], 64)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
1526
542
  createElementVNode("input", {
1527
543
  type: "radio",
1528
544
  name: props.name,
@@ -1565,7 +581,7 @@ var _hoisted_2$16 = [
1565
581
  "aria-valuemax",
1566
582
  "aria-valuenow"
1567
583
  ];
1568
- var _hoisted_3$14 = {
584
+ var _hoisted_3$15 = {
1569
585
  key: 0,
1570
586
  class: "mint-slider__value"
1571
587
  };
@@ -1665,7 +681,7 @@ var BaseSlider_default = /* @__PURE__ */ defineComponent({
1665
681
  left: thumbPosition.value
1666
682
  })
1667
683
  }, null, 6)
1668
- ]), __props.showValue ? (openBlock(), createElementBlock("span", _hoisted_3$14, toDisplayString(currentValue.value), 1)) : createCommentVNode("", true)], 2);
684
+ ]), __props.showValue ? (openBlock(), createElementBlock("span", _hoisted_3$15, toDisplayString(currentValue.value), 1)) : createCommentVNode("", true)], 2);
1669
685
  };
1670
686
  }
1671
687
  });
@@ -1799,7 +815,7 @@ var _hoisted_2$15 = {
1799
815
  class: "mint-multi-select__options",
1800
816
  role: "group"
1801
817
  };
1802
- var _hoisted_3$13 = [
818
+ var _hoisted_3$14 = [
1803
819
  "aria-checked",
1804
820
  "disabled",
1805
821
  "onClick",
@@ -1888,7 +904,7 @@ var MultiSelect_default = /* @__PURE__ */ defineComponent({
1888
904
  ]),
1889
905
  onClick: ($event) => toggleOption(option),
1890
906
  onKeydown: ($event) => handleKeydown($event, option)
1891
- }, [createElementVNode("span", _hoisted_4$12, toDisplayString(option.label), 1), isSelected(option.value) ? (openBlock(), createElementBlock("svg", _hoisted_5$10, [..._cache[0] || (_cache[0] = [createElementVNode("path", { d: "M20 6 9 17l-5-5" }, null, -1)])])) : createCommentVNode("", true)], 42, _hoisted_3$13);
907
+ }, [createElementVNode("span", _hoisted_4$12, toDisplayString(option.label), 1), isSelected(option.value) ? (openBlock(), createElementBlock("svg", _hoisted_5$10, [..._cache[0] || (_cache[0] = [createElementVNode("path", { d: "M20 6 9 17l-5-5" }, null, -1)])])) : createCommentVNode("", true)], 42, _hoisted_3$14);
1892
908
  }), 128))]),
1893
909
  __props.modelValue.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_6$10, toDisplayString(selectedLabels.value.join(", ")), 1)) : createCommentVNode("", true)
1894
910
  ], 2);
@@ -2003,12 +1019,12 @@ function startOfDay(date) {
2003
1019
  //#region src/components/internal/CalendarGridPanelInternal.vue?vue&type=script&setup=true&lang.ts
2004
1020
  var _hoisted_1$15 = { class: "mint-calendar-grid-panel" };
2005
1021
  var _hoisted_2$14 = { class: "mint-date-picker__header" };
2006
- var _hoisted_3$12 = ["aria-label"];
1022
+ var _hoisted_3$13 = ["aria-label"];
2007
1023
  var _hoisted_4$11 = { class: "mint-date-picker__month-year" };
2008
1024
  var _hoisted_5$9 = ["aria-label"];
2009
1025
  var _hoisted_6$9 = { class: "mint-date-picker__weekdays" };
2010
1026
  var _hoisted_7$9 = { class: "mint-date-picker__grid" };
2011
- var _hoisted_8$7 = [
1027
+ var _hoisted_8$6 = [
2012
1028
  "disabled",
2013
1029
  "aria-label",
2014
1030
  "aria-selected",
@@ -2067,7 +1083,7 @@ var CalendarGridPanelInternal_default = /* @__PURE__ */ defineComponent({
2067
1083
  "stroke-linecap": "round",
2068
1084
  "stroke-linejoin": "round",
2069
1085
  "aria-hidden": "true"
2070
- }, [createElementVNode("path", { d: "m15 18-6-6 6-6" })], -1)])], 8, _hoisted_3$12),
1086
+ }, [createElementVNode("path", { d: "m15 18-6-6 6-6" })], -1)])], 8, _hoisted_3$13),
2071
1087
  createElementVNode("span", _hoisted_4$11, toDisplayString(__props.monthYear), 1),
2072
1088
  createElementVNode("button", {
2073
1089
  type: "button",
@@ -2105,7 +1121,7 @@ var CalendarGridPanelInternal_default = /* @__PURE__ */ defineComponent({
2105
1121
  isToday(day.date) && !isSameDay(day.date, __props.selectedDate) ? "mint-date-picker__day--today" : ""
2106
1122
  ]),
2107
1123
  onClick: ($event) => emit("select", day)
2108
- }, toDisplayString(day.date.getDate()), 11, _hoisted_8$7);
1124
+ }, toDisplayString(day.date.getDate()), 11, _hoisted_8$6);
2109
1125
  }), 128))])
2110
1126
  ]);
2111
1127
  };
@@ -2113,12 +1129,14 @@ var CalendarGridPanelInternal_default = /* @__PURE__ */ defineComponent({
2113
1129
  });
2114
1130
  //#endregion
2115
1131
  //#region src/components/DatePicker.vue?vue&type=script&setup=true&lang.ts
2116
- var _hoisted_1$14 = [
1132
+ var _hoisted_1$14 = { class: "mint-date-picker__input-wrapper" };
1133
+ var _hoisted_2$13 = [
1134
+ "aria-expanded",
2117
1135
  "value",
2118
1136
  "placeholder",
2119
1137
  "disabled"
2120
1138
  ];
2121
- var _hoisted_2$13 = { class: "mint-date-picker__footer" };
1139
+ var _hoisted_3$12 = { class: "mint-date-picker__footer" };
2122
1140
  //#endregion
2123
1141
  //#region src/components/DatePicker.vue
2124
1142
  var DatePicker_default = /* @__PURE__ */ defineComponent({
@@ -2147,10 +1165,13 @@ var DatePicker_default = /* @__PURE__ */ defineComponent({
2147
1165
  /** Input that opens a calendar dropdown for selecting a single date, with clearable support. */
2148
1166
  const props = __props;
2149
1167
  const emit = __emit;
2150
- const inputRef = ref(null);
2151
1168
  const dropdownRef = ref(null);
2152
1169
  const dropdownStyle = ref({});
2153
- const { isOpen, rootRef: containerRef, close, toggle } = useDropdownState({ insideRefs: [dropdownRef] });
1170
+ const { isOpen, rootRef: containerRef, triggerRef, open, close, toggle } = useDropdownState({ insideRefs: [dropdownRef] });
1171
+ useFocusTrap({
1172
+ containerRef: dropdownRef,
1173
+ active: isOpen
1174
+ });
2154
1175
  const { weekDays, monthYear, calendarDays, isDateDisabled, formatDateValue, setCurrentMonthFromDate, prevMonth, nextMonth } = useCalendarGrid({
2155
1176
  min: () => props.min,
2156
1177
  max: () => props.max
@@ -2189,40 +1210,76 @@ var DatePicker_default = /* @__PURE__ */ defineComponent({
2189
1210
  if (props.disabled) return;
2190
1211
  toggle();
2191
1212
  }
2192
- function updateDropdownPosition() {
2193
- if (!inputRef.value) return;
2194
- const rect = inputRef.value.getBoundingClientRect();
1213
+ function handleTriggerKeydown(event) {
1214
+ if (props.disabled || isOpen.value) return;
1215
+ if (event.key === "Enter" || event.key === " " || event.key === "ArrowDown") {
1216
+ event.preventDefault();
1217
+ open();
1218
+ }
1219
+ }
1220
+ let stopAutoUpdate = null;
1221
+ async function updateDropdownPosition() {
1222
+ const trigger = triggerRef.value;
1223
+ const panel = dropdownRef.value;
1224
+ if (!trigger || !panel) return;
1225
+ const { x, y } = await computePosition(trigger, panel, {
1226
+ placement: "bottom-start",
1227
+ strategy: "fixed",
1228
+ middleware: [
1229
+ offset(4),
1230
+ flip(),
1231
+ shift({ padding: 8 })
1232
+ ]
1233
+ });
2195
1234
  dropdownStyle.value = {
2196
1235
  position: "fixed",
2197
- top: `${rect.bottom + 4}px`,
2198
- left: `${rect.left}px`,
2199
- width: `${Math.max(rect.width, 288)}px`,
1236
+ top: `${y}px`,
1237
+ left: `${x}px`,
1238
+ width: `${Math.max(trigger.getBoundingClientRect().width, 288)}px`,
2200
1239
  zIndex: "9999"
2201
1240
  };
2202
1241
  }
2203
- function handleScrollOrResize() {
2204
- close();
2205
- }
2206
- watch(isOpen, (open) => {
2207
- if (open) {
2208
- updateDropdownPosition();
2209
- if (selectedDate.value) setCurrentMonthFromDate(selectedDate.value);
1242
+ function stopPositioning() {
1243
+ stopAutoUpdate?.();
1244
+ stopAutoUpdate = null;
1245
+ }
1246
+ function startPositioning() {
1247
+ const trigger = triggerRef.value;
1248
+ const panel = dropdownRef.value;
1249
+ if (!trigger || !panel) return;
1250
+ stopPositioning();
1251
+ stopAutoUpdate = autoUpdate(trigger, panel, () => void updateDropdownPosition());
1252
+ }
1253
+ /** Moves focus into the calendar grid: selected day, else today, else the first day. */
1254
+ function focusCalendar() {
1255
+ const panel = dropdownRef.value;
1256
+ if (!panel) return;
1257
+ (panel.querySelector(".mint-date-picker__day--selected") ?? panel.querySelector(".mint-date-picker__day--today") ?? panel.querySelector(".mint-date-picker__day:not([disabled])"))?.focus();
1258
+ }
1259
+ watch(isOpen, async (opened) => {
1260
+ if (!opened) {
1261
+ stopPositioning();
1262
+ return;
2210
1263
  }
1264
+ if (selectedDate.value) setCurrentMonthFromDate(selectedDate.value);
1265
+ await nextTick();
1266
+ startPositioning();
1267
+ await nextTick();
1268
+ focusCalendar();
2211
1269
  });
2212
- useEventListener(() => window, "scroll", handleScrollOrResize, true);
2213
- useEventListener(() => window, "resize", handleScrollOrResize);
1270
+ onBeforeUnmount(stopPositioning);
2214
1271
  return (_ctx, _cache) => {
2215
1272
  return openBlock(), createElementBlock("div", {
2216
1273
  ref_key: "containerRef",
2217
1274
  ref: containerRef,
2218
1275
  class: "mint-date-picker"
2219
- }, [createElementVNode("div", {
2220
- ref_key: "inputRef",
2221
- ref: inputRef,
2222
- class: "mint-date-picker__input-wrapper"
2223
- }, [createElementVNode("input", {
1276
+ }, [createElementVNode("div", _hoisted_1$14, [createElementVNode("input", {
1277
+ ref_key: "triggerRef",
1278
+ ref: triggerRef,
2224
1279
  type: "text",
2225
1280
  readonly: "",
1281
+ "aria-haspopup": "dialog",
1282
+ "aria-expanded": unref(isOpen),
2226
1283
  value: displayValue.value,
2227
1284
  placeholder: __props.placeholder || "Select date",
2228
1285
  disabled: __props.disabled,
@@ -2232,8 +1289,9 @@ var DatePicker_default = /* @__PURE__ */ defineComponent({
2232
1289
  __props.error ? "mint-date-picker__input--error" : "",
2233
1290
  __props.disabled ? "mint-date-picker__input--disabled" : ""
2234
1291
  ]),
2235
- onClick: toggleCalendar
2236
- }, null, 10, _hoisted_1$14), _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))], 512), (openBlock(), createBlock(Teleport, { to: "body" }, [createVNode(Transition, {
1292
+ onClick: toggleCalendar,
1293
+ onKeydown: handleTriggerKeydown
1294
+ }, null, 42, _hoisted_2$13), _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, {
2237
1295
  "enter-active-class": "mint-date-picker__dropdown-enter-active",
2238
1296
  "enter-from-class": "mint-date-picker__dropdown-enter-from",
2239
1297
  "enter-to-class": "mint-date-picker__dropdown-enter-to",
@@ -2248,7 +1306,6 @@ var DatePicker_default = /* @__PURE__ */ defineComponent({
2248
1306
  class: "mint-date-picker__dropdown",
2249
1307
  style: normalizeStyle(dropdownStyle.value),
2250
1308
  role: "dialog",
2251
- "aria-modal": "true",
2252
1309
  "aria-label": "Date picker"
2253
1310
  }, [createVNode(CalendarGridPanelInternal_default, {
2254
1311
  "week-days": unref(weekDays),
@@ -2265,7 +1322,7 @@ var DatePicker_default = /* @__PURE__ */ defineComponent({
2265
1322
  "selected-date",
2266
1323
  "onPreviousMonth",
2267
1324
  "onNextMonth"
2268
- ]), createElementVNode("div", _hoisted_2$13, [createElementVNode("button", {
1325
+ ]), createElementVNode("div", _hoisted_3$12, [createElementVNode("button", {
2269
1326
  type: "button",
2270
1327
  class: "mint-date-picker__footer-btn mint-date-picker__today-btn",
2271
1328
  onClick: goToToday
@@ -2416,13 +1473,16 @@ var _hoisted_2$12 = [
2416
1473
  "value",
2417
1474
  "placeholder",
2418
1475
  "disabled",
2419
- "aria-expanded"
1476
+ "aria-expanded",
1477
+ "aria-controls",
1478
+ "aria-activedescendant"
2420
1479
  ];
2421
1480
  var _hoisted_3$11 = {
2422
1481
  key: 0,
2423
1482
  class: "mint-time-picker__dropdown"
2424
1483
  };
2425
1484
  var _hoisted_4$10 = [
1485
+ "id",
2426
1486
  "aria-selected",
2427
1487
  "aria-disabled",
2428
1488
  "onClick"
@@ -2459,7 +1519,10 @@ var TimePicker_default = /* @__PURE__ */ defineComponent({
2459
1519
  const emit = __emit;
2460
1520
  const listRef = ref(null);
2461
1521
  const highlightedIndex = ref(-1);
2462
- const { isOpen, rootRef, open, close, toggle } = useDropdownState();
1522
+ const listboxId = `mint-time-picker-listbox-${useId().replace(/:/g, "")}`;
1523
+ const { isOpen, rootRef, triggerRef, open, close, toggle } = useDropdownState();
1524
+ /** Id of the highlighted slot, published to the input as `aria-activedescendant`. */
1525
+ const activeSlotId = computed(() => isOpen.value && highlightedIndex.value >= 0 ? `${listboxId}-option-${highlightedIndex.value}` : void 0);
2463
1526
  const slots = computed(() => {
2464
1527
  return generateTimeSlots(props.min ?? "00:00", props.max ?? "23:59", props.step);
2465
1528
  });
@@ -2536,9 +1599,26 @@ var TimePicker_default = /* @__PURE__ */ defineComponent({
2536
1599
  event.preventDefault();
2537
1600
  if (highlightedIndex.value >= 0 && highlightedIndex.value < slots.value.length) selectSlot(slots.value[highlightedIndex.value]);
2538
1601
  break;
1602
+ case "Home": {
1603
+ event.preventDefault();
1604
+ const first = slots.value.findIndex((slot) => !isSlotDisabled(slot));
1605
+ if (first >= 0) {
1606
+ highlightedIndex.value = first;
1607
+ scrollToHighlighted();
1608
+ }
1609
+ break;
1610
+ }
1611
+ case "End":
1612
+ event.preventDefault();
1613
+ for (let index = slots.value.length - 1; index >= 0; index--) if (!isSlotDisabled(slots.value[index])) {
1614
+ highlightedIndex.value = index;
1615
+ scrollToHighlighted();
1616
+ break;
1617
+ }
1618
+ break;
2539
1619
  case "Escape":
2540
1620
  event.preventDefault();
2541
- close();
1621
+ close(true);
2542
1622
  break;
2543
1623
  }
2544
1624
  }
@@ -2566,6 +1646,8 @@ var TimePicker_default = /* @__PURE__ */ defineComponent({
2566
1646
  onKeydown: handleKeydown
2567
1647
  }, [createElementVNode("div", _hoisted_1$13, [
2568
1648
  createElementVNode("input", {
1649
+ ref_key: "triggerRef",
1650
+ ref: triggerRef,
2569
1651
  type: "text",
2570
1652
  readonly: "",
2571
1653
  value: displayValue.value,
@@ -2580,6 +1662,8 @@ var TimePicker_default = /* @__PURE__ */ defineComponent({
2580
1662
  role: "combobox",
2581
1663
  "aria-haspopup": "listbox",
2582
1664
  "aria-expanded": unref(isOpen),
1665
+ "aria-controls": unref(isOpen) ? listboxId : void 0,
1666
+ "aria-activedescendant": activeSlotId.value,
2583
1667
  onClick: toggleDropdown
2584
1668
  }, null, 10, _hoisted_2$12),
2585
1669
  __props.clearable && __props.modelValue ? (openBlock(), createElementBlock("button", {
@@ -2617,6 +1701,7 @@ var TimePicker_default = /* @__PURE__ */ defineComponent({
2617
1701
  "leave-to-class": "mint-time-picker__dropdown-leave-to"
2618
1702
  }, {
2619
1703
  default: withCtx(() => [unref(isOpen) ? (openBlock(), createElementBlock("div", _hoisted_3$11, [createElementVNode("ul", {
1704
+ id: listboxId,
2620
1705
  ref_key: "listRef",
2621
1706
  ref: listRef,
2622
1707
  class: "mint-time-picker__list",
@@ -2624,6 +1709,7 @@ var TimePicker_default = /* @__PURE__ */ defineComponent({
2624
1709
  "aria-label": "Available times"
2625
1710
  }, [(openBlock(true), createElementBlock(Fragment, null, renderList(slots.value, (slot, index) => {
2626
1711
  return openBlock(), createElementBlock("li", {
1712
+ id: `${listboxId}-option-${index}`,
2627
1713
  key: slot,
2628
1714
  role: "option",
2629
1715
  "aria-selected": slot === __props.modelValue,
@@ -2691,9 +1777,8 @@ var TagsInput_default = /* @__PURE__ */ defineComponent({
2691
1777
  const props = __props;
2692
1778
  const emit = __emit;
2693
1779
  const inputValue = ref("");
2694
- const inputRef = ref();
2695
1780
  const highlightedIndex = ref(-1);
2696
- const { isOpen: dropdownOpen, rootRef, open: openDropdown, close: closeDropdown } = useDropdownState({ onClose: () => {
1781
+ const { isOpen: dropdownOpen, rootRef, triggerRef: inputRef, open: openDropdown, close: closeDropdown } = useDropdownState({ onClose: () => {
2697
1782
  highlightedIndex.value = -1;
2698
1783
  } });
2699
1784
  const selectionLimit = useSelectionLimit({
@@ -2751,7 +1836,7 @@ var TagsInput_default = /* @__PURE__ */ defineComponent({
2751
1836
  return;
2752
1837
  }
2753
1838
  if (event.key === "Escape") {
2754
- closeDropdown();
1839
+ closeDropdown(true);
2755
1840
  return;
2756
1841
  }
2757
1842
  if (event.key === "Backspace" && !inputValue.value && props.modelValue.length > 0) removeTag(props.modelValue.length - 1);
@@ -3264,7 +2349,7 @@ var _hoisted_6$6 = {
3264
2349
  viewBox: "0 0 24 24"
3265
2350
  };
3266
2351
  var _hoisted_7$6 = { class: "mint-file-uploader__text" };
3267
- var _hoisted_8$6 = {
2352
+ var _hoisted_8$5 = {
3268
2353
  key: 0,
3269
2354
  class: "mint-file-uploader__actions"
3270
2355
  };
@@ -3588,7 +2673,7 @@ var FileUploader_default = /* @__PURE__ */ defineComponent({
3588
2673
  createElementVNode("path", { d: "m16 16-4-4-4 4" }, null, -1),
3589
2674
  createElementVNode("path", { d: "M12 12v9" }, null, -1)
3590
2675
  ])])), createElementVNode("p", _hoisted_7$6, " Drop " + toDisplayString(acceptLabel.value) + " or click ", 1)])], 42, _hoisted_2$8),
3591
- _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_8$6, [renderSlot(_ctx.$slots, "actions")])) : createCommentVNode("", true),
2676
+ _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_8$5, [renderSlot(_ctx.$slots, "actions")])) : createCommentVNode("", true),
3592
2677
  isFolder.value && folderName.value && selectedFiles.value.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_9$3, [createElementVNode("div", _hoisted_10$3, [_cache[2] || (_cache[2] = createElementVNode("div", { class: "mint-file-uploader__folder-icon-wrapper" }, [createElementVNode("svg", {
3593
2678
  class: "mint-file-uploader__folder-icon",
3594
2679
  fill: "none",
@@ -3693,7 +2778,7 @@ var _hoisted_6$5 = {
3693
2778
  class: "mint-alert__title"
3694
2779
  };
3695
2780
  var _hoisted_7$5 = { class: "mint-alert__message" };
3696
- var _hoisted_8$5 = {
2781
+ var _hoisted_8$4 = {
3697
2782
  key: 4,
3698
2783
  class: "mint-alert__actions"
3699
2784
  };
@@ -3748,7 +2833,7 @@ var AlertBox_default = /* @__PURE__ */ defineComponent({
3748
2833
  createElementVNode("path", { d: "M12 8h.01" }, null, -1)
3749
2834
  ])])),
3750
2835
  createElementVNode("div", _hoisted_5$5, [props.title ? (openBlock(), createElementBlock("h4", _hoisted_6$5, toDisplayString(props.title), 1)) : createCommentVNode("", true), createElementVNode("div", _hoisted_7$5, [renderSlot(_ctx.$slots, "default")])]),
3751
- hasActions() ? (openBlock(), createElementBlock("div", _hoisted_8$5, [renderSlot(_ctx.$slots, "actions", {}, () => [createElementVNode("button", {
2836
+ hasActions() ? (openBlock(), createElementBlock("div", _hoisted_8$4, [renderSlot(_ctx.$slots, "actions", {}, () => [createElementVNode("button", {
3752
2837
  type: "button",
3753
2838
  class: normalizeClass(["mint-alert__action-btn", `mint-alert__action-btn--${props.type}`]),
3754
2839
  onClick: _cache[0] || (_cache[0] = ($event) => emit("action"))
@@ -3793,22 +2878,16 @@ function isObjectLike(value) {
3793
2878
  //#region src/components/DateTimePicker.vue?vue&type=script&setup=true&lang.ts
3794
2879
  var _hoisted_1$7 = { class: "mint-datetime-picker__input-wrapper" };
3795
2880
  var _hoisted_2$6 = [
2881
+ "aria-expanded",
3796
2882
  "value",
3797
2883
  "placeholder",
3798
2884
  "disabled"
3799
2885
  ];
3800
- var _hoisted_3$5 = {
3801
- key: 0,
3802
- class: "mint-datetime-picker__dropdown",
3803
- role: "dialog",
3804
- "aria-modal": "true",
3805
- "aria-label": "Date and time picker"
3806
- };
3807
- var _hoisted_4$5 = { class: "mint-datetime-picker__calendar-section" };
3808
- var _hoisted_5$4 = { class: "mint-datetime-picker__time-section" };
3809
- var _hoisted_6$4 = { class: "mint-datetime-picker__time-grid" };
3810
- var _hoisted_7$4 = ["disabled", "onClick"];
3811
- var _hoisted_8$4 = { class: "mint-datetime-picker__footer" };
2886
+ var _hoisted_3$5 = { class: "mint-datetime-picker__calendar-section" };
2887
+ var _hoisted_4$5 = { class: "mint-datetime-picker__time-section" };
2888
+ var _hoisted_5$4 = { class: "mint-datetime-picker__time-grid" };
2889
+ var _hoisted_6$4 = ["disabled", "onClick"];
2890
+ var _hoisted_7$4 = { class: "mint-datetime-picker__footer" };
3812
2891
  //#endregion
3813
2892
  //#region src/components/DateTimePicker.vue
3814
2893
  var DateTimePicker_default = /* @__PURE__ */ defineComponent({
@@ -3840,7 +2919,12 @@ var DateTimePicker_default = /* @__PURE__ */ defineComponent({
3840
2919
  /** Combined date and time picker with a dropdown calendar, time slots, and 12/24 h format support. */
3841
2920
  const props = __props;
3842
2921
  const emit = __emit;
3843
- const { isOpen, rootRef, close, toggle } = useDropdownState();
2922
+ const dropdownRef = ref(null);
2923
+ const { isOpen, rootRef, triggerRef, open, close, toggle } = useDropdownState();
2924
+ useFocusTrap({
2925
+ containerRef: dropdownRef,
2926
+ active: isOpen
2927
+ });
3844
2928
  const { weekDays, monthYear, calendarDays, formatDateValue, setCurrentMonthFromDate, prevMonth, nextMonth } = useCalendarGrid({
3845
2929
  min: () => props.min,
3846
2930
  max: () => props.max,
@@ -3914,15 +2998,30 @@ var DateTimePicker_default = /* @__PURE__ */ defineComponent({
3914
2998
  if (props.disabled) return;
3915
2999
  toggle();
3916
3000
  }
3917
- watch(isOpen, (open) => {
3918
- if (open && selectedDate.value) {
3919
- setCurrentMonthFromDate(selectedDate.value);
3920
- nextTick(() => {
3921
- const grid = rootRef.value?.querySelector(".mint-datetime-picker__time-grid");
3922
- const active = rootRef.value?.querySelector(".mint-datetime-picker__time-chip--active");
3923
- if (grid && active) active.scrollIntoView({ block: "center" });
3924
- });
3001
+ function handleTriggerKeydown(event) {
3002
+ if (props.disabled || isOpen.value) return;
3003
+ if (event.key === "Enter" || event.key === " " || event.key === "ArrowDown") {
3004
+ event.preventDefault();
3005
+ open();
3006
+ }
3007
+ }
3008
+ /** Moves focus into the calendar grid: selected day, else today, else the first day. */
3009
+ function focusCalendar() {
3010
+ const panel = dropdownRef.value;
3011
+ if (!panel) return;
3012
+ (panel.querySelector(".mint-date-picker__day--selected") ?? panel.querySelector(".mint-date-picker__day--today") ?? panel.querySelector(".mint-date-picker__day:not([disabled])"))?.focus();
3013
+ }
3014
+ watch(isOpen, async (opened) => {
3015
+ if (!opened) return;
3016
+ if (selectedDate.value) setCurrentMonthFromDate(selectedDate.value);
3017
+ await nextTick();
3018
+ if (selectedDate.value) {
3019
+ const grid = dropdownRef.value?.querySelector(".mint-datetime-picker__time-grid");
3020
+ const active = dropdownRef.value?.querySelector(".mint-datetime-picker__time-chip--active");
3021
+ if (grid && active) active.scrollIntoView({ block: "center" });
3925
3022
  }
3023
+ await nextTick();
3024
+ focusCalendar();
3926
3025
  });
3927
3026
  return (_ctx, _cache) => {
3928
3027
  return openBlock(), createElementBlock("div", {
@@ -3941,8 +3040,12 @@ var DateTimePicker_default = /* @__PURE__ */ defineComponent({
3941
3040
  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"
3942
3041
  })])], -1)),
3943
3042
  createElementVNode("input", {
3043
+ ref_key: "triggerRef",
3044
+ ref: triggerRef,
3944
3045
  type: "text",
3945
3046
  readonly: "",
3047
+ "aria-haspopup": "dialog",
3048
+ "aria-expanded": unref(isOpen),
3946
3049
  value: displayValue.value,
3947
3050
  placeholder: __props.placeholder,
3948
3051
  disabled: __props.disabled,
@@ -3953,8 +3056,9 @@ var DateTimePicker_default = /* @__PURE__ */ defineComponent({
3953
3056
  __props.disabled ? "mint-datetime-picker__input--disabled" : ""
3954
3057
  ]),
3955
3058
  "aria-label": "Select date and time",
3956
- onClick: toggleDropdown
3957
- }, null, 10, _hoisted_2$6),
3059
+ onClick: toggleDropdown,
3060
+ onKeydown: handleTriggerKeydown
3061
+ }, null, 42, _hoisted_2$6),
3958
3062
  _cache[1] || (_cache[1] = createElementVNode("div", { class: "mint-datetime-picker__icon-clock" }, [createElementVNode("svg", {
3959
3063
  fill: "none",
3960
3064
  stroke: "currentColor",
@@ -3973,8 +3077,15 @@ var DateTimePicker_default = /* @__PURE__ */ defineComponent({
3973
3077
  "leave-from-class": "mint-datetime-picker__dropdown-leave-from",
3974
3078
  "leave-to-class": "mint-datetime-picker__dropdown-leave-to"
3975
3079
  }, {
3976
- default: withCtx(() => [unref(isOpen) ? (openBlock(), createElementBlock("div", _hoisted_3$5, [
3977
- createElementVNode("div", _hoisted_4$5, [createVNode(CalendarGridPanelInternal_default, {
3080
+ default: withCtx(() => [unref(isOpen) ? (openBlock(), createElementBlock("div", {
3081
+ key: 0,
3082
+ ref_key: "dropdownRef",
3083
+ ref: dropdownRef,
3084
+ class: "mint-datetime-picker__dropdown",
3085
+ role: "dialog",
3086
+ "aria-label": "Date and time picker"
3087
+ }, [
3088
+ createElementVNode("div", _hoisted_3$5, [createVNode(CalendarGridPanelInternal_default, {
3978
3089
  "week-days": unref(weekDays),
3979
3090
  "month-year": unref(monthYear),
3980
3091
  days: unref(calendarDays),
@@ -3993,7 +3104,7 @@ var DateTimePicker_default = /* @__PURE__ */ defineComponent({
3993
3104
  "onNextMonth"
3994
3105
  ])]),
3995
3106
  _cache[3] || (_cache[3] = createElementVNode("div", { class: "mint-datetime-picker__divider" }, null, -1)),
3996
- createElementVNode("div", _hoisted_5$4, [_cache[2] || (_cache[2] = createElementVNode("div", { class: "mint-datetime-picker__time-label" }, "Time", -1)), createElementVNode("div", _hoisted_6$4, [(openBlock(true), createElementBlock(Fragment, null, renderList(timeSlots.value, (time) => {
3107
+ createElementVNode("div", _hoisted_4$5, [_cache[2] || (_cache[2] = createElementVNode("div", { class: "mint-datetime-picker__time-label" }, "Time", -1)), createElementVNode("div", _hoisted_5$4, [(openBlock(true), createElementBlock(Fragment, null, renderList(timeSlots.value, (time) => {
3997
3108
  return openBlock(), createElementBlock("button", {
3998
3109
  key: time,
3999
3110
  type: "button",
@@ -4004,9 +3115,9 @@ var DateTimePicker_default = /* @__PURE__ */ defineComponent({
4004
3115
  isTimeDisabled(time) ? "mint-datetime-picker__time-chip--disabled" : ""
4005
3116
  ]),
4006
3117
  onClick: ($event) => selectTime(time)
4007
- }, toDisplayString(unref(formatTimeSlot)(time, __props.timeFormat)), 11, _hoisted_7$4);
3118
+ }, toDisplayString(unref(formatTimeSlot)(time, __props.timeFormat)), 11, _hoisted_6$4);
4008
3119
  }), 128))])]),
4009
- createElementVNode("div", _hoisted_8$4, [createElementVNode("div", null, [createElementVNode("button", {
3120
+ createElementVNode("div", _hoisted_7$4, [createElementVNode("div", null, [createElementVNode("button", {
4010
3121
  type: "button",
4011
3122
  class: "mint-datetime-picker__footer-btn",
4012
3123
  onClick: goToToday
@@ -4020,7 +3131,7 @@ var DateTimePicker_default = /* @__PURE__ */ defineComponent({
4020
3131
  class: "mint-datetime-picker__footer-btn mint-datetime-picker__footer-btn--muted",
4021
3132
  onClick: clear
4022
3133
  }, " Clear ")) : createCommentVNode("", true)])
4023
- ])) : createCommentVNode("", true)]),
3134
+ ], 512)) : createCommentVNode("", true)]),
4024
3135
  _: 1
4025
3136
  })], 512);
4026
3137
  };
@@ -4075,7 +3186,9 @@ function useEventStream(url, options = {}) {
4075
3186
  let controller = null;
4076
3187
  let reader = null;
4077
3188
  let reconnectTimer = null;
4078
- let reconnectDelayMs = options.reconnectDelayMs ?? 2e3;
3189
+ const settings = tryUseSettingsStore();
3190
+ const reconnectEnabled = options.reconnect ?? settings?.wsAutoReconnect ?? true;
3191
+ let reconnectDelayMs = options.reconnectDelayMs ?? settings?.wsReconnectInterval ?? 2e3;
4079
3192
  let stopped = true;
4080
3193
  let generation = 0;
4081
3194
  function clearReconnectTimer() {
@@ -4088,7 +3201,7 @@ function useEventStream(url, options = {}) {
4088
3201
  }
4089
3202
  function scheduleReconnect(connectionGeneration, cause) {
4090
3203
  if (stopped || generation !== connectionGeneration) return;
4091
- if (options.reconnect === false || options.shouldReconnect?.(cause) === false) {
3204
+ if (!reconnectEnabled || options.shouldReconnect?.(cause) === false) {
4092
3205
  stopped = true;
4093
3206
  return;
4094
3207
  }
@@ -4288,11 +3401,6 @@ function jobStatusLabel(status) {
4288
3401
  }
4289
3402
  //#endregion
4290
3403
  //#region src/composables/useGeneratedAnalysis.ts
4291
- var ACTIVE_STATUSES = new Set([
4292
- "awaiting_input",
4293
- "queued",
4294
- "running"
4295
- ]);
4296
3404
  var AUTH_TOKEN_KEY = "mint-auth-token";
4297
3405
  var SESSION_NOT_FOUND_DETAIL = "Session not found";
4298
3406
  var MAX_RESULT_CACHE_ENTRIES = 32;
@@ -4544,12 +3652,12 @@ function createPluginJobs(options, manifestPath) {
4544
3652
  const pending = request("/jobs", { method: "GET" }).then((payload) => {
4545
3653
  if (disposed) return jobs.value;
4546
3654
  if (revision !== jobsRevision) {
4547
- if (jobs.value.some((job) => ACTIVE_STATUSES.has(job.status))) schedulePoll();
3655
+ if (jobs.value.some((job) => isActiveJobStatus(job.status))) schedulePoll();
4548
3656
  return jobs.value;
4549
3657
  }
4550
3658
  replaceJobs(payload.jobs);
4551
3659
  error.value = null;
4552
- if (!paused && !jobStream.isConnected.value && jobs.value.some((job) => ACTIVE_STATUSES.has(job.status))) schedulePoll();
3660
+ if (!paused && !jobStream.isConnected.value && jobs.value.some((job) => isActiveJobStatus(job.status))) schedulePoll();
4553
3661
  return jobs.value;
4554
3662
  }).finally(() => {
4555
3663
  if (refreshPromise === pending) refreshPromise = void 0;
@@ -4583,7 +3691,7 @@ function createPluginJobs(options, manifestPath) {
4583
3691
  if (options.signal?.aborted) return Promise.reject(pluginJobWaitAbort(options.signal));
4584
3692
  const jobId = jobIdFromReference(job);
4585
3693
  const current = typeof job === "string" ? jobs.value.find((candidate) => candidate.job_id === jobId) : jobs.value.find((candidate) => candidate.job_id === jobId) ?? job;
4586
- if (current && !ACTIVE_STATUSES.has(current.status)) return terminalWaitResult(current, options.rejectOnFailure === true);
3694
+ if (current && !isActiveJobStatus(current.status)) return terminalWaitResult(current, options.rejectOnFailure === true);
4587
3695
  if (paused) return Promise.reject(/* @__PURE__ */ new Error("Plugin jobs runtime is paused"));
4588
3696
  return new Promise((resolve, reject) => {
4589
3697
  const waiter = {
@@ -4617,7 +3725,7 @@ function createPluginJobs(options, manifestPath) {
4617
3725
  });
4618
3726
  }
4619
3727
  function settleJobWaiters(job) {
4620
- if (ACTIVE_STATUSES.has(job.status)) return;
3728
+ if (isActiveJobStatus(job.status)) return;
4621
3729
  const waiting = jobWaiters.get(job.job_id);
4622
3730
  if (!waiting) return;
4623
3731
  jobWaiters.delete(job.job_id);
@@ -4844,7 +3952,7 @@ function createPluginJobs(options, manifestPath) {
4844
3952
  await refreshJobs();
4845
3953
  } catch (cause) {
4846
3954
  error.value = errorMessage(cause, "Failed to refresh analysis jobs");
4847
- if (jobs.value.some((job) => ACTIVE_STATUSES.has(job.status))) schedulePoll();
3955
+ if (jobs.value.some((job) => isActiveJobStatus(job.status))) schedulePoll();
4848
3956
  }
4849
3957
  }, pollInterval);
4850
3958
  }
@@ -4854,7 +3962,7 @@ function createPluginJobs(options, manifestPath) {
4854
3962
  pollTimer = void 0;
4855
3963
  }
4856
3964
  function schedulePollForActiveJobs() {
4857
- if (jobs.value.some((job) => ACTIVE_STATUSES.has(job.status))) schedulePoll();
3965
+ if (jobs.value.some((job) => isActiveJobStatus(job.status))) schedulePoll();
4858
3966
  }
4859
3967
  function applyJobStreamMessage(message) {
4860
3968
  if (message.event === "snapshot" && "jobs" in message.data) {
@@ -4909,7 +4017,7 @@ function createPluginJobs(options, manifestPath) {
4909
4017
  if (!initialized) return;
4910
4018
  for (const [jobId, result] of Object.entries(resultCache.value)) scheduleManagedDownloadRefresh(jobId, managedDownloadRefreshDelay(result));
4911
4019
  if (streamEnabled) jobStream.start();
4912
- else if (jobs.value.some((job) => ACTIVE_STATUSES.has(job.status))) schedulePoll();
4020
+ else if (jobs.value.some((job) => isActiveJobStatus(job.status))) schedulePoll();
4913
4021
  }
4914
4022
  function dispose() {
4915
4023
  if (disposed) return;
@@ -8073,6 +7181,6 @@ function useControlSchema(controls, options = {}) {
8073
7181
  };
8074
7182
  }
8075
7183
  //#endregion
8076
- export { resolveJobCapabilities as $, useConcentrationUnits as A, formatTimeSlot as At, currentExperimentFromContext as B, MultiSelect_default as Bt, controlsToViewIds as C, addMinutes as Ct, getTypeDefault as D, findNearestTimeSlotIndex as Dt, getFieldRegistryEntry as E, findAvailableSlots as Et, ATOMIC_WEIGHTS as F, rangesOverlap as Ft, createGeneratedAnalysisTransport as G, BaseToggle_default as Gt, parseExperimentId as H, useSelectionLimit as Ht, useChemicalFormula as I, snapToSlot as It, isActiveJobStatus as J, computePosition as Jt, useGeneratedAnalysis as K, BaseCheckbox_default as Kt, GeneratedPathInput_default as L, toMinutes as Lt, SequenceInput_default as M, generateTimeSlots as Mt, useSequenceUtils as N, isTimeInRange as Nt, ConcentrationInput_default as O, formatDuration as Ot, FormulaInput_default as P, parseTime as Pt, normalizeJobState as Q, BaseTextarea_default as Qt, ArtifactSelectorModal_default as R, useTimeUtils as Rt, controlsToTopBarSettingsConfig as S, TimePicker_default as St, getDefaultControlView as T, durationMinutes as Tt, resolveCurrentExperimentId as U, BaseSlider_default as Ut, getInjectedPlatformContext as V, useListSelection as Vt, resolveCurrentPluginId as W, BaseRadioGroup_default as Wt, jobStatusLabel as X, offset as Xt, isTerminalJobStatus as Y, flip as Yt, normalizeJobPercent as Z, shift as Zt, controlsToFormSchema as _, pluginSecretLabel as _t, defineDoseCalculatorControlProps as a, AlertBox_default as at, controlsToSettingsSchema as b, usesPluginSecretReferences as bt, defineWellPlateDoseComponentBindings as c, SecretInput_default as ct, defineControlModel as d, PLUGIN_SECRET_REF_KEY as dt, useEventStream as et, resolveControlModel as f, clearPluginSecret as ft, mergeControlWorkspaceOptions as g, pluginSecretId as gt, controlValuesToComponentProps as h, keepPluginSecret as ht, useControlSchema as i, _plugin_vue_export_helper_default as it, MoleculeInput_default as j, fromMinutes as jt, UnitInput_default as k, formatTime as kt, defineWellPlateDoseControlProps as l, PLUGIN_SECRET_FORMAT_KEY as lt, controlValuesToComponentBindingsById as m, isPluginSecretRef as mt, defineControls as n, isObjectLike as nt, defineDoseDesignControlModel as o, FileUploader_default as ot, controlValuesToComponentBindings as p, isPluginSecretLocked as pt, usePluginJobs as q, Tooltip_default as qt, getControlDefaults as r, isRecord as rt, defineWellPlateControlProps as s, NumberInput_default as st, defineControlComponentBindings as t, DateTimePicker_default as tt, useControlWorkspace as u, PLUGIN_SECRET_FORMAT_REF as ut, controlsToSectionFormSchema as v, pluginSecretState as vt, controlsToViewItems as w, compareTime as wt, controlsToSidebarPanels as x, TagsInput_default as xt, controlsToSectionFormSchemas as y, setPluginSecret as yt, useAnalysisArtifacts as z, DatePicker_default as zt };
7184
+ export { resolveJobCapabilities as $, useConcentrationUnits as A, formatTimeSlot as At, currentExperimentFromContext as B, MultiSelect_default as Bt, controlsToViewIds as C, addMinutes as Ct, getTypeDefault as D, findNearestTimeSlotIndex as Dt, getFieldRegistryEntry as E, findAvailableSlots as Et, ATOMIC_WEIGHTS as F, rangesOverlap as Ft, createGeneratedAnalysisTransport as G, BaseToggle_default as Gt, parseExperimentId as H, useSelectionLimit as Ht, useChemicalFormula as I, snapToSlot as It, isActiveJobStatus as J, BaseTextarea_default as Jt, useGeneratedAnalysis as K, BaseCheckbox_default as Kt, GeneratedPathInput_default as L, toMinutes as Lt, SequenceInput_default as M, generateTimeSlots as Mt, useSequenceUtils as N, isTimeInRange as Nt, ConcentrationInput_default as O, formatDuration as Ot, FormulaInput_default as P, parseTime as Pt, normalizeJobState as Q, ArtifactSelectorModal_default as R, useTimeUtils as Rt, controlsToTopBarSettingsConfig as S, TimePicker_default as St, getDefaultControlView as T, durationMinutes as Tt, resolveCurrentExperimentId as U, BaseSlider_default as Ut, getInjectedPlatformContext as V, useListSelection as Vt, resolveCurrentPluginId as W, BaseRadioGroup_default as Wt, jobStatusLabel as X, isTerminalJobStatus as Y, normalizeJobPercent as Z, controlsToFormSchema as _, pluginSecretLabel as _t, defineDoseCalculatorControlProps as a, AlertBox_default as at, controlsToSettingsSchema as b, usesPluginSecretReferences as bt, defineWellPlateDoseComponentBindings as c, SecretInput_default as ct, defineControlModel as d, PLUGIN_SECRET_REF_KEY as dt, useEventStream as et, resolveControlModel as f, clearPluginSecret as ft, mergeControlWorkspaceOptions as g, pluginSecretId as gt, controlValuesToComponentProps as h, keepPluginSecret as ht, useControlSchema as i, _plugin_vue_export_helper_default as it, MoleculeInput_default as j, fromMinutes as jt, UnitInput_default as k, formatTime as kt, defineWellPlateDoseControlProps as l, PLUGIN_SECRET_FORMAT_KEY as lt, controlValuesToComponentBindingsById as m, isPluginSecretRef as mt, defineControls as n, isObjectLike as nt, defineDoseDesignControlModel as o, FileUploader_default as ot, controlValuesToComponentBindings as p, isPluginSecretLocked as pt, usePluginJobs as q, Tooltip_default as qt, getControlDefaults as r, isRecord as rt, defineWellPlateControlProps as s, NumberInput_default as st, defineControlComponentBindings as t, DateTimePicker_default as tt, useControlWorkspace as u, PLUGIN_SECRET_FORMAT_REF as ut, controlsToSectionFormSchema as v, pluginSecretState as vt, controlsToViewItems as w, compareTime as wt, controlsToSidebarPanels as x, TagsInput_default as xt, controlsToSectionFormSchemas as y, setPluginSecret as yt, useAnalysisArtifacts as z, DatePicker_default as zt };
8077
7185
 
8078
- //# sourceMappingURL=useControlSchema-_OVhavKq.js.map
7186
+ //# sourceMappingURL=useControlSchema-aMZlb4Sc.js.map