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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
package/dist/lab.js CHANGED
@@ -1,5 +1,5 @@
1
- import { P as time_exports } from "./records-B6gpM_3e.js";
2
- import { C as useSequenceUtils, L as definePlateEditor, S as SequenceInput_default, T as formula_exports, a as StepWizard_default, b as useConcentrationUnits, w as FormulaInput_default, x as MoleculeInput_default, y as ConcentrationInput_default, z as defineWellPlate } from "./useListReorder-BitdUhxn.js";
3
- import { C as defineWellPlateControlProps, S as defineDoseDesignControlModel, T as defineWellPlateDoseControlProps, _ as SampleSelector_default, a as useReagentSeries, c as InstrumentStatusPanels_default, d as ChemicalFormula_default, f as AdductText_default, g as SampleHierarchyTree_default, h as useProtocolTemplates, i as generateDilutionSeries, l as InstrumentStateBadge_default, m as ProtocolStepEditor_default, n as DEFAULT_PRESETS, o as ResourceCard_default, p as ScientificNumber_default, r as DEFAULT_UNITS, s as TimeRangeInput_default, u as SequenceProgressBar_default, v as useSampleGroups, w as defineWellPlateDoseComponentBindings, x as defineDoseCalculatorControlProps } from "./lab-MHzp-_J8.js";
4
- import { C as hexToHsl, E as sampleTypeMarker, S as deriveShade, T as WellPlate_default, _ as mintPlotlyTemplate, b as PlateEditor_default, g as ChartContainer_default, h as PlotlyChart_default, n as ScheduleCalendar_default, r as useScheduleDrag, t as useRackEditor, v as DoseCalculator_default, w as hslToHex, y as dose_exports } from "./useRackEditor-DiwCt77M.js";
1
+ import { P as time_exports } from "./records-D4aQXyZu.js";
2
+ import { C as FormulaInput_default, L as definePlateEditor, S as useSequenceUtils, a as StepWizard_default, b as MoleculeInput_default, v as ConcentrationInput_default, w as formula_exports, x as SequenceInput_default, y as useConcentrationUnits, z as defineWellPlate } from "./useListReorder-DsuzwWGS.js";
3
+ import { C as defineWellPlateControlProps, S as defineDoseDesignControlModel, T as defineWellPlateDoseControlProps, _ as SampleSelector_default, a as useReagentSeries, c as InstrumentStatusPanels_default, d as ChemicalFormula_default, f as AdductText_default, g as SampleHierarchyTree_default, h as useProtocolTemplates, i as generateDilutionSeries, l as InstrumentStateBadge_default, m as ProtocolStepEditor_default, n as DEFAULT_PRESETS, o as ResourceCard_default, p as ScientificNumber_default, r as DEFAULT_UNITS, s as TimeRangeInput_default, u as SequenceProgressBar_default, v as useSampleGroups, w as defineWellPlateDoseComponentBindings, x as defineDoseCalculatorControlProps } from "./lab-D61eaX6f.js";
4
+ import { C as hexToHsl, E as sampleTypeMarker, S as deriveShade, T as WellPlate_default, _ as mintPlotlyTemplate, b as PlateEditor_default, g as ChartContainer_default, h as PlotlyChart_default, n as ScheduleCalendar_default, r as useScheduleDrag, t as useRackEditor, v as DoseCalculator_default, w as hslToHex, y as dose_exports } from "./useRackEditor-KpZ4iJ6o.js";
5
5
  export { AdductText_default as AdductText, ChartContainer_default as ChartContainer, ChemicalFormula_default as ChemicalFormula, ConcentrationInput_default as ConcentrationInput, DEFAULT_PRESETS, DEFAULT_UNITS, DoseCalculator_default as DoseCalculator, FormulaInput_default as FormulaInput, InstrumentStateBadge_default as InstrumentStateBadge, InstrumentStatusPanels_default as InstrumentStatusPanels, MoleculeInput_default as MoleculeInput, PlateEditor_default as PlateEditor, PlotlyChart_default as PlotlyChart, ProtocolStepEditor_default as ProtocolStepEditor, ResourceCard_default as ResourceCard, SampleHierarchyTree_default as SampleHierarchyTree, SampleSelector_default as SampleSelector, ScheduleCalendar_default as ScheduleCalendar, ScientificNumber_default as ScientificNumber, SequenceInput_default as SequenceInput, SequenceProgressBar_default as SequenceProgressBar, StepWizard_default as StepWizard, TimeRangeInput_default as TimeRangeInput, WellPlate_default as WellPlate, defineDoseCalculatorControlProps, defineDoseDesignControlModel, definePlateEditor, defineWellPlate, defineWellPlateControlProps, defineWellPlateDoseComponentBindings, defineWellPlateDoseControlProps, deriveShade, dose_exports as dose, formula_exports as formula, generateDilutionSeries, hexToHsl, hslToHex, mintPlotlyTemplate, sampleTypeMarker, time_exports as time, useConcentrationUnits, useProtocolTemplates, useRackEditor, useReagentSeries, useSampleGroups, useScheduleDrag, useSequenceUtils };
