@morscherlab/mint-sdk 1.4.0-beta.9 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/README.md +14 -3
  2. package/dist/{AlertBox-B2Bgr3ei.js → AlertBox-DwgNTEqf.js} +3 -3
  3. package/dist/{AlertBox-B2Bgr3ei.js.map → AlertBox-DwgNTEqf.js.map} +1 -1
  4. package/dist/{AppSidebar-Dq9W1jE2.js → AppSidebar-CZZaxni0.js} +1103 -144
  5. package/dist/AppSidebar-CZZaxni0.js.map +1 -0
  6. package/dist/{ConfirmDialog-nbJj51is.js → ConfirmDialog-CjWoxAD1.js} +2 -2
  7. package/dist/{ConfirmDialog-nbJj51is.js.map → ConfirmDialog-CjWoxAD1.js.map} +1 -1
  8. package/dist/{ExperimentPopover-5T1fAq2L.js → ExperimentPopover-DujiuQIO.js} +5 -5
  9. package/dist/{ExperimentPopover-5T1fAq2L.js.map → ExperimentPopover-DujiuQIO.js.map} +1 -1
  10. package/dist/{ExperimentSelectorModal-65peG4Up.js → ExperimentSelectorModal-B4j4eUOJ.js} +114 -98
  11. package/dist/ExperimentSelectorModal-B4j4eUOJ.js.map +1 -0
  12. package/dist/{SegmentedControl-BtnnjWzs.js → SegmentedControl-DyUPH3I5.js} +2 -2
  13. package/dist/{SegmentedControl-BtnnjWzs.js.map → SegmentedControl-DyUPH3I5.js.map} +1 -1
  14. package/dist/{SettingsModal-483nyI6b.js → SettingsModal-D2MOOtuO.js} +26 -25
  15. package/dist/SettingsModal-D2MOOtuO.js.map +1 -0
  16. package/dist/__stories__/experiment-helpers.d.ts +10 -0
  17. package/dist/__tests__/components/AppTopBarOnboarding.test.d.ts +1 -0
  18. package/dist/__tests__/components/FloatingPanelsInModal.test.d.ts +1 -0
  19. package/dist/__tests__/composables/useFloatingPanel.test.d.ts +1 -0
  20. package/dist/__tests__/composables/useOnboarding.test.d.ts +1 -0
  21. package/dist/__tests__/styles/paletteTokens.test.d.ts +1 -0
  22. package/dist/__tests__/styles/v2AuditRules.test.d.ts +1 -0
  23. package/dist/components/AppTopBar.vue.d.ts +20 -5
  24. package/dist/components/BaseButton.vue.d.ts +4 -2
  25. package/dist/components/ExperimentSelectorModal.vue.d.ts +15 -1
  26. package/dist/components/JobsStatusTray.vue.d.ts +15 -4
  27. package/dist/components/PluginWorkspaceView.props.d.ts +3 -0
  28. package/dist/components/PluginWorkspaceView.vue.d.ts +3 -0
  29. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +3 -3
  30. package/dist/components/internal/AppTopBarOnboardingInternal.vue.d.ts +7 -0
  31. package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +2 -1
  32. package/dist/components/internal/AutoGroupModalInternal.vue.d.ts +2 -2
  33. package/dist/components/internal/OnboardingLayerInternal.vue.d.ts +7 -0
  34. package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +8 -0
  35. package/dist/composables/pluginWorkspaceModel.d.ts +2 -2
  36. package/dist/composables/useFileImport.d.ts +7 -0
  37. package/dist/composables/useFloatingPanel.d.ts +29 -0
  38. package/dist/composables/useJobCenter.d.ts +41 -3
  39. package/dist/composables/useOnboarding.d.ts +119 -0
  40. package/dist/{controlSchemaModel-B8CTXagP.js → controlSchemaModel-Bsg0t5Ab.js} +2 -2
  41. package/dist/{controlSchemaModel-B8CTXagP.js.map → controlSchemaModel-Bsg0t5Ab.js.map} +1 -1
  42. package/dist/{data-CgILxDLW.js → data-Boeh4uPI.js} +13 -12
  43. package/dist/{data-CgILxDLW.js.map → data-Boeh4uPI.js.map} +1 -1
  44. package/dist/data.d.ts +1 -1
  45. package/dist/data.js +9 -9
  46. package/dist/{experiment-43OJtH7R.js → experiment-DyO54FQB.js} +25 -61
  47. package/dist/experiment-DyO54FQB.js.map +1 -0
  48. package/dist/{experimentStatus-Cqp6qNrR.js → experimentStatus-DCn2QKG7.js} +2 -2
  49. package/dist/{experimentStatus-Cqp6qNrR.js.map → experimentStatus-DCn2QKG7.js.map} +1 -1
  50. package/dist/index.js +20 -20
  51. package/dist/{install-BtLWTk6H.js → install-BEHp7Mo-.js} +15 -15
  52. package/dist/{install-BtLWTk6H.js.map → install-BEHp7Mo-.js.map} +1 -1
  53. package/dist/install.js +1 -1
  54. package/dist/{lab-MHzp-_J8.js → lab-D61eaX6f.js} +68 -61
  55. package/dist/{lab-MHzp-_J8.js.map → lab-D61eaX6f.js.map} +1 -1
  56. package/dist/lab.js +4 -4
  57. package/dist/{records-B6gpM_3e.js → records-D4aQXyZu.js} +193 -133
  58. package/dist/records-D4aQXyZu.js.map +1 -0
  59. package/dist/{runtime-7vfl_bI3.js → runtime-q-R0CNLh.js} +400 -33
  60. package/dist/runtime-q-R0CNLh.js.map +1 -0
  61. package/dist/runtime.d.ts +1 -1
  62. package/dist/runtime.js +7 -7
  63. package/dist/{shell-Cs9OJMnm.js → shell-6CGFvUUw.js} +10 -5
  64. package/dist/{shell-Cs9OJMnm.js.map → shell-6CGFvUUw.js.map} +1 -1
  65. package/dist/shell.d.ts +1 -0
  66. package/dist/shell.js +6 -6
  67. package/dist/stores/index.d.ts +1 -1
  68. package/dist/stores/index.js +2 -2
  69. package/dist/stores/settings.d.ts +4 -12
  70. package/dist/styles.css +1191 -479
  71. package/dist/types/components.d.ts +2 -0
  72. package/dist/types/index.d.ts +1 -1
  73. package/dist/types/jobs.d.ts +9 -0
  74. package/dist/types/platform.d.ts +1 -1
  75. package/dist/{useDropdownState-8yWMu-7_.js → useDropdownState-uFIz6Yv8.js} +16 -4
  76. package/dist/useDropdownState-uFIz6Yv8.js.map +1 -0
  77. package/dist/{useExperimentSamples-DHnxKFAF.js → useExperimentSamples-QEFoq4tf.js} +48 -6
  78. package/dist/useExperimentSamples-QEFoq4tf.js.map +1 -0
  79. package/dist/{useListReorder-BitdUhxn.js → useListReorder-DsuzwWGS.js} +122 -172
  80. package/dist/useListReorder-DsuzwWGS.js.map +1 -0
  81. package/dist/{useRackEditor-DiwCt77M.js → useRackEditor-KpZ4iJ6o.js} +22 -32
  82. package/dist/useRackEditor-KpZ4iJ6o.js.map +1 -0
  83. package/dist/useRealtime-B58Lo-Tm.js +508 -0
  84. package/dist/useRealtime-B58Lo-Tm.js.map +1 -0
  85. package/dist/{useRequest-D506eHi8.js → useRequest-BuDmW8Jc.js} +8 -37
  86. package/dist/useRequest-BuDmW8Jc.js.map +1 -0
  87. package/package.json +3 -2
  88. package/src/__stories__/experiment-helpers.ts +3 -3
  89. package/src/__tests__/components/ActionMenu.test.ts +2 -2
  90. package/src/__tests__/components/AppTopBar.test.ts +206 -1
  91. package/src/__tests__/components/AppTopBarOnboarding.test.ts +160 -0
  92. package/src/__tests__/components/AppTopBarPageSelector.test.ts +125 -9
  93. package/src/__tests__/components/BaseButton.test.ts +19 -0
  94. package/src/__tests__/components/BaseModal.test.ts +13 -0
  95. package/src/__tests__/components/ExperimentSelectorModal.test.ts +34 -1
  96. package/src/__tests__/components/FloatingPanelsInModal.test.ts +94 -0
  97. package/src/__tests__/components/GeneratedPluginView.test.ts +1 -1
  98. package/src/__tests__/components/JobsStatusTray.test.ts +373 -71
  99. package/src/__tests__/components/PluginWorkspaceView.test.ts +63 -1
  100. package/src/__tests__/components/SampleSelector.test.ts +20 -0
  101. package/src/__tests__/components/SettingsModal.test.ts +9 -2
  102. package/src/__tests__/composables/useFileImport.test.ts +36 -0
  103. package/src/__tests__/composables/useFloatingPanel.test.ts +68 -0
  104. package/src/__tests__/composables/useJobCenter.test.ts +262 -3
  105. package/src/__tests__/composables/useOnboarding.test.ts +317 -0
  106. package/src/__tests__/docs/frontendDocsCatalog.test.ts +4 -3
  107. package/src/__tests__/fixtures/table-import/cells.xlsx +0 -0
  108. package/src/__tests__/fixtures/table-import/samples.xlsx +0 -0
  109. package/src/__tests__/stores/settings.test.ts +21 -21
  110. package/src/__tests__/styles/cssTokens.test.ts +4 -1
  111. package/src/__tests__/styles/menusShellRefresh.test.ts +8 -2
  112. package/src/__tests__/styles/paletteTokens.test.ts +44 -0
  113. package/src/__tests__/styles/v2AuditRules.test.ts +104 -0
  114. package/src/components/ActionMenu.vue +6 -37
  115. package/src/components/AppTopBar.onboarding.story.vue +69 -0
  116. package/src/components/AppTopBar.story.vue +59 -4
  117. package/src/components/AppTopBar.vue +132 -10
  118. package/src/components/BaseButton.vue +16 -2
  119. package/src/components/BaseModal.vue +2 -1
  120. package/src/components/ExperimentSelectorModal.story.vue +38 -0
  121. package/src/components/ExperimentSelectorModal.vue +20 -1
  122. package/src/components/GeneratedPluginView.vue +4 -9
  123. package/src/components/GeneratedResultRenderer.vue +3 -4
  124. package/src/components/JobsStatusTray.story.vue +97 -43
  125. package/src/components/JobsStatusTray.vue +287 -290
  126. package/src/components/LayoutResizeHandle.story.vue +65 -4
  127. package/src/components/PluginWorkspaceView.props.ts +3 -0
  128. package/src/components/PluginWorkspaceView.vue +17 -0
  129. package/src/components/SampleSelector.story.vue +21 -6
  130. package/src/components/SampleSelector.vue +10 -3
  131. package/src/components/SectionCard.story.vue +33 -0
  132. package/src/components/SettingsModal.vue +7 -12
  133. package/src/components/Tooltip.vue +9 -32
  134. package/src/components/internal/AppTopBarOnboardingInternal.vue +172 -0
  135. package/src/components/internal/AppTopBarPageSelectorInternal.vue +140 -72
  136. package/src/components/internal/DatePickerDateInternal.vue +7 -45
  137. package/src/components/internal/DatePickerDateTimeInternal.vue +7 -1
  138. package/src/components/internal/DatePickerTimeInternal.vue +8 -1
  139. package/src/components/internal/NumberUnitInputInternal.vue +4 -18
  140. package/src/components/internal/OnboardingLayerInternal.vue +173 -0
  141. package/src/components/internal/SelectMultipleInternal.vue +6 -1
  142. package/src/components/internal/SelectSearchableInternal.vue +6 -1
  143. package/src/components/internal/WellEditPopupInternal.vue +11 -22
  144. package/src/components/internal/WorkspaceShellInternal.vue +12 -0
  145. package/src/composables/pluginWorkspaceModel.ts +2 -2
  146. package/src/composables/useFileImport.ts +51 -1
  147. package/src/composables/useFloatingPanel.ts +107 -0
  148. package/src/composables/useJobCenter.ts +188 -6
  149. package/src/composables/useOnboarding.ts +465 -0
  150. package/src/composables/usePluginWorkspace.ts +1 -1
  151. package/src/data.ts +1 -0
  152. package/src/runtime.ts +2 -1
  153. package/src/shell.ts +17 -0
  154. package/src/stores/index.ts +0 -2
  155. package/src/stores/settings.ts +20 -50
  156. package/src/styles/components/action-menu.css +1 -1
  157. package/src/styles/components/app-layout.css +6 -3
  158. package/src/styles/components/app-page-selector.css +120 -45
  159. package/src/styles/components/app-top-bar.css +165 -3
  160. package/src/styles/components/button.css +8 -0
  161. package/src/styles/components/dataframe.css +1 -1
  162. package/src/styles/components/date-picker.css +4 -2
  163. package/src/styles/components/datetime-picker.css +4 -4
  164. package/src/styles/components/experiment-selector-modal.css +13 -0
  165. package/src/styles/components/jobs-status-tray.css +134 -296
  166. package/src/styles/components/layout-resize-handle.css +59 -16
  167. package/src/styles/components/modal.css +3 -3
  168. package/src/styles/components/number-input.css +1 -1
  169. package/src/styles/components/onboarding.css +368 -0
  170. package/src/styles/components/progress-bar.css +3 -3
  171. package/src/styles/components/sample-selector.css +43 -0
  172. package/src/styles/components/searchable-select.css +3 -7
  173. package/src/styles/components/section-card.css +30 -6
  174. package/src/styles/components/settings-modal.css +7 -2
  175. package/src/styles/components/time-picker.css +3 -6
  176. package/src/styles/components/toast.css +1 -1
  177. package/src/styles/components/tooltip.css +2 -2
  178. package/src/styles/components/unit-input.css +1 -1
  179. package/src/styles/components/well-edit-popup.css +2 -2
  180. package/src/styles/index.css +1 -0
  181. package/src/styles/variables.css +153 -15
  182. package/src/types/components.ts +2 -0
  183. package/src/types/index.ts +1 -0
  184. package/src/types/jobs.ts +10 -0
  185. package/src/types/platform.ts +1 -1
  186. package/dist/AppSidebar-Dq9W1jE2.js.map +0 -1
  187. package/dist/ExperimentSelectorModal-65peG4Up.js.map +0 -1
  188. package/dist/SettingsModal-483nyI6b.js.map +0 -1
  189. package/dist/experiment-43OJtH7R.js.map +0 -1
  190. package/dist/records-B6gpM_3e.js.map +0 -1
  191. package/dist/runtime-7vfl_bI3.js.map +0 -1
  192. package/dist/useDropdownState-8yWMu-7_.js.map +0 -1
  193. package/dist/useExperimentSamples-DHnxKFAF.js.map +0 -1
  194. package/dist/useListReorder-BitdUhxn.js.map +0 -1
  195. package/dist/useRackEditor-DiwCt77M.js.map +0 -1
  196. package/dist/useRealtime-C3iy9QkU.js +0 -699
  197. package/dist/useRealtime-C3iy9QkU.js.map +0 -1
  198. package/dist/useRequest-D506eHi8.js.map +0 -1
@@ -1,11 +1,10 @@
1
- import { a as BaseButton_default, n as BaseModal_default, o as __exportAll, r as useFocusTrap, t as useDropdownState } from "./useDropdownState-8yWMu-7_.js";
2
- import { d as tryUseSettingsStore, m as mintApiErrorFromResponse, p as MintApiError, t as useExperimentStore } from "./experiment-43OJtH7R.js";
3
- import { C as formatExperimentDate, D as compareTime, E as useMenuKeyboard, F as toMinutes, G as BaseInput_default, M as formatTimeSlot, N as generateTimeSlots, T as FileUploader_default, V as BaseSelect_default, W as normalizeOptionInput, d as normalizeJobState, i as getInjectedPlatformContext, j as formatTime, k as findNearestTimeSlotIndex, m as SecretInput_default, n as ResourcePickerListInternal_default, p as TagsInput_default, s as isActiveJobStatus, z as BaseCheckbox_default } from "./records-B6gpM_3e.js";
1
+ import { a as BaseButton_default, n as BaseModal_default, o as __exportAll, r as useFocusTrap, t as useDropdownState } from "./useDropdownState-uFIz6Yv8.js";
2
+ import { d as MintApiError, f as mintApiErrorFromResponse, l as tryUseSettingsStore, t as useExperimentStore } from "./experiment-DyO54FQB.js";
3
+ import { C as formatExperimentDate, D as compareTime, E as useMenuKeyboard, F as toMinutes, G as normalizeOptionInput, K as BaseInput_default, M as formatTimeSlot, N as generateTimeSlots, T as FileUploader_default, V as BaseSelect_default, W as useFloatingPanel, c as SecretInput_default, d as isActiveJobStatus, h as normalizeJobState, i as getInjectedPlatformContext, j as formatTime, k as findNearestTimeSlotIndex, n as ResourcePickerListInternal_default, s as TagsInput_default, z as BaseCheckbox_default } from "./records-D4aQXyZu.js";
4
4
  import "./auth-SliLnFre.js";