@@ -1,8 +1,8 @@
1
- import { a as BaseButton_default, i as useEventListener, o as __exportAll, t as useDropdownState } from "./useDropdownState-8yWMu-7_.js";
2
- import { t as useExperimentStore } from "./experiment-43OJtH7R.js";
1
+ import { a as BaseButton_default, i as useEventListener, o as __exportAll, t as useDropdownState } from "./useDropdownState-uFIz6Yv8.js";
2
+ import { t as useExperimentStore } from "./experiment-DyO54FQB.js";
3
3
  import { Fragment, Teleport, TransitionGroup, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createTextVNode, createVNode, defineComponent, guardReactiveProps, mergeProps, nextTick, normalizeClass, normalizeProps, normalizeStyle, onBeforeUnmount, onScopeDispose, openBlock, provide, ref, renderList, renderSlot, toDisplayString, toValue, unref, useAttrs, useId, useSlots, useTemplateRef, vModelText, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
4
4
  import { Check, ChevronDown, ChevronsUpDown, X } from "lucide-vue-next";
5
- import { computePosition, flip, offset, shift } from "@floating-ui/dom";
5
+ import { autoUpdate, computePosition, flip, hide, offset, shift, size } from "@floating-ui/dom";
6
6
  //#region src/components/BaseInput.vue?vue&type=script&setup=true&lang.ts
7
7
  var _hoisted_1$12 = [
8
8
  "value",
@@ -207,6 +207,84 @@ function findOptionByDomValue(options, value) {
207
207
  return options.find((option) => String(option.value) === value);
208
208
  }
209
209
  //#endregion
210
+ //#region src/composables/useFloatingPanel.ts
211
+ /**
212
+ * Places `floating` next to `reference` with fixed positioning (offset, flip,
213
+ * shift, size, hide). A fixed panel escapes the `overflow` of its ancestors (a
214
+ * modal body) unless one of them has a transform, so it can stay in the DOM right
215
+ * after its trigger: Tab order, focus traps and outside-click checks are those of
216
+ * an in-place panel. The size middleware publishes the free height as
217
+ * `--mint-floating-available-height`; a panel whose list scrolls caps its
218
+ * `max-height` with it.
219
+ */
220
+ function useFloatingPanel(reference, floating, open, options = {}) {
221
+ const style = ref({
222
+ position: "fixed",
223
+ left: "0px",
224
+ top: "0px"
225
+ });
226
+ const placement = ref(toValue(options.placement) ?? "bottom-start");
227
+ async function update() {
228
+ const referenceEl = toValue(reference);
229
+ const floatingEl = floating.value;
230
+ if (!referenceEl || !floatingEl) return;
231
+ const result = await computePosition(referenceEl, floatingEl, {
232
+ placement: toValue(options.placement) ?? "bottom-start",
233
+ strategy: "fixed",
234
+ middleware: [
235
+ offset(options.offset ?? 4),
236
+ flip(),
237
+ shift({ padding: 8 }),
238
+ size({
239
+ padding: 8,
240
+ apply({ availableHeight, rects, elements }) {
241
+ const target = elements.floating.style;
242
+ target.setProperty("--mint-floating-available-height", `${Math.max(0, availableHeight)}px`);
243
+ if (options.matchWidth) {
244
+ target.minWidth = `${rects.reference.width}px`;
245
+ target.maxWidth = "28rem";
246
+ }
247
+ }
248
+ }),
249
+ hide()
250
+ ]
251
+ });
252
+ const next = {
253
+ position: "fixed",
254
+ left: `${result.x}px`,
255
+ top: `${result.y}px`
256
+ };
257
+ if (result.middlewareData.hide?.referenceHidden) next.visibility = "hidden";
258
+ const current = style.value;
259
+ if (current.left !== next.left || current.top !== next.top || current.visibility !== next.visibility) style.value = next;
260
+ placement.value = result.placement;
261
+ }
262
+ let stop;
263
+ function release() {
264
+ stop?.();
265
+ stop = void 0;
266
+ }
267
+ watch([
268
+ open,
269
+ () => toValue(reference),
270
+ floating
271
+ ], ([isOpen, referenceEl, floatingEl]) => {
272
+ release();
273
+ if (!isOpen || !referenceEl || !floatingEl) return;
274
+ if (options.follow ?? true) stop = autoUpdate(referenceEl, floatingEl, () => void update());
275
+ else update();
276
+ }, {
277
+ flush: "post",
278
+ immediate: true
279
+ });
280
+ onScopeDispose(release);
281
+ return {
282
+ style,
283
+ placement,
284
+ update
285
+ };
286
+ }
287
+ //#endregion
210
288
  //#region src/composables/useSelectionLimit.ts
211
289
  /** Shared cap logic for chip, tag, and multi-select controls. */
212
290
  function useSelectionLimit(options) {
@@ -342,21 +420,17 @@ var _hoisted_4$8 = {
342
420
  key: 0,
343
421
  class: "mint-multi-select__placeholder"
344
422
  };
345
- var _hoisted_5$8 = {
346
- key: 0,
347
- class: "mint-popover mint-searchable-select__panel"
348
- };
349
- var _hoisted_6$8 = { class: "mint-searchable-select__search-wrap" };
350
- var _hoisted_7$7 = ["aria-expanded", "aria-activedescendant"];
351
- var _hoisted_8$3 = [
423
+ var _hoisted_5$8 = { class: "mint-searchable-select__search-wrap" };
424
+ var _hoisted_6$8 = ["aria-expanded", "aria-activedescendant"];
425
+ var _hoisted_7$7 = [
352
426
  "id",
353
427
  "aria-selected",
354
428
  "aria-disabled",
355
429
  "onMouseenter",
356
430
  "onClick"
357
431
  ];
358
- var _hoisted_9$3 = { class: "mint-menu-item__label" };
359
- var _hoisted_10$3 = {
432
+ var _hoisted_8$3 = { class: "mint-menu-item__label" };
433
+ var _hoisted_9$3 = {
360
434
  key: 0,
361
435
  class: "mint-searchable-select__empty"
362
436
  };
@@ -396,6 +470,7 @@ var SelectMultipleInternal_default = /* @__PURE__ */ defineComponent({
396
470
  const root = ref(null);
397
471
  const field = ref(null);
398
472
  const search = ref(null);
473
+ const panel = ref(null);
399
474
  const open = ref(false);
400
475
  const query = ref("");
401
476
  const activeIndex = ref(-1);
@@ -468,6 +543,7 @@ var SelectMultipleInternal_default = /* @__PURE__ */ defineComponent({
468
543
  else return;
469
544
  event.preventDefault();
470
545
  }
546
+ const { style: panelStyle } = useFloatingPanel(field, panel, open, { matchWidth: true });
471
547
  watch(visibleOptions, (options) => {
472
548
  activeIndex.value = options.length > 0 ? 0 : -1;
473
549
  });
@@ -527,7 +603,13 @@ var SelectMultipleInternal_default = /* @__PURE__ */ defineComponent({
527
603
  class: "mint-multi-select__icon",
528
604
  size: 14,
529
605
  "aria-hidden": "true"
530
- })], 16, _hoisted_1$11), open.value ? (openBlock(), createElementBlock("div", _hoisted_5$8, [createElementVNode("div", _hoisted_6$8, [_cache[4] || (_cache[4] = createElementVNode("svg", {
606
+ })], 16, _hoisted_1$11), open.value ? (openBlock(), createElementBlock("div", {
607
+ key: 0,
608
+ ref_key: "panel",
609
+ ref: panel,
610
+ class: "mint-popover mint-searchable-select__panel",
611
+ style: normalizeStyle(unref(panelStyle))
612
+ }, [createElementVNode("div", _hoisted_5$8, [_cache[4] || (_cache[4] = createElementVNode("svg", {
531
613
  viewBox: "0 0 20 20",
532
614
  fill: "none",
533
615
  stroke: "currentColor",
@@ -550,7 +632,7 @@ var SelectMultipleInternal_default = /* @__PURE__ */ defineComponent({
550
632
  "aria-activedescendant": activeDescendant.value,
551
633
  "aria-autocomplete": "list",
552
634
  onKeydown: handleSearchKeydown
553
- }, null, 40, _hoisted_7$7), [[vModelText, query.value]])]), createElementVNode("ul", {
635
+ }, null, 40, _hoisted_6$8), [[vModelText, query.value]])]), createElementVNode("ul", {
554
636
  id: listboxId,
555
637
  class: "mint-searchable-select__list",
556
638
  role: "listbox",
@@ -573,8 +655,8 @@ var SelectMultipleInternal_default = /* @__PURE__ */ defineComponent({
573
655
  key: 0,
574
656
  size: 10,
575
657
  "stroke-width": 3.5
576
- })) : createCommentVNode("", true)], 2), createElementVNode("span", _hoisted_9$3, toDisplayString(option.label), 1)], 42, _hoisted_8$3);
577
- }), 128)), visibleOptions.value.length === 0 ? (openBlock(), createElementBlock("li", _hoisted_10$3, "No matching options")) : createCommentVNode("", true)])])) : createCommentVNode("", true)], 38);
658
+ })) : createCommentVNode("", true)], 2), createElementVNode("span", _hoisted_8$3, toDisplayString(option.label), 1)], 42, _hoisted_7$7);
659
+ }), 128)), visibleOptions.value.length === 0 ? (openBlock(), createElementBlock("li", _hoisted_9$3, "No matching options")) : createCommentVNode("", true)])], 4)) : createCommentVNode("", true)], 38);
578
660
  };
579
661
  }
580
662
  });
@@ -587,39 +669,35 @@ var _hoisted_1$10 = [
587
669
  "aria-invalid",
588
670
  "aria-expanded"
589
671
  ];
590
- var _hoisted_2$10 = {
591
- key: 0,
592
- class: "mint-popover mint-searchable-select__panel"
593
- };
594
- var _hoisted_3$10 = { class: "mint-searchable-select__search-wrap" };
595
- var _hoisted_4$7 = [
672
+ var _hoisted_2$10 = { class: "mint-searchable-select__search-wrap" };
673
+ var _hoisted_3$10 = [
596
674
  "placeholder",
597
675
  "aria-label",
598
676
  "aria-expanded",
599
677
  "aria-activedescendant"
600
678
  ];
601
- var _hoisted_5$7 = [
679
+ var _hoisted_4$7 = [
602
680
  "id",
603
681
  "aria-selected",
604
682
  "aria-disabled",
605
683
  "onMouseenter",
606
684
  "onClick"
607
685
  ];
608
- var _hoisted_6$7 = { class: "mint-menu-item__text mint-searchable-select__option-text" };
609
- var _hoisted_7$6 = { class: "mint-menu-item__label mint-searchable-select__option-label" };
610
- var _hoisted_8$2 = {
686
+ var _hoisted_5$7 = { class: "mint-menu-item__text mint-searchable-select__option-text" };
687
+ var _hoisted_6$7 = { class: "mint-menu-item__label mint-searchable-select__option-label" };
688
+ var _hoisted_7$6 = {
611
689
  key: 0,
612
690
  class: "mint-menu-item__description mint-searchable-select__option-description"
613
691
  };
614
- var _hoisted_9$2 = {
692
+ var _hoisted_8$2 = {
615
693
  key: 0,
616
694
  class: "mint-menu-item__meta mint-searchable-select__option-meta"
617
695
  };
618
- var _hoisted_10$2 = {
696
+ var _hoisted_9$2 = {
619
697
  key: 0,
620
698
  class: "mint-searchable-select__empty"
621
699
  };
622
- var _hoisted_11$2 = {
700
+ var _hoisted_10$2 = {
623
701
  key: 0,
624
702
  class: "mint-searchable-select__footer"
625
703
  };
@@ -661,6 +739,7 @@ var SelectSearchableInternal_default = /* @__PURE__ */ defineComponent({
661
739
  const root = ref(null);
662
740
  const trigger = ref(null);
663
741
  const search = ref(null);
742
+ const panel = ref(null);
664
743
  const open = ref(false);
665
744
  const query = ref("");
666
745
  const activeIndex = ref(-1);
@@ -736,6 +815,7 @@ var SelectSearchableInternal_default = /* @__PURE__ */ defineComponent({
736
815
  if (event.key === "ArrowUp") moveActive(-1);
737
816
  });
738
817
  }
818
+ const { style: panelStyle } = useFloatingPanel(trigger, panel, open, { matchWidth: true });
739
819
  watch(visibleOptions, (options) => {
740
820
  activeIndex.value = firstEnabledIndex(options);
741
821
  });
@@ -774,8 +854,14 @@ var SelectSearchableInternal_default = /* @__PURE__ */ defineComponent({
774
854
  }), [createElementVNode("span", { class: normalizeClass(["mint-searchable-select__value", { "mint-searchable-select__value--placeholder": !selectedOption.value }]) }, toDisplayString(selectedOption.value?.label ?? __props.placeholder), 3), createVNode(unref(ChevronsUpDown), {
775
855
  size: 14,
776
856
  "aria-hidden": "true"
777
- })], 16, _hoisted_1$10), open.value ? (openBlock(), createElementBlock("div", _hoisted_2$10, [
778
- createElementVNode("div", _hoisted_3$10, [_cache[4] || (_cache[4] = createElementVNode("svg", {
857
+ })], 16, _hoisted_1$10), open.value ? (openBlock(), createElementBlock("div", {
858
+ key: 0,
859
+ ref_key: "panel",
860
+ ref: panel,
861
+ class: "mint-popover mint-searchable-select__panel",
862
+ style: normalizeStyle(unref(panelStyle))
863
+ }, [
864
+ createElementVNode("div", _hoisted_2$10, [_cache[4] || (_cache[4] = createElementVNode("svg", {
779
865
  viewBox: "0 0 20 20",
780
866
  fill: "none",
781
867
  stroke: "currentColor",
@@ -798,7 +884,7 @@ var SelectSearchableInternal_default = /* @__PURE__ */ defineComponent({
798
884
  "aria-activedescendant": activeDescendant.value,
799
885
  "aria-autocomplete": "list",
800
886
  onKeydown: handleSearchKeydown
801
- }, null, 40, _hoisted_4$7), [[vModelText, query.value]])]),
887
+ }, null, 40, _hoisted_3$10), [[vModelText, query.value]])]),
802
888
  createElementVNode("ul", {
803
889
  id: listboxId,
804
890
  class: "mint-searchable-select__list",
@@ -823,8 +909,8 @@ var SelectSearchableInternal_default = /* @__PURE__ */ defineComponent({
823
909
  selected: __props.modelValue === option.value,
824
910
  active: activeIndex.value === index
825
911
  }, () => [
826
- createElementVNode("span", _hoisted_6$7, [createElementVNode("span", _hoisted_7$6, toDisplayString(option.label), 1), (option.disabled ? option.disabledReason || option.description : option.description) ? (openBlock(), createElementBlock("span", _hoisted_8$2, toDisplayString(option.disabled ? option.disabledReason || option.description : option.description), 1)) : createCommentVNode("", true)]),
827
- option.meta ? (openBlock(), createElementBlock("span", _hoisted_9$2, toDisplayString(option.meta), 1)) : createCommentVNode("", true),
912
+ createElementVNode("span", _hoisted_5$7, [createElementVNode("span", _hoisted_6$7, toDisplayString(option.label), 1), (option.disabled ? option.disabledReason || option.description : option.description) ? (openBlock(), createElementBlock("span", _hoisted_7$6, toDisplayString(option.disabled ? option.disabledReason || option.description : option.description), 1)) : createCommentVNode("", true)]),
913
+ option.meta ? (openBlock(), createElementBlock("span", _hoisted_8$2, toDisplayString(option.meta), 1)) : createCommentVNode("", true),
828
914
  _cache[5] || (_cache[5] = createElementVNode("svg", {
829
915
  class: "mint-menu-item__check mint-searchable-select__check",
830
916
  viewBox: "0 0 20 20",
@@ -837,10 +923,10 @@ var SelectSearchableInternal_default = /* @__PURE__ */ defineComponent({
837
923
  "stroke-width": "2",
838
924
  d: "m5 10 3 3 7-7"
839
925
  })], -1))
840
- ])], 42, _hoisted_5$7);
841
- }), 128)), visibleOptions.value.length === 0 ? (openBlock(), createElementBlock("li", _hoisted_10$2, toDisplayString(__props.noResultsText), 1)) : createCommentVNode("", true)]),
842
- _ctx.$slots.footer ? (openBlock(), createElementBlock("div", _hoisted_11$2, [renderSlot(_ctx.$slots, "footer")])) : createCommentVNode("", true)
843
- ])) : createCommentVNode("", true)], 38);
926
+ ])], 42, _hoisted_4$7);
927
+ }), 128)), visibleOptions.value.length === 0 ? (openBlock(), createElementBlock("li", _hoisted_9$2, toDisplayString(__props.noResultsText), 1)) : createCommentVNode("", true)]),
928
+ _ctx.$slots.footer ? (openBlock(), createElementBlock("div", _hoisted_10$2, [renderSlot(_ctx.$slots, "footer")])) : createCommentVNode("", true)
929
+ ], 4)) : createCommentVNode("", true)], 38);
844
930
  };