5
5
  import { getRoleInfo, hasAllPermissions, isAdminUser } from "./permissions.js";
6
- import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createStaticVNode, createTextVNode, createVNode, defineComponent, getCurrentInstance, getCurrentScope, inject, mergeProps, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, onScopeDispose, onUnmounted, openBlock, ref, renderList, renderSlot, shallowRef, toDisplayString, toValue, unref, useAttrs, useId, useTemplateRef, vShow, watch, withCtx, withDirectives, withModifiers } from "vue";
6
+ import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createStaticVNode, createTextVNode, createVNode, defineComponent, getCurrentInstance, getCurrentScope, inject, mergeProps, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, onScopeDispose, onUnmounted, openBlock, ref, renderList, renderSlot, shallowRef, toDisplayString, toValue, unref, useAttrs, useId, useTemplateRef, vShow, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
7
7
  import { ChevronDown, ChevronUp } from "lucide-vue-next";
8
- import { autoUpdate, computePosition, flip, offset, shift } from "@floating-ui/dom";
9
8
  //#region src/components/BaseRadioGroup.vue?vue&type=script&setup=true&lang.ts
10
9
  var _hoisted_1$12 = { class: "mint-radio-option__input-wrapper" };
11
10
  var _hoisted_2$12 = [
@@ -26,7 +25,7 @@ var _hoisted_5$9 = [
26
25
  "aria-describedby",
27
26
  "onChange"
28
27
  ];
29
- var _hoisted_6$9 = { class: "mint-radio-option__head" };
28
+ var _hoisted_6$8 = { class: "mint-radio-option__head" };
30
29
  var _hoisted_7$8 = { class: "mint-radio-option__title" };
31
30
  var _hoisted_8$7 = ["id"];
32
31
  //#endregion
@@ -101,7 +100,7 @@ var BaseRadioGroup_default = /* @__PURE__ */ defineComponent({
101
100
  class: "mint-radio-option__native",
102
101
  onChange: ($event) => handleChange(option.value)
103
102
  }, null, 40, _hoisted_5$9),
104
- createElementVNode("div", _hoisted_6$9, [createElementVNode("div", { class: normalizeClass([
103
+ createElementVNode("div", _hoisted_6$8, [createElementVNode("div", { class: normalizeClass([
105
104
  "mint-radio-option__circle",
106
105
  `mint-radio-option__circle--${props.size}`,
107
106
  props.modelValue === option.value ? "mint-radio-option__circle--checked" : ""
@@ -478,7 +477,7 @@ var _hoisted_2$10 = { class: "mint-date-picker__header" };
478
477
  var _hoisted_3$10 = ["aria-label"];
479
478
  var _hoisted_4$9 = { class: "mint-date-picker__month-year" };
480
479
  var _hoisted_5$8 = ["aria-label"];
481
- var _hoisted_6$8 = { class: "mint-date-picker__weekdays" };
480
+ var _hoisted_6$7 = { class: "mint-date-picker__weekdays" };
482
481
  var _hoisted_7$7 = { class: "mint-date-picker__grid" };
483
482
  var _hoisted_8$6 = [
484
483
  "disabled",
@@ -556,7 +555,7 @@ var CalendarGridPanelInternal_default = /* @__PURE__ */ defineComponent({
556
555
  "aria-hidden": "true"
557
556
  }, [createElementVNode("path", { d: "m9 18 6-6-6-6" })], -1)])], 8, _hoisted_5$8)
558
557
  ]),
559
- createElementVNode("div", _hoisted_6$8, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.weekDays, (day) => {
558
+ createElementVNode("div", _hoisted_6$7, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.weekDays, (day) => {
560
559
  return openBlock(), createElementBlock("div", {
561
560
  key: day,
562
561
  class: "mint-date-picker__weekday"
@@ -625,11 +624,11 @@ var DatePickerDateInternal_default = /* @__PURE__ */ defineComponent({
625
624
  const props = __props;
626
625
  const emit = __emit;
627
626
  const dropdownRef = ref(null);
628
- const dropdownStyle = ref({});
629
627
  const { isOpen, triggerRef, open, close, toggle } = useDropdownState({
630
628
  rootRef: useTemplateRef("container"),
631
629
  insideRefs: [dropdownRef]
632
630
  });
631
+ const { style: dropdownStyle } = useFloatingPanel(triggerRef, dropdownRef, isOpen);
633
632
  useFocusTrap({
634
633
  containerRef: dropdownRef,
635
634
  active: isOpen
@@ -664,38 +663,6 @@ var DatePickerDateInternal_default = /* @__PURE__ */ defineComponent({
664
663
  open();
665
664
  }
666
665
  }
667
- let stopAutoUpdate = null;
668
- async function updateDropdownPosition() {
669
- const trigger = triggerRef.value;
670
- const panel = dropdownRef.value;
671
- if (!trigger || !panel) return;
672
- const { x, y } = await computePosition(trigger, panel, {
673
- placement: "bottom-start",
674
- strategy: "fixed",
675
- middleware: [
676
- offset(4),
677
- flip(),
678
- shift({ padding: 8 })
679
- ]
680
- });
681
- dropdownStyle.value = {
682
- position: "fixed",
683
- top: `${y}px`,
684
- left: `${x}px`,
685
- zIndex: "9999"
686
- };
687
- }
688
- function stopPositioning() {
689
- stopAutoUpdate?.();
690
- stopAutoUpdate = null;
691
- }
692
- function startPositioning() {
693
- const trigger = triggerRef.value;
694
- const panel = dropdownRef.value;
695
- if (!trigger || !panel) return;
696
- stopPositioning();
697
- stopAutoUpdate = autoUpdate(trigger, panel, () => void updateDropdownPosition());
698
- }
699
666
  /** Moves focus into the calendar grid: selected day, else today, else the first day. */
700
667
  function focusCalendar() {
701
668
  const panel = dropdownRef.value;
@@ -703,20 +670,15 @@ var DatePickerDateInternal_default = /* @__PURE__ */ defineComponent({
703
670
  (panel.querySelector(".mint-date-picker__day--selected") ?? panel.querySelector(".mint-date-picker__day--today") ?? panel.querySelector(".mint-date-picker__day:not([disabled])"))?.focus();
704
671
  }
705
672
  watch(isOpen, async (opened) => {
706
- if (!opened) {
707
- stopPositioning();
708
- return;
709
- }
673
+ if (!opened) return;
710
674
  if (selectedDate.value) setCurrentMonthFromDate(selectedDate.value);
711
675
  await nextTick();
712
- startPositioning();
713
676
  await nextTick();
714
677
  focusCalendar();
715
678
  });
716
- onBeforeUnmount(stopPositioning);
717
679
  return (_ctx, _cache) => {
718
680
  return openBlock(), createElementBlock("div", _hoisted_1$9, [createElementVNode("div", _hoisted_2$9, [
719
- _cache[1] || (_cache[1] = createStaticVNode("<div class=\"mint-date-picker__icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M8 2v4\"></path><path d=\"M16 2v4\"></path><rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\"></rect><path d=\"M3 10h18\"></path></svg></div>", 1)),
681
+ _cache[2] || (_cache[2] = createStaticVNode("<div class=\"mint-date-picker__icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M8 2v4\"></path><path d=\"M16 2v4\"></path><rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\"></rect><path d=\"M3 10h18\"></path></svg></div>", 1)),
720
682
  createElementVNode("input", {
721
683
  ref_key: "triggerRef",
722
684
  ref: triggerRef,
@@ -742,7 +704,7 @@ var DatePickerDateInternal_default = /* @__PURE__ */ defineComponent({
742
704
  class: "mint-date-picker__clear-btn",
743
705
  "aria-label": "Clear date",
744
706
  onClick: withModifiers(clear, ["stop"])
745
- }, [..._cache[0] || (_cache[0] = [createElementVNode("svg", {
707
+ }, [..._cache[1] || (_cache[1] = [createElementVNode("svg", {
746
708
  viewBox: "0 0 24 24",
747
709
  fill: "none",
748
710
  stroke: "currentColor",
@@ -764,9 +726,10 @@ var DatePickerDateInternal_default = /* @__PURE__ */ defineComponent({
764
726
  ref_key: "dropdownRef",
765
727
  ref: dropdownRef,
766
728
  class: "mint-popover mint-date-picker__dropdown",
767
- style: normalizeStyle(dropdownStyle.value),
729
+ style: normalizeStyle(unref(dropdownStyle)),
768
730
  role: "dialog",
769
- "aria-label": "Date picker"
731
+ "aria-label": "Date picker",
732
+ onKeydown: _cache[0] || (_cache[0] = withKeys(withModifiers(($event) => unref(close)(true), ["prevent"]), ["escape"]))
770
733
  }, [createVNode(CalendarGridPanelInternal_default, {
771
734
  "week-days": unref(weekDays),
772
735
  "month-year": unref(monthYear),
@@ -782,7 +745,7 @@ var DatePickerDateInternal_default = /* @__PURE__ */ defineComponent({
782
745
  "selected-date",
783
746
  "onPreviousMonth",
784
747
  "onNextMonth"
785
- ])], 4)) : createCommentVNode("", true)]),
748
+ ])], 36)) : createCommentVNode("", true)]),
786
749
  _: 1
787
750
  })]))], 512);
788
751
  };
@@ -803,7 +766,7 @@ var _hoisted_3$8 = [
803
766
  ];
804
767
  var _hoisted_4$8 = { class: "mint-datetime-picker__calendar-section" };
805
768
  var _hoisted_5$7 = { class: "mint-datetime-picker__time-section" };
806
- var _hoisted_6$7 = { class: "mint-datetime-picker__time-grid" };
769
+ var _hoisted_6$6 = { class: "mint-datetime-picker__time-grid" };
807
770
  var _hoisted_7$6 = ["disabled", "onClick"];
808
771
  var _hoisted_8$5 = { class: "mint-datetime-picker__footer" };
809
772
  //#endregion
@@ -838,10 +801,12 @@ var DatePickerDateTimeInternal_default = /* @__PURE__ */ defineComponent({
838
801
  const props = __props;
839
802
  const emit = __emit;
840
803
  const dropdownRef = ref(null);
804
+ const rootRef = useTemplateRef("root");
841
805
  const { isOpen, open, close, toggle } = useDropdownState({
842
- rootRef: useTemplateRef("root"),
806
+ rootRef,
843
807
  triggerRef: useTemplateRef("trigger")
844
808
  });
809
+ const { style: dropdownStyle } = useFloatingPanel(rootRef, dropdownRef, isOpen);
845
810
  useFocusTrap({
846
811
  containerRef: dropdownRef,
847
812
  active: isOpen
@@ -949,7 +914,7 @@ var DatePickerDateTimeInternal_default = /* @__PURE__ */ defineComponent({
949
914
  focusCalendar();
950
915
  });
951
916
  return (_ctx, _cache) => {
952
- return openBlock(), createElementBlock("div", _hoisted_1$8, [createElementVNode("div", _hoisted_2$8, [_cache[0] || (_cache[0] = createStaticVNode("<div class=\"mint-datetime-picker__icon-calendar\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M8 2v4\"></path><path d=\"M16 2v4\"></path><rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\"></rect><path d=\"M3 10h18\"></path></svg></div>", 1)), createElementVNode("input", {
917
+ return openBlock(), createElementBlock("div", _hoisted_1$8, [createElementVNode("div", _hoisted_2$8, [_cache[1] || (_cache[1] = createStaticVNode("<div class=\"mint-datetime-picker__icon-calendar\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M8 2v4\"></path><path d=\"M16 2v4\"></path><rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\"></rect><path d=\"M3 10h18\"></path></svg></div>", 1)), createElementVNode("input", {
953
918
  ref: "trigger",
954
919
  type: "text",
955
920
  readonly: "",
@@ -980,8 +945,10 @@ var DatePickerDateTimeInternal_default = /* @__PURE__ */ defineComponent({
980
945
  ref_key: "dropdownRef",
981
946
  ref: dropdownRef,
982
947
  class: "mint-popover mint-datetime-picker__dropdown",
948
+ style: normalizeStyle(unref(dropdownStyle)),
983
949
  role: "dialog",
984
- "aria-label": "Date and time picker"
950
+ "aria-label": "Date and time picker",
951
+ onKeydown: _cache[0] || (_cache[0] = withKeys(withModifiers(($event) => unref(close)(true), ["prevent"]), ["escape"]))
985
952
  }, [
986
953
  createElementVNode("div", _hoisted_4$8, [createVNode(CalendarGridPanelInternal_default, {
987
954
  "week-days": unref(weekDays),
@@ -1001,8 +968,8 @@ var DatePickerDateTimeInternal_default = /* @__PURE__ */ defineComponent({
1001
968
  "onPreviousMonth",
1002
969
  "onNextMonth"
1003
970
  ])]),
1004
- _cache[2] || (_cache[2] = createElementVNode("div", { class: "mint-datetime-picker__divider" }, null, -1)),
1005
- createElementVNode("div", _hoisted_5$7, [_cache[1] || (_cache[1] = createElementVNode("div", { class: "mint-datetime-picker__time-label" }, "Time", -1)), createElementVNode("div", _hoisted_6$7, [(openBlock(true), createElementBlock(Fragment, null, renderList(timeSlots.value, (time) => {
971
+ _cache[3] || (_cache[3] = createElementVNode("div", { class: "mint-datetime-picker__divider" }, null, -1)),
972
+ createElementVNode("div", _hoisted_5$7, [_cache[2] || (_cache[2] = createElementVNode("div", { class: "mint-datetime-picker__time-label" }, "Time", -1)), createElementVNode("div", _hoisted_6$6, [(openBlock(true), createElementBlock(Fragment, null, renderList(timeSlots.value, (time) => {
1006
973
  return openBlock(), createElementBlock("button", {
1007
974
  key: time,
1008
975
  type: "button",
@@ -1029,7 +996,7 @@ var DatePickerDateTimeInternal_default = /* @__PURE__ */ defineComponent({
1029
996
  class: "mint-datetime-picker__footer-btn mint-datetime-picker__footer-btn--muted",
1030
997
  onClick: clear
1031
998
  }, " Clear ")) : createCommentVNode("", true)])
1032
- ], 512)) : createCommentVNode("", true)]),
999
+ ], 36)) : createCommentVNode("", true)]),
1033
1000
  _: 1
1034
1001
  })], 512);
1035
1002
  };
@@ -1046,18 +1013,14 @@ var _hoisted_2$7 = [
1046
1013
  "aria-controls",
1047
1014
  "aria-activedescendant"
1048
1015
  ];
1049
- var _hoisted_3$7 = {
1050
- key: 0,
1051
- class: "mint-popover mint-time-picker__dropdown"
1052
- };
1053
- var _hoisted_4$7 = [
1016
+ var _hoisted_3$7 = [
1054
1017
  "id",
1055
1018
  "aria-selected",
1056
1019
  "aria-disabled",
1057
1020
  "onClick"
1058
1021
  ];
1059
- var _hoisted_5$6 = { class: "mint-time-picker__slot-time" };
1060
- var _hoisted_6$6 = {
1022
+ var _hoisted_4$7 = { class: "mint-time-picker__slot-time" };
1023
+ var _hoisted_5$6 = {
1061
1024
  key: 0,
1062
1025
  class: "mint-time-picker__slot-reason"
1063
1026
  };
@@ -1093,12 +1056,15 @@ var DatePickerTimeInternal_default = /* @__PURE__ */ defineComponent({
1093
1056
  const props = __props;
1094
1057
  const emit = __emit;
1095
1058
  const listRef = ref(null);
1059
+ const dropdownRef = ref(null);
1096
1060
  const highlightedIndex = ref(-1);
1097
1061
  const listboxId = `mint-time-picker-listbox-${useId().replace(/:/g, "")}`;
1062
+ const rootRef = useTemplateRef("root");
1098
1063
  const { isOpen, open, close, toggle } = useDropdownState({
1099
- rootRef: useTemplateRef("root"),
1064
+ rootRef,
1100
1065
  triggerRef: useTemplateRef("trigger")
1101
1066
  });
1067
+ const { style: dropdownStyle } = useFloatingPanel(rootRef, dropdownRef, isOpen, { matchWidth: true });
1102
1068
  /** Id of the highlighted slot, published to the input as `aria-activedescendant`. */
1103
1069
  const activeSlotId = computed(() => isOpen.value && highlightedIndex.value >= 0 ? `${listboxId}-option-${highlightedIndex.value}` : void 0);
1104
1070
  const slots = computed(() => {
@@ -1282,7 +1248,13 @@ var DatePickerTimeInternal_default = /* @__PURE__ */ defineComponent({
1282
1248
  "leave-from-class": "mint-time-picker__dropdown-leave-from",
1283
1249
  "leave-to-class": "mint-time-picker__dropdown-leave-to"
1284
1250
  }, {
1285
- default: withCtx(() => [unref(isOpen) ? (openBlock(), createElementBlock("div", _hoisted_3$7, [createElementVNode("ul", {
1251
+ default: withCtx(() => [unref(isOpen) ? (openBlock(), createElementBlock("div", {
1252
+ key: 0,
1253
+ ref_key: "dropdownRef",
1254
+ ref: dropdownRef,
1255
+ class: "mint-popover mint-time-picker__dropdown",
1256
+ style: normalizeStyle(unref(dropdownStyle))
1257
+ }, [createElementVNode("ul", {
1286
1258
  id: listboxId,
1287
1259
  ref_key: "listRef",
1288
1260
  ref: listRef,
@@ -1303,8 +1275,8 @@ var DatePickerTimeInternal_default = /* @__PURE__ */ defineComponent({
1303
1275
  index === highlightedIndex.value && !isSlotDisabled(slot) ? "mint-menu-item--active mint-time-picker__slot--highlighted" : ""
1304
1276
  ]),
1305
1277
  onClick: ($event) => selectSlot(slot)
1306
- }, [createElementVNode("span", _hoisted_5$6, toDisplayString(unref(formatTimeSlot)(slot, __props.format)), 1), slotReason(slot) ? (openBlock(), createElementBlock("span", _hoisted_6$6, toDisplayString(slotReason(slot)), 1)) : createCommentVNode("", true)], 10, _hoisted_4$7);
1307
- }), 128))], 512)])) : createCommentVNode("", true)]),
1278
+ }, [createElementVNode("span", _hoisted_4$7, toDisplayString(unref(formatTimeSlot)(slot, __props.format)), 1), slotReason(slot) ? (openBlock(), createElementBlock("span", _hoisted_5$6, toDisplayString(slotReason(slot)), 1)) : createCommentVNode("", true)], 10, _hoisted_3$7);
1279
+ }), 128))], 512)], 4)) : createCommentVNode("", true)]),
1308
1280
  _: 1
1309
1281
  })], 544);
1310
1282
  };
@@ -1595,34 +1567,12 @@ var NumberUnitInputInternal_default = /* @__PURE__ */ defineComponent({
1595
1567
  emit("update:unit", newUnitValue);
1596
1568
  }
1597
1569
  const menuRef = ref(null);
1598
- const menuStyle = ref({ opacity: "0" });
1599
1570
  const { isOpen, rootRef, open, close } = useDropdownState({
1600
1571
  triggerRef: useTemplateRef("trigger"),
1601
- closeOnScroll: true,
1602
- insideRefs: [menuRef],
1603
- onOpen: () => {
1604
- menuStyle.value = { opacity: "0" };
1605
- }
1606
- });
1607
- /** Teleported + fixed like ActionMenu, so overflow:hidden/auto ancestors never clip the menu. */
1608
- watch(isOpen, async (opened) => {
1609
- if (!opened) return;
1610
- await nextTick();
1611
- if (!rootRef.value || !menuRef.value) return;
1612
- const { x, y } = await computePosition(rootRef.value, menuRef.value, {
1613
- placement: "bottom-end",
1614
- strategy: "fixed",
1615
- middleware: [
1616
- offset(4),
1617
- flip(),
1618
- shift({ padding: 8 })
1619
- ]
1620
- });
1621
- menuStyle.value = {
1622
- left: `${x}px`,
1623
- top: `${y}px`
1624
- };
1572
+ insideRefs: [menuRef]
1625
1573
  });
1574
+ /** Teleported + fixed like ActionMenu, so overflow:hidden/auto ancestors never clip the menu; it follows the field on scroll. */
1575
+ const { style: menuStyle } = useFloatingPanel(rootRef, menuRef, isOpen, { placement: "bottom-end" });
1626
1576
  function menuItems() {
1627
1577
  return menuRef.value ? Array.from(menuRef.value.querySelectorAll("[role=\"option\"]")) : [];
1628
1578
  }
@@ -1693,7 +1643,7 @@ var NumberUnitInputInternal_default = /* @__PURE__ */ defineComponent({
1693
1643
  ref_key: "menuRef",
1694
1644
  ref: menuRef,
1695
1645
  class: "mint-popover mint-unit-input__menu",
1696
- style: normalizeStyle(menuStyle.value),
1646
+ style: normalizeStyle(unref(menuStyle)),
1697
1647
  role: "listbox",
1698
1648
  "aria-label": "Unit",
1699
1649
  onKeydown: _cache[1] || (_cache[1] = (...args) => unref(handlePanelKeydown) && unref(handlePanelKeydown)(...args))
@@ -2029,6 +1979,79 @@ var NumberInput_default = /* @__PURE__ */ defineComponent({
2029
1979
  }
2030
1980
  });
2031
1981
  //#endregion
1982
+ //#region src/composables/usePlatform.ts
1983
+ var platformContext = ref({
1984
+ isIntegrated: false,
1985
+ theme: "system"
1986
+ });
1987
+ function storedTheme() {
1988
+ try {
1989
+ const s = localStorage.getItem("mint-settings");
1990
+ if (s) return JSON.parse(s).theme || "system";
1991
+ } catch {}
1992
+ return "system";
1993
+ }
1994
+ function detectPlatform() {
1995
+ const platformData = window.__MINT_PLATFORM__;
1996
+ if (platformData) {
1997
+ platformContext.value = {
1998
+ ...platformData,
1999
+ isIntegrated: true,
2000
+ theme: storedTheme()
2001
+ };
2002
+ return;
2003
+ }
2004
+ platformContext.value = {
2005
+ isIntegrated: new URLSearchParams(window.location.search).has("mint-plugin"),
2006
+ theme: storedTheme()
2007
+ };
2008
+ }
2009
+ var ACCESS_PERMISSIONS = {
2010
+ use: ["plugins.use"],
2011
+ configure: ["plugins.use", "plugins.configure"]
2012
+ };
2013
+ /**
2014
+ * Read the platform context the MINT platform injects into a plugin page.
2015
+ *
2016
+ * `can(access)` answers with the same three levels as the Python `access`
2017
+ * option. A page with no signed-in user passes every check when it runs
2018
+ * standalone or the platform reports `authRequired: false`; the platform
2019
+ * still checks every request.
2020
+ *
2021
+ * @example
2022
+ * ```typescript
2023
+ * const platform = usePlatform()
2024
+ * const canConfigure = computed(() => platform.can('configure'))
2025
+ * ```
2026
+ */
2027
+ function usePlatform() {
2028
+ detectPlatform();
2029
+ const integrated = computed(() => platformContext.value.isIntegrated);
2030
+ const plugin = computed(() => platformContext.value.plugin);
2031
+ const user = computed(() => platformContext.value.user);
2032
+ const theme = computed(() => platformContext.value.theme);
2033
+ const features = computed(() => platformContext.value.features);
2034
+ function can(access) {
2035
+ const current = user.value;
2036
+ if (!current) return !integrated.value || platformContext.value.authRequired === false;
2037
+ if (isAdminUser(current)) return true;
2038
+ if (access === "admin" || !hasAllPermissions(current, ACCESS_PERMISSIONS[access])) return false;
2039
+ const visible = getRoleInfo(current)?.plugin_access;
2040
+ if (!visible || visible === "all") return true;
2041
+ const names = [plugin.value?.id, plugin.value?.route_prefix?.replace(/^\/+|\/+$/g, "")];
2042
+ return Array.isArray(visible) && names.some((name) => !!name && visible.includes(name));
2043
+ }
2044
+ return {
2045
+ integrated,
2046
+ plugin,
2047
+ user,
2048
+ theme,
2049
+ features,
2050
+ isAdmin: computed(() => can("admin")),
2051
+ can
2052
+ };
2053
+ }
2054
+ //#endregion
2032
2055
  //#region src/composables/eventStream.ts
2033
2056
  var EventStreamResponseError = class extends Error {
2034
2057
  response;
@@ -4877,79 +4900,6 @@ function optionValue(option) {
4877
4900
  return option;
4878
4901
  }
4879
4902
  //#endregion
4880
- //#region src/composables/usePlatform.ts
4881
- var platformContext = ref({
4882
- isIntegrated: false,
4883
- theme: "system"
4884
- });
4885
- function storedTheme() {
4886
- try {
4887
- const s = localStorage.getItem("mint-settings");
4888
- if (s) return JSON.parse(s).theme || "system";
4889
- } catch {}
4890
- return "system";
4891
- }
4892
- function detectPlatform() {
4893
- const platformData = window.__MINT_PLATFORM__;
4894
- if (platformData) {
4895
- platformContext.value = {
4896
- ...platformData,
4897
- isIntegrated: true,
4898
- theme: storedTheme()
4899
- };
4900
- return;
4901
- }
4902
- platformContext.value = {
4903
- isIntegrated: new URLSearchParams(window.location.search).has("mint-plugin"),
4904
- theme: storedTheme()
4905
- };
4906
- }
4907
- var ACCESS_PERMISSIONS = {
4908
- use: ["plugins.use"],
4909
- configure: ["plugins.use", "plugins.configure"]
4910
- };
4911
- /**
4912
- * Read the platform context the MINT platform injects into a plugin page.
4913
- *
4914
- * `can(access)` answers with the same three levels as the Python `access`
4915
- * option. A page with no signed-in user passes every check when it runs
4916
- * standalone or the platform reports `authRequired: false`; the platform
4917
- * still checks every request.
4918
- *
4919
- * @example
4920
- * ```typescript
4921
- * const platform = usePlatform()
4922
- * const canConfigure = computed(() => platform.can('configure'))
4923
- * ```
4924
- */
4925
- function usePlatform() {
4926
- detectPlatform();
4927
- const integrated = computed(() => platformContext.value.isIntegrated);
4928
- const plugin = computed(() => platformContext.value.plugin);
4929
- const user = computed(() => platformContext.value.user);
4930
- const theme = computed(() => platformContext.value.theme);
4931
- const features = computed(() => platformContext.value.features);
4932
- function can(access) {
4933
- const current = user.value;
4934
- if (!current) return !integrated.value || platformContext.value.authRequired === false;
4935
- if (isAdminUser(current)) return true;
4936
- if (access === "admin" || !hasAllPermissions(current, ACCESS_PERMISSIONS[access])) return false;
4937
- const visible = getRoleInfo(current)?.plugin_access;
4938
- if (!visible || visible === "all") return true;
4939
- const names = [plugin.value?.id, plugin.value?.route_prefix?.replace(/^\/+|\/+$/g, "")];
4940
- return Array.isArray(visible) && names.some((name) => !!name && visible.includes(name));
4941
- }
4942
- return {
4943
- integrated,
4944
- plugin,
4945
- user,
4946
- theme,
4947
- features,
4948
- isAdmin: computed(() => can("admin")),
4949
- can
4950
- };
4951
- }
4952
- //#endregion
4953
4903
  //#region src/components/StepWizard.vue?vue&type=script&setup=true&lang.ts
4954
4904
  var _hoisted_1 = {
4955
4905
  key: 0,
@@ -5289,6 +5239,6 @@ function useListReorder(options) {
5289
5239
  };
5290
5240
  }
5291
5241
  //#endregion
5292
- export { createGeneratedAnalysisTransport as A, compareSortValues as B, useSequenceUtils as C, GeneratedPathInput_default as D, renderFormulaParts as E, applySpecDefaults as F, BaseSlider_default as H, defineDataFrame as I, definePlateEditor as L, createEventStream as M, NumberInput_default as N, _plugin_vue_export_helper_default as O, DatePicker_default as P, definePluginWorkspaceView as R, SequenceInput_default as S, formula_exports as T, BaseRadioGroup_default as U, useSortedItems as V, getFieldRegistryEntry as _, StepWizard_default as a, useConcentrationUnits as b, normalizeControlDefinition as c, humanize as d, numericValue as f, replaceRecord as g, recordValue as h, useReorderAnnouncer as i, useJobsEndpoint as j, GENERATED_JOBS_API_KEY as k, normalizeControls as l, orderedUnique as m, reorderList as n, usePlatform as o, omitUndefined as p, useListReorder as r, defaultValueForControl as s, REORDER_ANNOUNCER_STYLE as t, normalizeOption as u, getTypeDefault as v, FormulaInput_default as w, MoleculeInput_default as x, ConcentrationInput_default as y, defineWellPlate as z };
5242
+ export { useJobsEndpoint as A, compareSortValues as B, FormulaInput_default as C, _plugin_vue_export_helper_default as D, GeneratedPathInput_default as E, applySpecDefaults as F, BaseSlider_default as H, defineDataFrame as I, definePlateEditor as L, usePlatform as M, NumberInput_default as N, GENERATED_JOBS_API_KEY as O, DatePicker_default as P, definePluginWorkspaceView as R, useSequenceUtils as S, renderFormulaParts as T, BaseRadioGroup_default as U, useSortedItems as V, getTypeDefault as _, StepWizard_default as a, MoleculeInput_default as b, normalizeControls as c, numericValue as d, omitUndefined as f, getFieldRegistryEntry as g, replaceRecord as h, useReorderAnnouncer as i, createEventStream as j, createGeneratedAnalysisTransport as k, normalizeOption as l, recordValue as m, reorderList as n, defaultValueForControl as o, orderedUnique as p, useListReorder as r, normalizeControlDefinition as s, REORDER_ANNOUNCER_STYLE as t, humanize as u, ConcentrationInput_default as v, formula_exports as w, SequenceInput_default as x, useConcentrationUnits as y, defineWellPlate as z };
5293
5243
 
5294
- //# sourceMappingURL=useListReorder-BitdUhxn.js.map
5244
+ //# sourceMappingURL=useListReorder-DsuzwWGS.js.map