845
931
  }
846
932
  });
@@ -1037,41 +1123,16 @@ var Tooltip_default = /* @__PURE__ */ defineComponent({
1037
1123
  const props = __props;
1038
1124
  const tooltipId = `mint-tooltip-${Math.random().toString(36).slice(2, 9)}`;
1039
1125
  const visible = ref(false);
1040
- const actualPlacement = ref(props.position);
1041
1126
  const triggerRef = ref(null);
1042
1127
  const contentRef = ref(null);
1043
- const coords = ref({
1044
- top: "0px",
1045
- left: "0px"
1046
- });
1047
1128
  let timeoutId;
1048
- async function updatePosition() {
1049
- if (!triggerRef.value || !contentRef.value) return;
1050
- const { x, y, placement } = await computePosition(triggerRef.value, contentRef.value, {
1051
- placement: props.position,
1052
- middleware: [
1053
- offset(6),
1054
- flip(),
1055
- shift({ padding: 8 })
1056
- ]
1057
- });
1058
- coords.value = {
1059
- top: `${y}px`,
1060
- left: `${x}px`
1061
- };
1062
- actualPlacement.value = placement;
1063
- }
1064
- useEventListener(() => window, "scroll", updatePosition, {
1065
- passive: true,
1066
- capture: true,
1067
- enabled: visible
1129
+ const { style: coords, placement: actualPlacement } = useFloatingPanel(triggerRef, contentRef, visible, {
1130
+ placement: () => props.position,
1131
+ offset: 6
1068
1132
  });
1069
- useEventListener(() => window, "resize", updatePosition, { enabled: visible });
1070
- async function show() {
1071
- timeoutId = setTimeout(async () => {
1133
+ function show() {
1134
+ timeoutId = setTimeout(() => {
1072
1135
  visible.value = true;
1073
- await nextTick();
1074
- await updatePosition();
1075
1136
  }, props.delay);
1076
1137
  }
1077
1138
  function hide() {
@@ -1103,12 +1164,11 @@ var Tooltip_default = /* @__PURE__ */ defineComponent({
1103
1164
  ref: contentRef,
1104
1165
  class: normalizeClass([
1105
1166
  "mint-tooltip__content",
1106
- `mint-tooltip__content--${actualPlacement.value}`,
1167
+ `mint-tooltip__content--${unref(actualPlacement)}`,
1107
1168
  __props.maxWidth ? "mint-tooltip__content--multiline" : ""
1108
1169
  ]),
1109
1170
  style: normalizeStyle({
1110
- top: coords.value.top,
1111
- left: coords.value.left,
1171
+ ...unref(coords),
1112
1172
  maxWidth: resolvedMaxWidth(__props.maxWidth)
1113
1173
  }),
1114
1174
  role: "tooltip"
@@ -2493,6 +2553,66 @@ function useAppExperiment(options = {}) {
2493
2553
  };
2494
2554
  }
2495
2555
  //#endregion
2556
+ //#region src/jobs.ts
2557
+ var ACTIVE_JOB_STATUSES = /* @__PURE__ */ new Set([
2558
+ "awaiting_input",
2559
+ "queued",
2560
+ "running"
2561
+ ]);
2562
+ var TERMINAL_JOB_STATUSES = /* @__PURE__ */ new Set([
2563
+ "completed",
2564
+ "failed",
2565
+ "cancelled"
2566
+ ]);
2567
+ /** Resolve action support while retaining one-cycle legacy status inference. */
2568
+ function resolveJobCapabilities(job) {
2569
+ const legacyCanCancel = job.status === "queued" || job.status === "running";
2570
+ const legacyCanDelete = TERMINAL_JOB_STATUSES.has(job.status);
2571
+ return {
2572
+ can_cancel: typeof job.can_cancel === "boolean" ? job.can_cancel : legacyCanCancel,
2573
+ can_delete: typeof job.can_delete === "boolean" ? job.can_delete : legacyCanDelete
2574
+ };
2575
+ }
2576
+ /** Clamp invalid or out-of-range progress values for safe display. */
2577
+ function normalizeJobPercent(value) {
2578
+ if (!Number.isFinite(value)) return 0;
2579
+ return Math.min(100, Math.max(0, value));
2580
+ }
2581
+ /** Create a detached canonical state without changing the transport input. */
2582
+ function normalizeJobState(job) {
2583
+ const capabilities = resolveJobCapabilities(job);
2584
+ return {
2585
+ ...job,
2586
+ definition_id: job.definition_id ?? (typeof job.metadata.definition_id === "string" ? job.metadata.definition_id : null),
2587
+ result_status: job.result_status ?? (job.status === "completed" && job.metadata.has_result === true ? "available" : "none"),
2588
+ result_expires_at: job.result_expires_at ?? null,
2589
+ progress: {
2590
+ ...job.progress,
2591
+ percent: normalizeJobPercent(job.progress.percent)
2592
+ },
2593
+ warnings: [...job.warnings],
2594
+ folders: [...job.folders],
2595
+ metadata: { ...job.metadata },
2596
+ ...capabilities
2597
+ };
2598
+ }
2599
+ function isActiveJobStatus(status) {
2600
+ return ACTIVE_JOB_STATUSES.has(status);
2601
+ }
2602
+ function isTerminalJobStatus(status) {
2603
+ return TERMINAL_JOB_STATUSES.has(status);
2604
+ }
2605
+ function jobStatusLabel(status) {
2606
+ return {
2607
+ awaiting_input: "Waiting for input",
2608
+ queued: "Queued",
2609
+ running: "Running",
2610
+ completed: "Completed",
2611
+ failed: "Failed",
2612
+ cancelled: "Cancelled"
2613
+ }[status];
2614
+ }
2615
+ //#endregion
2496
2616
  //#region src/utils/pluginSecrets.ts
2497
2617
  var pluginSecrets_exports = /* @__PURE__ */ __exportAll({
2498
2618
  FORMAT_KEY: () => FORMAT_KEY,
@@ -2959,66 +3079,6 @@ var TagsInput_default = /* @__PURE__ */ defineComponent({
2959
3079
  }
2960
3080
  });
2961
3081
  //#endregion
2962
- //#region src/jobs.ts
2963
- var ACTIVE_JOB_STATUSES = /* @__PURE__ */ new Set([
2964
- "awaiting_input",
2965
- "queued",
2966
- "running"
2967
- ]);
2968
- var TERMINAL_JOB_STATUSES = /* @__PURE__ */ new Set([
2969
- "completed",
2970
- "failed",
2971
- "cancelled"
2972
- ]);
2973
- /** Resolve action support while retaining one-cycle legacy status inference. */
2974
- function resolveJobCapabilities(job) {
2975
- const legacyCanCancel = job.status === "queued" || job.status === "running";
2976
- const legacyCanDelete = TERMINAL_JOB_STATUSES.has(job.status);
2977
- return {
2978
- can_cancel: typeof job.can_cancel === "boolean" ? job.can_cancel : legacyCanCancel,
2979
- can_delete: typeof job.can_delete === "boolean" ? job.can_delete : legacyCanDelete
2980
- };
2981
- }
2982
- /** Clamp invalid or out-of-range progress values for safe display. */
2983
- function normalizeJobPercent(value) {
2984
- if (!Number.isFinite(value)) return 0;
2985
- return Math.min(100, Math.max(0, value));
2986
- }
2987
- /** Create a detached canonical state without changing the transport input. */
2988
- function normalizeJobState(job) {
2989
- const capabilities = resolveJobCapabilities(job);
2990
- return {
2991
- ...job,
2992
- definition_id: job.definition_id ?? (typeof job.metadata.definition_id === "string" ? job.metadata.definition_id : null),
2993
- result_status: job.result_status ?? (job.status === "completed" && job.metadata.has_result === true ? "available" : "none"),
2994
- result_expires_at: job.result_expires_at ?? null,
2995
- progress: {
2996
- ...job.progress,
2997
- percent: normalizeJobPercent(job.progress.percent)
2998
- },
2999
- warnings: [...job.warnings],
3000
- folders: [...job.folders],
3001
- metadata: { ...job.metadata },
3002
- ...capabilities
3003
- };
3004
- }
3005
- function isActiveJobStatus(status) {
3006
- return ACTIVE_JOB_STATUSES.has(status);
3007
- }
3008
- function isTerminalJobStatus(status) {
3009
- return TERMINAL_JOB_STATUSES.has(status);
3010
- }
3011
- function jobStatusLabel(status) {
3012
- return {
3013
- awaiting_input: "Waiting for input",
3014
- queued: "Queued",
3015
- running: "Running",
3016
- completed: "Completed",
3017
- failed: "Failed",
3018
- cancelled: "Cancelled"
3019
- }[status];
3020
- }
3021
- //#endregion
3022
3082
  //#region src/composables/platformContextHelpers.ts
3023
3083
  function getInjectedPlatformContext() {
3024
3084
  if (typeof window === "undefined") return void 0;
@@ -3263,6 +3323,6 @@ function isRecord(value) {
3263
3323
  return typeof value === "object" && value !== null && !Array.isArray(value);
3264
3324
  }
3265
3325
  //#endregion
3266
- export { formatRelativeTime as A, Tooltip_default as B, formatExperimentDate as C, compareTime as D, useMenuKeyboard as E, toMinutes as F, BaseInput_default as G, useListSelection as H, FormField_default as I, EmptyState_default as L, formatTimeSlot as M, generateTimeSlots as N, durationMinutes as O, time_exports as P, useRovingFocus as R, experimentIdFromRoute as S, FileUploader_default as T, useSelectionLimit as U, BaseSelect_default as V, normalizeOptionInput as W, APP_EXPERIMENT_KEY as _, parseExperimentId as a, SORT_OPTIONS as b, isTerminalJobStatus as c, normalizeJobState as d, resolveJobCapabilities as f, pluginSecrets_exports as g, FORMAT_KEY as h, getInjectedPlatformContext as i, formatTime as j, findNearestTimeSlotIndex as k, jobStatusLabel as l, SecretInput_default as m, ResourcePickerListInternal_default as n, resolveCurrentPluginId as o, TagsInput_default as p, Skeleton_default as r, isActiveJobStatus as s, isRecord as t, normalizeJobPercent as u, useAppExperiment as v, resolveExperimentCode as w, datePresetToISO as x, DATE_PRESET_OPTIONS as y, BaseCheckbox_default as z };
3326
+ export { formatRelativeTime as A, Tooltip_default as B, formatExperimentDate as C, compareTime as D, useMenuKeyboard as E, toMinutes as F, normalizeOptionInput as G, useListSelection as H, FormField_default as I, BaseInput_default as K, EmptyState_default as L, formatTimeSlot as M, generateTimeSlots as N, durationMinutes as O, time_exports as P, useRovingFocus as R, experimentIdFromRoute as S, FileUploader_default as T, useSelectionLimit as U, BaseSelect_default as V, useFloatingPanel as W, APP_EXPERIMENT_KEY as _, parseExperimentId as a, SORT_OPTIONS as b, SecretInput_default as c, isActiveJobStatus as d, isTerminalJobStatus as f, resolveJobCapabilities as g, normalizeJobState as h, getInjectedPlatformContext as i, formatTime as j, findNearestTimeSlotIndex as k, FORMAT_KEY as l, normalizeJobPercent as m, ResourcePickerListInternal_default as n, resolveCurrentPluginId as o, jobStatusLabel as p, Skeleton_default as r, TagsInput_default as s, isRecord as t, pluginSecrets_exports as u, useAppExperiment as v, resolveExperimentCode as w, datePresetToISO as x, DATE_PRESET_OPTIONS as y, BaseCheckbox_default as z };
3267
3327
 
3268
- //# sourceMappingURL=records-B6gpM_3e.js.map
3328
+ //# sourceMappingURL=records-D4aQXyZu.js.map