@morscherlab/mint-sdk 1.2.0-beta.11 → 1.2.0-beta.13

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 (74) hide show
  1. package/dist/{ExperimentPopover-oL0fg_A0.js → ExperimentPopover-BIZKoRTT.js} +19 -12
  2. package/dist/ExperimentPopover-BIZKoRTT.js.map +1 -0
  3. package/dist/__tests__/components/FileBrowserModal.test.d.ts +1 -0
  4. package/dist/__tests__/components/FilePicker.state.test.d.ts +1 -0
  5. package/dist/__tests__/components/FilePicker.test.d.ts +1 -0
  6. package/dist/__tests__/composables/useFileBrowser.test.d.ts +1 -0
  7. package/dist/__tests__/composables/usePlatformFilePickerAdapter.test.d.ts +1 -0
  8. package/dist/components/FileBrowserModal.vue.d.ts +99 -0
  9. package/dist/components/FilePicker.vue.d.ts +32 -0
  10. package/dist/components/fileBrowserPresentation.d.ts +10 -0
  11. package/dist/components/index.d.ts +3 -0
  12. package/dist/components/index.js +3 -3
  13. package/dist/components/internal/FileBrowserDialogInternal.vue.d.ts +34 -0
  14. package/dist/components/internal/FileBrowserListingInternal.vue.d.ts +25 -0
  15. package/dist/components/internal/FileBrowserToolbarInternal.vue.d.ts +26 -0
  16. package/dist/components/internal/FilePickerPreviewInternal.vue.d.ts +18 -0
  17. package/dist/components/internal/FilePickerTreeInternal.vue.d.ts +31 -0
  18. package/dist/{components-CgAUzF8F.js → components-DuQRC810.js} +3727 -1521
  19. package/dist/components-DuQRC810.js.map +1 -0
  20. package/dist/composables/filePicker/localFiles.d.ts +3 -0
  21. package/dist/composables/filePicker/usePickerNavigation.d.ts +95 -0
  22. package/dist/composables/filePicker/usePickerSelection.d.ts +31 -0
  23. package/dist/composables/filePicker/validation.d.ts +5 -0
  24. package/dist/composables/index.d.ts +2 -0
  25. package/dist/composables/index.js +3 -3
  26. package/dist/composables/useFileBrowser.d.ts +55 -0
  27. package/dist/composables/useFilePicker.d.ts +190 -0
  28. package/dist/composables/usePlatformFilePickerAdapter.d.ts +11 -0
  29. package/dist/{composables-B_pia3hO.js → composables-hY2Q2xPI.js} +289 -3
  30. package/dist/composables-hY2Q2xPI.js.map +1 -0
  31. package/dist/index.js +5 -5
  32. package/dist/install.js +1 -1
  33. package/dist/styles.css +2232 -1259
  34. package/dist/types/fileBrowserTypes.d.ts +77 -0
  35. package/dist/types/filePicker.d.ts +69 -0
  36. package/dist/types/index.d.ts +2 -0
  37. package/dist/{useProtocolTemplates-BmX_iVBR.js → validation-nBbSn1TI.js} +46 -2
  38. package/dist/validation-nBbSn1TI.js.map +1 -0
  39. package/package.json +1 -1
  40. package/src/__tests__/components/ExperimentPopover.test.ts +30 -0
  41. package/src/__tests__/components/FileBrowserModal.test.ts +460 -0
  42. package/src/__tests__/components/FilePicker.state.test.ts +160 -0
  43. package/src/__tests__/components/FilePicker.test.ts +328 -0
  44. package/src/__tests__/composables/useFileBrowser.test.ts +305 -0
  45. package/src/__tests__/composables/usePlatformFilePickerAdapter.test.ts +67 -0
  46. package/src/components/ExperimentPopover.vue +10 -2
  47. package/src/components/FileBrowserModal.story.vue +203 -0
  48. package/src/components/FileBrowserModal.vue +384 -0
  49. package/src/components/FilePicker.vue +301 -0
  50. package/src/components/fileBrowserPresentation.ts +39 -0
  51. package/src/components/index.ts +4 -0
  52. package/src/components/internal/FileBrowserDialogInternal.vue +75 -0
  53. package/src/components/internal/FileBrowserListingInternal.vue +197 -0
  54. package/src/components/internal/FileBrowserToolbarInternal.vue +136 -0
  55. package/src/components/internal/FilePickerPreviewInternal.vue +100 -0
  56. package/src/components/internal/FilePickerTreeInternal.vue +238 -0
  57. package/src/composables/filePicker/localFiles.ts +55 -0
  58. package/src/composables/filePicker/usePickerNavigation.ts +199 -0
  59. package/src/composables/filePicker/usePickerSelection.ts +242 -0
  60. package/src/composables/filePicker/validation.ts +40 -0
  61. package/src/composables/index.ts +7 -0
  62. package/src/composables/useFileBrowser.ts +314 -0
  63. package/src/composables/useFilePicker.ts +347 -0
  64. package/src/composables/usePlatformFilePickerAdapter.ts +104 -0
  65. package/src/styles/components/file-browser-modal.css +489 -0
  66. package/src/styles/components/file-picker.css +501 -0
  67. package/src/styles/index.css +3 -0
  68. package/src/types/fileBrowserTypes.ts +85 -0
  69. package/src/types/filePicker.ts +65 -0
  70. package/src/types/index.ts +14 -0
  71. package/dist/ExperimentPopover-oL0fg_A0.js.map +0 -1
  72. package/dist/components-CgAUzF8F.js.map +0 -1
  73. package/dist/composables-B_pia3hO.js.map +0 -1
  74. package/dist/useProtocolTemplates-BmX_iVBR.js.map +0 -1
@@ -249,6 +249,13 @@ var ExperimentPopover_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
249
249
  const { isOpen, rootRef: popoverRef, triggerRef, close, toggle } = useDropdownState({ closeOnEscape: false });
250
250
  const showSuccess = ref(false);
251
251
  const showConfirm = ref(false);
252
+ function handleTriggerClick() {
253
+ if (!hasExperiment.value && !isUnresolved.value) {
254
+ handleSelect();
255
+ return;
256
+ }
257
+ toggle();
258
+ }
252
259
  function handleSelect() {
253
260
  emit("select");
254
261
  close();
@@ -301,9 +308,9 @@ var ExperimentPopover_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
301
308
  "aria-label": isUnresolved.value ? triggerLabel.value : void 0,
302
309
  "aria-busy": __props.isResolving || void 0,
303
310
  "aria-expanded": unref(isOpen),
304
- onClick: _cache[0] || (_cache[0] = withModifiers((...args) => unref(toggle) && unref(toggle)(...args), ["stop"]))
311
+ onClick: withModifiers(handleTriggerClick, ["stop"])
305
312
  }, [
306
- _cache[2] || (_cache[2] = createElementVNode("svg", {
313
+ _cache[1] || (_cache[1] = createElementVNode("svg", {
307
314
  class: "mint-experiment-popover__trigger-icon",
308
315
  "aria-hidden": "true",
309
316
  fill: "none",
@@ -316,7 +323,7 @@ var ExperimentPopover_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
316
323
  d: "M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z"
317
324
  })], -1)),
318
325
  __props.isResolving ? (openBlock(), createElementBlock("span", _hoisted_2)) : __props.error ? (openBlock(), createElementBlock("span", _hoisted_3, "Experiment unavailable")) : __props.experimentName ? (openBlock(), createElementBlock("span", _hoisted_4, toDisplayString(__props.experimentName), 1)) : __props.experimentCode ? (openBlock(), createElementBlock("span", _hoisted_5, toDisplayString(__props.experimentCode), 1)) : (openBlock(), createElementBlock("span", _hoisted_6, "No experiment")),
319
- _cache[3] || (_cache[3] = createElementVNode("svg", {
326
+ _cache[2] || (_cache[2] = createElementVNode("svg", {
320
327
  class: "mint-experiment-popover__trigger-chevron",
321
328
  "aria-hidden": "true",
322
329
  viewBox: "0 0 24 24",
@@ -339,18 +346,18 @@ var ExperimentPopover_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
339
346
  title: __props.saveDisabled && __props.saveDisabledMessage ? __props.saveDisabledMessage : showSuccess.value && __props.saveSuccessMessage ? __props.saveSuccessMessage : "Save to Experiment",
340
347
  "aria-label": "Save to experiment",
341
348
  onClick: withModifiers(handleSave, ["stop"])
342
- }, [__props.saveLoading ? (openBlock(), createElementBlock("span", _hoisted_8)) : showSuccess.value ? (openBlock(), createElementBlock("svg", _hoisted_9, [..._cache[4] || (_cache[4] = [createElementVNode("path", {
349
+ }, [__props.saveLoading ? (openBlock(), createElementBlock("span", _hoisted_8)) : showSuccess.value ? (openBlock(), createElementBlock("svg", _hoisted_9, [..._cache[3] || (_cache[3] = [createElementVNode("path", {
343
350
  "stroke-linecap": "round",
344
351
  "stroke-linejoin": "round",
345
352
  "stroke-width": "2.5",
346
353
  d: "M5 13l4 4L19 7"
347
- }, null, -1)])])) : (openBlock(), createElementBlock("svg", _hoisted_10, [..._cache[5] || (_cache[5] = [createElementVNode("path", {
354
+ }, null, -1)])])) : (openBlock(), createElementBlock("svg", _hoisted_10, [..._cache[4] || (_cache[4] = [createElementVNode("path", {
348
355
  "stroke-linecap": "round",
349
356
  "stroke-linejoin": "round",
350
357
  "stroke-width": "2",
351
358
  d: "M8 7H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4"
352
359
  }, null, -1)])]))], 10, _hoisted_7)) : createCommentVNode("", true)], 2),
353
- unref(isOpen) ? (openBlock(), createElementBlock("div", _hoisted_11, [createElementVNode("div", _hoisted_12, [_cache[6] || (_cache[6] = createElementVNode("div", { class: "mint-experiment-popover__title" }, "Experiment", -1)), createElementVNode("div", _hoisted_13, toDisplayString(panelSubtitle.value), 1)]), __props.isResolving ? (openBlock(), createElementBlock("div", _hoisted_14, [_cache[7] || (_cache[7] = createStaticVNode("<div class=\"mint-experiment-popover__card\" aria-busy=\"true\"><div class=\"mint-experiment-popover__card-icon\"><svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.75\" d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z\"></path></svg></div><div class=\"mint-experiment-popover__card-info\"><span class=\"mint-experiment-popover__skeleton-line mint-experiment-popover__skeleton-line--code\"></span><span class=\"mint-experiment-popover__skeleton-line mint-experiment-popover__skeleton-line--name\"></span><span class=\"mint-experiment-popover__skeleton-line mint-experiment-popover__skeleton-line--status\"></span></div></div>", 1)), createElementVNode("div", _hoisted_15, [createElementVNode("button", {
360
+ unref(isOpen) ? (openBlock(), createElementBlock("div", _hoisted_11, [createElementVNode("div", _hoisted_12, [_cache[5] || (_cache[5] = createElementVNode("div", { class: "mint-experiment-popover__title" }, "Experiment", -1)), createElementVNode("div", _hoisted_13, toDisplayString(panelSubtitle.value), 1)]), __props.isResolving ? (openBlock(), createElementBlock("div", _hoisted_14, [_cache[6] || (_cache[6] = createStaticVNode("<div class=\"mint-experiment-popover__card\" aria-busy=\"true\"><div class=\"mint-experiment-popover__card-icon\"><svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.75\" d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z\"></path></svg></div><div class=\"mint-experiment-popover__card-info\"><span class=\"mint-experiment-popover__skeleton-line mint-experiment-popover__skeleton-line--code\"></span><span class=\"mint-experiment-popover__skeleton-line mint-experiment-popover__skeleton-line--name\"></span><span class=\"mint-experiment-popover__skeleton-line mint-experiment-popover__skeleton-line--status\"></span></div></div>", 1)), createElementVNode("div", _hoisted_15, [createElementVNode("button", {
354
361
  type: "button",
355
362
  class: "mint-experiment-popover__change-btn",
356
363
  onClick: handleSelect
@@ -359,7 +366,7 @@ var ExperimentPopover_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
359
366
  type: "button",
360
367
  class: "mint-experiment-popover__detach-btn",
361
368
  onClick: handleDetach
362
- }, " Detach ")) : createCommentVNode("", true)])])) : __props.error ? (openBlock(), createElementBlock("div", _hoisted_16, [createElementVNode("div", _hoisted_17, [_cache[9] || (_cache[9] = createElementVNode("div", { class: "mint-experiment-popover__card-icon mint-experiment-popover__card-icon--error" }, [createElementVNode("svg", {
369
+ }, " Detach ")) : createCommentVNode("", true)])])) : __props.error ? (openBlock(), createElementBlock("div", _hoisted_16, [createElementVNode("div", _hoisted_17, [_cache[8] || (_cache[8] = createElementVNode("div", { class: "mint-experiment-popover__card-icon mint-experiment-popover__card-icon--error" }, [createElementVNode("svg", {
363
370
  fill: "none",
364
371
  stroke: "currentColor",
365
372
  viewBox: "0 0 24 24"
@@ -368,7 +375,7 @@ var ExperimentPopover_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
368
375
  "stroke-linejoin": "round",
369
376
  "stroke-width": "1.75",
370
377
  d: "M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z"
371
- })])], -1)), createElementVNode("div", _hoisted_18, [_cache[8] || (_cache[8] = createElementVNode("div", { class: "mint-experiment-popover__card-name" }, "Experiment unavailable", -1)), createElementVNode("div", _hoisted_19, toDisplayString(__props.error), 1)])]), createElementVNode("div", _hoisted_20, [createElementVNode("button", {
378
+ })])], -1)), createElementVNode("div", _hoisted_18, [_cache[7] || (_cache[7] = createElementVNode("div", { class: "mint-experiment-popover__card-name" }, "Experiment unavailable", -1)), createElementVNode("div", _hoisted_19, toDisplayString(__props.error), 1)])]), createElementVNode("div", _hoisted_20, [createElementVNode("button", {
372
379
  type: "button",
373
380
  class: "mint-experiment-popover__change-btn",
374
381
  onClick: handleSelect
@@ -381,7 +388,7 @@ var ExperimentPopover_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
381
388
  type: "button",
382
389
  class: "mint-experiment-popover__select-btn",
383
390
  onClick: handleSelect
384
- }, [..._cache[10] || (_cache[10] = [createElementVNode("svg", {
391
+ }, [..._cache[9] || (_cache[9] = [createElementVNode("svg", {
385
392
  width: "14",
386
393
  height: "14",
387
394
  fill: "none",
@@ -392,7 +399,7 @@ var ExperimentPopover_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
392
399
  "stroke-linejoin": "round",
393
400
  "stroke-width": "2",
394
401
  d: "M12 4v16m8-8H4"
395
- })], -1), createTextVNode(" Select Experiment ", -1)])])])) : (openBlock(), createElementBlock("div", _hoisted_22, [createElementVNode("div", _hoisted_23, [_cache[11] || (_cache[11] = createElementVNode("div", { class: "mint-experiment-popover__card-icon" }, [createElementVNode("svg", {
402
+ })], -1), createTextVNode(" Select Experiment ", -1)])])])) : (openBlock(), createElementBlock("div", _hoisted_22, [createElementVNode("div", _hoisted_23, [_cache[10] || (_cache[10] = createElementVNode("div", { class: "mint-experiment-popover__card-icon" }, [createElementVNode("svg", {
396
403
  fill: "none",
397
404
  stroke: "currentColor",
398
405
  viewBox: "0 0 24 24"
@@ -417,7 +424,7 @@ var ExperimentPopover_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
417
424
  }, " Detach ")) : createCommentVNode("", true)])]))])) : createCommentVNode("", true),
418
425
  createVNode(ConfirmDialog_default, {
419
426
  modelValue: showConfirm.value,
420
- "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => showConfirm.value = $event),
427
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => showConfirm.value = $event),
421
428
  title: __props.confirmTitle ?? "Save to Experiment",
422
429
  message: __props.confirmMessage ?? `Save current data to ${__props.experimentName}?`,
423
430
  variant: "info",
@@ -441,4 +448,4 @@ var ExperimentPopover_default = ExperimentPopover_vue_vue_type_script_setup_true
441
448
  //#endregion
442
449
  export { ExperimentPopover_exports as n, ConfirmDialog_default as r, ExperimentPopover_default as t };
443
450
 
444
- //# sourceMappingURL=ExperimentPopover-oL0fg_A0.js.map
451
+ //# sourceMappingURL=ExperimentPopover-BIZKoRTT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExperimentPopover-BIZKoRTT.js","names":["$slots"],"sources":["../src/components/ConfirmDialog.vue","../src/components/ConfirmDialog.vue","../src/components/ExperimentPopover.vue","../src/components/ExperimentPopover.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/** Confirm/cancel dialog with danger, warning, and info variants; blocks close while loading. */\nimport { computed } from 'vue'\nimport type { ButtonVariant } from '../types'\nimport BaseModal from './BaseModal.vue'\nimport BaseButton from './BaseButton.vue'\n\ninterface Props {\n modelValue: boolean\n title?: string\n subtitle?: string\n message?: string\n variant?: 'danger' | 'warning' | 'info'\n confirmLabel?: string\n cancelLabel?: string\n loading?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n title: 'Confirm',\n variant: 'danger',\n confirmLabel: 'Confirm',\n cancelLabel: 'Cancel',\n loading: false,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n confirm: []\n cancel: []\n}>()\n\nfunction handleCancel() {\n emit('update:modelValue', false)\n emit('cancel')\n}\n\nfunction handleConfirm() {\n emit('confirm')\n}\n\nconst confirmVariant = computed<ButtonVariant>(() => {\n if (props.variant === 'info') return 'primary'\n if (props.variant === 'warning') return 'cta'\n return 'danger'\n})\n</script>\n\n<template>\n <BaseModal\n :model-value=\"modelValue\"\n :title=\"title\"\n :subtitle=\"subtitle\"\n size=\"sm\"\n :closable=\"!loading\"\n :close-on-overlay=\"!loading\"\n :close-on-escape=\"!loading\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n >\n <div class=\"mint-confirm\">\n <!-- Icon is now opt-in via slot. Refresh design keeps the body focused on\n the message; variant intent is carried by the confirm button's color. -->\n <div\n v-if=\"$slots.icon\"\n :class=\"['mint-confirm__icon', `mint-confirm__icon--${variant}`]\"\n >\n <slot name=\"icon\" />\n </div>\n <p v-if=\"message\" class=\"mint-confirm__message\">{{ message }}</p>\n <slot />\n </div>\n\n <template #footer>\n <div class=\"mint-confirm__footer\">\n <BaseButton\n type=\"button\"\n variant=\"secondary\"\n size=\"md\"\n :disabled=\"loading\"\n @click=\"handleCancel\"\n >\n {{ cancelLabel }}\n </BaseButton>\n <BaseButton\n type=\"button\"\n :variant=\"confirmVariant\"\n size=\"md\"\n :loading=\"loading\"\n @click=\"handleConfirm\"\n >\n {{ confirmLabel }}\n </BaseButton>\n </div>\n </template>\n </BaseModal>\n</template>\n","<script setup lang=\"ts\">\n/** Confirm/cancel dialog with danger, warning, and info variants; blocks close while loading. */\nimport { computed } from 'vue'\nimport type { ButtonVariant } from '../types'\nimport BaseModal from './BaseModal.vue'\nimport BaseButton from './BaseButton.vue'\n\ninterface Props {\n modelValue: boolean\n title?: string\n subtitle?: string\n message?: string\n variant?: 'danger' | 'warning' | 'info'\n confirmLabel?: string\n cancelLabel?: string\n loading?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n title: 'Confirm',\n variant: 'danger',\n confirmLabel: 'Confirm',\n cancelLabel: 'Cancel',\n loading: false,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n confirm: []\n cancel: []\n}>()\n\nfunction handleCancel() {\n emit('update:modelValue', false)\n emit('cancel')\n}\n\nfunction handleConfirm() {\n emit('confirm')\n}\n\nconst confirmVariant = computed<ButtonVariant>(() => {\n if (props.variant === 'info') return 'primary'\n if (props.variant === 'warning') return 'cta'\n return 'danger'\n})\n</script>\n\n<template>\n <BaseModal\n :model-value=\"modelValue\"\n :title=\"title\"\n :subtitle=\"subtitle\"\n size=\"sm\"\n :closable=\"!loading\"\n :close-on-overlay=\"!loading\"\n :close-on-escape=\"!loading\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n >\n <div class=\"mint-confirm\">\n <!-- Icon is now opt-in via slot. Refresh design keeps the body focused on\n the message; variant intent is carried by the confirm button's color. -->\n <div\n v-if=\"$slots.icon\"\n :class=\"['mint-confirm__icon', `mint-confirm__icon--${variant}`]\"\n >\n <slot name=\"icon\" />\n </div>\n <p v-if=\"message\" class=\"mint-confirm__message\">{{ message }}</p>\n <slot />\n </div>\n\n <template #footer>\n <div class=\"mint-confirm__footer\">\n <BaseButton\n type=\"button\"\n variant=\"secondary\"\n size=\"md\"\n :disabled=\"loading\"\n @click=\"handleCancel\"\n >\n {{ cancelLabel }}\n </BaseButton>\n <BaseButton\n type=\"button\"\n :variant=\"confirmVariant\"\n size=\"md\"\n :loading=\"loading\"\n @click=\"handleConfirm\"\n >\n {{ confirmLabel }}\n </BaseButton>\n </div>\n </template>\n </BaseModal>\n</template>\n","<script setup lang=\"ts\">\n/** Floating popover showing the active experiment with save, detach, and select actions. */\nimport { ref, computed, watch, onUnmounted } from 'vue'\nimport { useDropdownState } from '../composables/useDropdownState'\nimport { formatExperimentStatus } from '../composables/experiment-utils'\nimport ConfirmDialog from './ConfirmDialog.vue'\n\ninterface Props {\n experimentName?: string\n experimentCode?: string\n experimentStatus?: string\n /** An experiment is bound but the platform has not returned its record yet. */\n isResolving?: boolean\n /** Message explaining why the bound experiment could not be resolved. */\n error?: string\n showSave?: boolean\n showDetach?: boolean\n saveDisabled?: boolean\n saveLoading?: boolean\n saveSuccessMessage?: string\n saveDisabledMessage?: string\n confirmSave?: boolean\n confirmTitle?: string\n confirmMessage?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n isResolving: false,\n showSave: false,\n showDetach: false,\n saveDisabled: false,\n saveLoading: false,\n confirmSave: true,\n})\n\n// An experiment is bound but has no name to show — either still resolving or\n// resolution failed. The id is never substituted: a name may only come from the\n// platform, so these states say what is happening instead of inventing a label.\nconst isUnresolved = computed(() => props.isResolving || !!props.error)\nconst hasExperiment = computed(() => !!props.experimentName || !!props.experimentCode)\n\nconst panelSubtitle = computed(() => {\n if (props.isResolving) return 'Loading experiment…'\n if (props.error) return 'Could not load this experiment'\n return hasExperiment.value ? 'Linked experiment context' : 'Link to an MINT experiment'\n})\n\nconst triggerLabel = computed(() => {\n if (props.isResolving) return 'Loading experiment'\n if (props.error) return 'Experiment unavailable'\n return props.experimentName || props.experimentCode || 'No experiment'\n})\n\nconst emit = defineEmits<{\n select: []\n save: []\n detach: []\n}>()\n\nconst { isOpen, rootRef: popoverRef, triggerRef, close, toggle } = useDropdownState({\n closeOnEscape: false,\n})\nconst showSuccess = ref(false)\nconst showConfirm = ref(false)\n\nfunction handleTriggerClick() {\n if (!hasExperiment.value && !isUnresolved.value) {\n handleSelect()\n return\n }\n toggle()\n}\n\nfunction handleSelect() {\n emit('select')\n close()\n}\n\nfunction handleSave() {\n if (props.saveDisabled || props.saveLoading) return\n if (props.confirmSave) {\n showConfirm.value = true\n } else {\n emit('save')\n }\n}\n\nfunction handleConfirmSave() {\n showConfirm.value = false\n emit('save')\n}\n\nfunction handleDetach() {\n emit('detach')\n close()\n}\n\nlet successTimer: ReturnType<typeof setTimeout> | null = null\n\n// Show success state when saveSuccessMessage changes from empty to a value\nwatch(() => props.saveSuccessMessage, (msg) => {\n if (successTimer) clearTimeout(successTimer)\n if (msg) {\n showSuccess.value = true\n successTimer = setTimeout(() => {\n showSuccess.value = false\n successTimer = null\n }, 3000)\n }\n})\n\nonUnmounted(() => {\n if (successTimer) clearTimeout(successTimer)\n})\n</script>\n\n<template>\n <div ref=\"popoverRef\" class=\"mint-experiment-popover\">\n <!-- Split trigger: experiment pill + inline save -->\n <div\n :class=\"[\n 'mint-experiment-popover__split',\n { 'mint-experiment-popover__split--with-save': showSave && experimentName },\n ]\"\n >\n <!-- Left: experiment trigger (selects when empty, otherwise opens popover). Prefer the human-readable\n name; the formal code, when present, stays in the detail panel. -->\n <button\n ref=\"triggerRef\"\n type=\"button\"\n :class=\"[\n 'mint-experiment-popover__trigger',\n { 'mint-experiment-popover__trigger--active': isOpen },\n { 'mint-experiment-popover__trigger--empty': !isUnresolved && !hasExperiment },\n { 'mint-experiment-popover__trigger--loading': isResolving },\n { 'mint-experiment-popover__trigger--error': !isResolving && !!error },\n ]\"\n :title=\"isUnresolved ? triggerLabel : experimentName || experimentCode || undefined\"\n :aria-label=\"isUnresolved ? triggerLabel : undefined\"\n :aria-busy=\"isResolving || undefined\"\n :aria-expanded=\"isOpen\"\n @click.stop=\"handleTriggerClick\"\n >\n <!-- Flask icon -->\n <svg class=\"mint-experiment-popover__trigger-icon\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1.75\"\n d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z\"\n />\n </svg>\n <!-- Resolving and error come first: with an experiment bound but no name\n yet, \"No experiment\" would be a lie. -->\n <span v-if=\"isResolving\" class=\"mint-experiment-popover__trigger-skeleton\" aria-hidden=\"true\" />\n <span v-else-if=\"error\" class=\"mint-experiment-popover__trigger-text\">Experiment unavailable</span>\n <!-- Name preferred, code as fallback, \"No experiment\" as empty state -->\n <span v-else-if=\"experimentName\" class=\"mint-experiment-popover__trigger-text\">{{ experimentName }}</span>\n <span v-else-if=\"experimentCode\" class=\"mint-experiment-popover__trigger-code\">{{ experimentCode }}</span>\n <span v-else class=\"mint-experiment-popover__trigger-text\">No experiment</span>\n <!-- Chevron -->\n <svg class=\"mint-experiment-popover__trigger-chevron\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n\n <!-- Right: inline save button (direct action) -->\n <button\n v-if=\"showSave && experimentName\"\n type=\"button\"\n :class=\"[\n 'mint-experiment-popover__save-trigger',\n { 'mint-experiment-popover__save-trigger--loading': saveLoading },\n { 'mint-experiment-popover__save-trigger--success': showSuccess },\n { 'mint-experiment-popover__save-trigger--disabled': saveDisabled && !showSuccess },\n ]\"\n :disabled=\"saveDisabled && !showSuccess\"\n :title=\"saveDisabled && saveDisabledMessage ? saveDisabledMessage : showSuccess && saveSuccessMessage ? saveSuccessMessage : 'Save to Experiment'\"\n aria-label=\"Save to experiment\"\n @click.stop=\"handleSave\"\n >\n <!-- Loading spinner -->\n <span v-if=\"saveLoading\" class=\"mint-experiment-popover__spinner--inline\" />\n <!-- Success check -->\n <svg v-else-if=\"showSuccess\" class=\"mint-experiment-popover__save-trigger-icon\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M5 13l4 4L19 7\" />\n </svg>\n <!-- Save icon -->\n <svg v-else class=\"mint-experiment-popover__save-trigger-icon\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 7H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4\" />\n </svg>\n </button>\n </div>\n\n <!-- Popover panel -->\n <div v-if=\"isOpen\" class=\"mint-experiment-popover__panel\">\n <!-- Header -->\n <div class=\"mint-experiment-popover__header\">\n <div class=\"mint-experiment-popover__title\">Experiment</div>\n <div class=\"mint-experiment-popover__subtitle\">\n {{ panelSubtitle }}\n </div>\n </div>\n\n <!-- Bound, still resolving — placeholders stand in for the record the\n platform has not returned yet. -->\n <div v-if=\"isResolving\" class=\"mint-experiment-popover__body\">\n <div class=\"mint-experiment-popover__card\" aria-busy=\"true\">\n <div class=\"mint-experiment-popover__card-icon\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1.75\"\n d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z\"\n />\n </svg>\n </div>\n <div class=\"mint-experiment-popover__card-info\">\n <span class=\"mint-experiment-popover__skeleton-line mint-experiment-popover__skeleton-line--code\" />\n <span class=\"mint-experiment-popover__skeleton-line mint-experiment-popover__skeleton-line--name\" />\n <span class=\"mint-experiment-popover__skeleton-line mint-experiment-popover__skeleton-line--status\" />\n </div>\n </div>\n <div class=\"mint-experiment-popover__card-actions\">\n <button type=\"button\" class=\"mint-experiment-popover__change-btn\" @click=\"handleSelect\">\n Change\n </button>\n <button v-if=\"showDetach\" type=\"button\" class=\"mint-experiment-popover__detach-btn\" @click=\"handleDetach\">\n Detach\n </button>\n </div>\n </div>\n\n <!-- Bound, resolution failed — Detach stays reachable so the user is not\n stuck on an experiment the platform cannot describe. -->\n <div v-else-if=\"error\" class=\"mint-experiment-popover__body\">\n <div class=\"mint-experiment-popover__card mint-experiment-popover__card--error\" role=\"alert\">\n <div class=\"mint-experiment-popover__card-icon mint-experiment-popover__card-icon--error\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1.75\"\n d=\"M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z\"\n />\n </svg>\n </div>\n <div class=\"mint-experiment-popover__card-info\">\n <div class=\"mint-experiment-popover__card-name\">Experiment unavailable</div>\n <div class=\"mint-experiment-popover__card-message\">{{ error }}</div>\n </div>\n </div>\n <div class=\"mint-experiment-popover__card-actions\">\n <button type=\"button\" class=\"mint-experiment-popover__change-btn\" @click=\"handleSelect\">\n Change\n </button>\n <button v-if=\"showDetach\" type=\"button\" class=\"mint-experiment-popover__detach-btn\" @click=\"handleDetach\">\n Detach\n </button>\n </div>\n </div>\n\n <!-- No experiment selected -->\n <div v-else-if=\"!experimentName\" class=\"mint-experiment-popover__body\">\n <button type=\"button\" class=\"mint-experiment-popover__select-btn\" @click=\"handleSelect\">\n <svg width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 4v16m8-8H4\" />\n </svg>\n Select Experiment\n </button>\n </div>\n\n <!-- Experiment selected -->\n <div v-else class=\"mint-experiment-popover__body\">\n <div class=\"mint-experiment-popover__card\">\n <div class=\"mint-experiment-popover__card-icon\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1.75\"\n d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z\"\n />\n </svg>\n </div>\n <div class=\"mint-experiment-popover__card-info\">\n <span v-if=\"experimentCode\" class=\"mint-experiment-popover__card-code\">{{ experimentCode }}</span>\n <div class=\"mint-experiment-popover__card-name\">{{ experimentName }}</div>\n <div v-if=\"experimentStatus\" class=\"mint-experiment-popover__card-status\">\n {{ formatExperimentStatus(experimentStatus) }}\n </div>\n </div>\n </div>\n <div class=\"mint-experiment-popover__card-actions\">\n <button type=\"button\" class=\"mint-experiment-popover__change-btn\" @click=\"handleSelect\">\n Change\n </button>\n <button v-if=\"showDetach\" type=\"button\" class=\"mint-experiment-popover__detach-btn\" @click=\"handleDetach\">\n Detach\n </button>\n </div>\n </div>\n </div>\n\n <!-- Save confirmation dialog -->\n <ConfirmDialog\n v-model=\"showConfirm\"\n :title=\"confirmTitle ?? 'Save to Experiment'\"\n :message=\"confirmMessage ?? `Save current data to ${experimentName}?`\"\n variant=\"info\"\n confirm-label=\"Save\"\n :loading=\"saveLoading\"\n @confirm=\"handleConfirmSave\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Floating popover showing the active experiment with save, detach, and select actions. */\nimport { ref, computed, watch, onUnmounted } from 'vue'\nimport { useDropdownState } from '../composables/useDropdownState'\nimport { formatExperimentStatus } from '../composables/experiment-utils'\nimport ConfirmDialog from './ConfirmDialog.vue'\n\ninterface Props {\n experimentName?: string\n experimentCode?: string\n experimentStatus?: string\n /** An experiment is bound but the platform has not returned its record yet. */\n isResolving?: boolean\n /** Message explaining why the bound experiment could not be resolved. */\n error?: string\n showSave?: boolean\n showDetach?: boolean\n saveDisabled?: boolean\n saveLoading?: boolean\n saveSuccessMessage?: string\n saveDisabledMessage?: string\n confirmSave?: boolean\n confirmTitle?: string\n confirmMessage?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n isResolving: false,\n showSave: false,\n showDetach: false,\n saveDisabled: false,\n saveLoading: false,\n confirmSave: true,\n})\n\n// An experiment is bound but has no name to show — either still resolving or\n// resolution failed. The id is never substituted: a name may only come from the\n// platform, so these states say what is happening instead of inventing a label.\nconst isUnresolved = computed(() => props.isResolving || !!props.error)\nconst hasExperiment = computed(() => !!props.experimentName || !!props.experimentCode)\n\nconst panelSubtitle = computed(() => {\n if (props.isResolving) return 'Loading experiment…'\n if (props.error) return 'Could not load this experiment'\n return hasExperiment.value ? 'Linked experiment context' : 'Link to an MINT experiment'\n})\n\nconst triggerLabel = computed(() => {\n if (props.isResolving) return 'Loading experiment'\n if (props.error) return 'Experiment unavailable'\n return props.experimentName || props.experimentCode || 'No experiment'\n})\n\nconst emit = defineEmits<{\n select: []\n save: []\n detach: []\n}>()\n\nconst { isOpen, rootRef: popoverRef, triggerRef, close, toggle } = useDropdownState({\n closeOnEscape: false,\n})\nconst showSuccess = ref(false)\nconst showConfirm = ref(false)\n\nfunction handleTriggerClick() {\n if (!hasExperiment.value && !isUnresolved.value) {\n handleSelect()\n return\n }\n toggle()\n}\n\nfunction handleSelect() {\n emit('select')\n close()\n}\n\nfunction handleSave() {\n if (props.saveDisabled || props.saveLoading) return\n if (props.confirmSave) {\n showConfirm.value = true\n } else {\n emit('save')\n }\n}\n\nfunction handleConfirmSave() {\n showConfirm.value = false\n emit('save')\n}\n\nfunction handleDetach() {\n emit('detach')\n close()\n}\n\nlet successTimer: ReturnType<typeof setTimeout> | null = null\n\n// Show success state when saveSuccessMessage changes from empty to a value\nwatch(() => props.saveSuccessMessage, (msg) => {\n if (successTimer) clearTimeout(successTimer)\n if (msg) {\n showSuccess.value = true\n successTimer = setTimeout(() => {\n showSuccess.value = false\n successTimer = null\n }, 3000)\n }\n})\n\nonUnmounted(() => {\n if (successTimer) clearTimeout(successTimer)\n})\n</script>\n\n<template>\n <div ref=\"popoverRef\" class=\"mint-experiment-popover\">\n <!-- Split trigger: experiment pill + inline save -->\n <div\n :class=\"[\n 'mint-experiment-popover__split',\n { 'mint-experiment-popover__split--with-save': showSave && experimentName },\n ]\"\n >\n <!-- Left: experiment trigger (selects when empty, otherwise opens popover). Prefer the human-readable\n name; the formal code, when present, stays in the detail panel. -->\n <button\n ref=\"triggerRef\"\n type=\"button\"\n :class=\"[\n 'mint-experiment-popover__trigger',\n { 'mint-experiment-popover__trigger--active': isOpen },\n { 'mint-experiment-popover__trigger--empty': !isUnresolved && !hasExperiment },\n { 'mint-experiment-popover__trigger--loading': isResolving },\n { 'mint-experiment-popover__trigger--error': !isResolving && !!error },\n ]\"\n :title=\"isUnresolved ? triggerLabel : experimentName || experimentCode || undefined\"\n :aria-label=\"isUnresolved ? triggerLabel : undefined\"\n :aria-busy=\"isResolving || undefined\"\n :aria-expanded=\"isOpen\"\n @click.stop=\"handleTriggerClick\"\n >\n <!-- Flask icon -->\n <svg class=\"mint-experiment-popover__trigger-icon\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1.75\"\n d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z\"\n />\n </svg>\n <!-- Resolving and error come first: with an experiment bound but no name\n yet, \"No experiment\" would be a lie. -->\n <span v-if=\"isResolving\" class=\"mint-experiment-popover__trigger-skeleton\" aria-hidden=\"true\" />\n <span v-else-if=\"error\" class=\"mint-experiment-popover__trigger-text\">Experiment unavailable</span>\n <!-- Name preferred, code as fallback, \"No experiment\" as empty state -->\n <span v-else-if=\"experimentName\" class=\"mint-experiment-popover__trigger-text\">{{ experimentName }}</span>\n <span v-else-if=\"experimentCode\" class=\"mint-experiment-popover__trigger-code\">{{ experimentCode }}</span>\n <span v-else class=\"mint-experiment-popover__trigger-text\">No experiment</span>\n <!-- Chevron -->\n <svg class=\"mint-experiment-popover__trigger-chevron\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n\n <!-- Right: inline save button (direct action) -->\n <button\n v-if=\"showSave && experimentName\"\n type=\"button\"\n :class=\"[\n 'mint-experiment-popover__save-trigger',\n { 'mint-experiment-popover__save-trigger--loading': saveLoading },\n { 'mint-experiment-popover__save-trigger--success': showSuccess },\n { 'mint-experiment-popover__save-trigger--disabled': saveDisabled && !showSuccess },\n ]\"\n :disabled=\"saveDisabled && !showSuccess\"\n :title=\"saveDisabled && saveDisabledMessage ? saveDisabledMessage : showSuccess && saveSuccessMessage ? saveSuccessMessage : 'Save to Experiment'\"\n aria-label=\"Save to experiment\"\n @click.stop=\"handleSave\"\n >\n <!-- Loading spinner -->\n <span v-if=\"saveLoading\" class=\"mint-experiment-popover__spinner--inline\" />\n <!-- Success check -->\n <svg v-else-if=\"showSuccess\" class=\"mint-experiment-popover__save-trigger-icon\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M5 13l4 4L19 7\" />\n </svg>\n <!-- Save icon -->\n <svg v-else class=\"mint-experiment-popover__save-trigger-icon\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 7H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4\" />\n </svg>\n </button>\n </div>\n\n <!-- Popover panel -->\n <div v-if=\"isOpen\" class=\"mint-experiment-popover__panel\">\n <!-- Header -->\n <div class=\"mint-experiment-popover__header\">\n <div class=\"mint-experiment-popover__title\">Experiment</div>\n <div class=\"mint-experiment-popover__subtitle\">\n {{ panelSubtitle }}\n </div>\n </div>\n\n <!-- Bound, still resolving — placeholders stand in for the record the\n platform has not returned yet. -->\n <div v-if=\"isResolving\" class=\"mint-experiment-popover__body\">\n <div class=\"mint-experiment-popover__card\" aria-busy=\"true\">\n <div class=\"mint-experiment-popover__card-icon\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1.75\"\n d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z\"\n />\n </svg>\n </div>\n <div class=\"mint-experiment-popover__card-info\">\n <span class=\"mint-experiment-popover__skeleton-line mint-experiment-popover__skeleton-line--code\" />\n <span class=\"mint-experiment-popover__skeleton-line mint-experiment-popover__skeleton-line--name\" />\n <span class=\"mint-experiment-popover__skeleton-line mint-experiment-popover__skeleton-line--status\" />\n </div>\n </div>\n <div class=\"mint-experiment-popover__card-actions\">\n <button type=\"button\" class=\"mint-experiment-popover__change-btn\" @click=\"handleSelect\">\n Change\n </button>\n <button v-if=\"showDetach\" type=\"button\" class=\"mint-experiment-popover__detach-btn\" @click=\"handleDetach\">\n Detach\n </button>\n </div>\n </div>\n\n <!-- Bound, resolution failed — Detach stays reachable so the user is not\n stuck on an experiment the platform cannot describe. -->\n <div v-else-if=\"error\" class=\"mint-experiment-popover__body\">\n <div class=\"mint-experiment-popover__card mint-experiment-popover__card--error\" role=\"alert\">\n <div class=\"mint-experiment-popover__card-icon mint-experiment-popover__card-icon--error\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1.75\"\n d=\"M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z\"\n />\n </svg>\n </div>\n <div class=\"mint-experiment-popover__card-info\">\n <div class=\"mint-experiment-popover__card-name\">Experiment unavailable</div>\n <div class=\"mint-experiment-popover__card-message\">{{ error }}</div>\n </div>\n </div>\n <div class=\"mint-experiment-popover__card-actions\">\n <button type=\"button\" class=\"mint-experiment-popover__change-btn\" @click=\"handleSelect\">\n Change\n </button>\n <button v-if=\"showDetach\" type=\"button\" class=\"mint-experiment-popover__detach-btn\" @click=\"handleDetach\">\n Detach\n </button>\n </div>\n </div>\n\n <!-- No experiment selected -->\n <div v-else-if=\"!experimentName\" class=\"mint-experiment-popover__body\">\n <button type=\"button\" class=\"mint-experiment-popover__select-btn\" @click=\"handleSelect\">\n <svg width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 4v16m8-8H4\" />\n </svg>\n Select Experiment\n </button>\n </div>\n\n <!-- Experiment selected -->\n <div v-else class=\"mint-experiment-popover__body\">\n <div class=\"mint-experiment-popover__card\">\n <div class=\"mint-experiment-popover__card-icon\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1.75\"\n d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z\"\n />\n </svg>\n </div>\n <div class=\"mint-experiment-popover__card-info\">\n <span v-if=\"experimentCode\" class=\"mint-experiment-popover__card-code\">{{ experimentCode }}</span>\n <div class=\"mint-experiment-popover__card-name\">{{ experimentName }}</div>\n <div v-if=\"experimentStatus\" class=\"mint-experiment-popover__card-status\">\n {{ formatExperimentStatus(experimentStatus) }}\n </div>\n </div>\n </div>\n <div class=\"mint-experiment-popover__card-actions\">\n <button type=\"button\" class=\"mint-experiment-popover__change-btn\" @click=\"handleSelect\">\n Change\n </button>\n <button v-if=\"showDetach\" type=\"button\" class=\"mint-experiment-popover__detach-btn\" @click=\"handleDetach\">\n Detach\n </button>\n </div>\n </div>\n </div>\n\n <!-- Save confirmation dialog -->\n <ConfirmDialog\n v-model=\"showConfirm\"\n :title=\"confirmTitle ?? 'Save to Experiment'\"\n :message=\"confirmMessage ?? `Save current data to ${experimentName}?`\"\n variant=\"info\"\n confirm-label=\"Save\"\n :loading=\"saveLoading\"\n @confirm=\"handleConfirmSave\"\n />\n </div>\n</template>\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,99 @@
1
+ import { ModalSize } from '../types';
2
+ import { FileBrowserSortKey, FileEntry, FilePathCrumb, FileSelection, ServerMount } from '../types/fileBrowserTypes';
3
+ interface Props {
4
+ modelValue: boolean;
5
+ /** Mounts in the location strip; nested `children` follow their parent. */
6
+ mounts?: ServerMount[];
7
+ /** Mount the listing belongs to. */
8
+ mountId?: string;
9
+ /** Mount-relative path of the directory being shown. */
10
+ path?: string;
11
+ /** Parent path, or null at a mount root. */
12
+ parent?: string | null;
13
+ entries?: FileEntry[];
14
+ breadcrumbs?: FilePathCrumb[];
15
+ /** Controlled selection, mirroring DataFrame's selectedKeys contract. */
16
+ selected?: FileSelection[];
17
+ /** Extensions the caller cares about, shown as a chip in the toolbar. */
18
+ typeRules?: string[];
19
+ search?: string;
20
+ sort?: FileBrowserSortKey;
21
+ /** Directory size before any search filter. */
22
+ totalCount?: number | null;
23
+ /** How many entries satisfy the type rules. */
24
+ matchCount?: number | null;
25
+ /** True when the server capped the listing. */
26
+ truncated?: boolean;
27
+ loading?: boolean;
28
+ error?: string | null;
29
+ title?: string;
30
+ /** Free-form context line, e.g. the experiment this data is for. */
31
+ subtitle?: string;
32
+ /** Monospace prefix on the context line, e.g. an experiment code. */
33
+ contextCode?: string;
34
+ /** Dim entries that fail the type rules instead of showing them plainly. */
35
+ dimNonMatching?: boolean;
36
+ /** Offer the hand-off to the system file picker for local, never-uploaded files. */
37
+ showLocalPicker?: boolean;
38
+ confirmLabel?: string;
39
+ size?: ModalSize;
40
+ }
41
+ declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
42
+ "update:modelValue": (value: boolean) => any;
43
+ cancel: () => any;
44
+ refresh: () => any;
45
+ navigate: (location: {
46
+ mount_id: string;
47
+ path: string;
48
+ }) => any;
49
+ "update:sort": (value: FileBrowserSortKey) => any;
50
+ confirm: (selection: FileSelection[]) => any;
51
+ selectFolder: (location: {
52
+ mount_id: string;
53
+ path: string;
54
+ }) => any;
55
+ "update:search": (value: string) => any;
56
+ "update:selected": (selection: FileSelection[]) => any;
57
+ chooseLocal: () => any;
58
+ }, string, import('vue').PublicProps, Readonly<Props> & Readonly<{
59
+ "onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
60
+ onCancel?: (() => any) | undefined;
61
+ onRefresh?: (() => any) | undefined;
62
+ onNavigate?: ((location: {
63
+ mount_id: string;
64
+ path: string;
65
+ }) => any) | undefined;
66
+ "onUpdate:sort"?: ((value: FileBrowserSortKey) => any) | undefined;
67
+ onConfirm?: ((selection: FileSelection[]) => any) | undefined;
68
+ onSelectFolder?: ((location: {
69
+ mount_id: string;
70
+ path: string;
71
+ }) => any) | undefined;
72
+ "onUpdate:search"?: ((value: string) => any) | undefined;
73
+ "onUpdate:selected"?: ((selection: FileSelection[]) => any) | undefined;
74
+ onChooseLocal?: (() => any) | undefined;
75
+ }>, {
76
+ sort: FileBrowserSortKey;
77
+ entries: FileEntry[];
78
+ selected: FileSelection[];
79
+ error: string | null;
80
+ size: ModalSize;
81
+ search: string;
82
+ path: string;
83
+ title: string;
84
+ loading: boolean;
85
+ subtitle: string;
86
+ confirmLabel: string;
87
+ mountId: string;
88
+ parent: string | null;
89
+ breadcrumbs: FilePathCrumb[];
90
+ typeRules: string[];
91
+ dimNonMatching: boolean;
92
+ totalCount: number | null;
93
+ matchCount: number | null;
94
+ truncated: boolean;
95
+ mounts: ServerMount[];
96
+ contextCode: string;
97
+ showLocalPicker: boolean;
98
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
99
+ export default _default;
@@ -0,0 +1,32 @@
1
+ import { PickerAdapter, PickerCapabilities, PickerSelection, PickerSelectionMode, PickerSource } from '../types/filePicker';
2
+ interface Props {
3
+ open: boolean;
4
+ adapter: PickerAdapter;
5
+ selectionMode?: PickerSelectionMode;
6
+ sources?: PickerSource[];
7
+ capabilities?: PickerCapabilities;
8
+ initialPath?: string;
9
+ initialSelection?: PickerSelection | null;
10
+ title?: string;
11
+ }
12
+ declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
13
+ select: (selection: PickerSelection) => any;
14
+ cancel: () => any;
15
+ "update:open": (open: boolean) => any;
16
+ }, string, import('vue').PublicProps, Readonly<Props> & Readonly<{
17
+ onSelect?: ((selection: PickerSelection) => any) | undefined;
18
+ onCancel?: (() => any) | undefined;
19
+ "onUpdate:open"?: ((open: boolean) => any) | undefined;
20
+ }>, {
21
+ title: string;
22
+ selectionMode: PickerSelectionMode;
23
+ sources: PickerSource[];
24
+ capabilities: PickerCapabilities;
25
+ initialPath: string;
26
+ initialSelection: PickerSelection | null;
27
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
28
+ searchArea: HTMLDivElement;
29
+ filesInput: HTMLInputElement;
30
+ folderInput: HTMLInputElement;
31
+ }, any>;
32
+ export default _default;
@@ -0,0 +1,10 @@
1
+ import { FileEntry } from '../types/fileBrowserTypes';
2
+ export declare const FILE_BROWSER_ICONS: {
3
+ disk: string;
4
+ folder: string;
5
+ file: string;
6
+ };
7
+ export declare function formatCount(value: number): string;
8
+ export declare function formatSize(entry: FileEntry): string;
9
+ export declare function formatBytes(bytes: number | null): string;
10
+ export declare function entryType(entry: FileEntry): string;
@@ -111,7 +111,10 @@ export { default as ResourceCard } from './ResourceCard.vue';
111
111
  export { default as SectionCard } from './SectionCard.vue';
112
112
  export { default as ExperimentSelectorModal } from './ExperimentSelectorModal.vue';
113
113
  export { default as ArtifactSelectorModal } from './ArtifactSelectorModal.vue';
114
+ /** Modal picker over the read-only server mounts, recording paths rather than copying data. */
115
+ export { default as FileBrowserModal } from './FileBrowserModal.vue';
114
116
  export { default as GeneratedPathInput } from './GeneratedPathInput.vue';
115
117
  export { default as ArtifactSaveDialog } from './ArtifactSaveDialog.vue';
116
118
  export { default as ExperimentPopover } from './ExperimentPopover.vue';
117
119
  export { default as FitPanel } from './FitPanel.vue';
120
+ export { default as FilePicker } from './FilePicker.vue';
@@ -1,8 +1,8 @@
1
1
  import { f as BaseModal_default, h as BaseButton_default } from "../experiment-utils-DV3DrvE_.js";
2
2
  import { a as BaseSelect_default, i as BasePill_default, r as EmptyState_default, s as BaseInput_default, t as Skeleton_default } from "../Skeleton-DxtwJ5gt.js";
3
3
  import { Bt as MultiSelect_default, Gt as BaseToggle_default, Jt as BaseTextarea_default, Kt as BaseCheckbox_default, L as GeneratedPathInput_default, M as SequenceInput_default, O as ConcentrationInput_default, P as FormulaInput_default, R as ArtifactSelectorModal_default, St as TimePicker_default, Ut as BaseSlider_default, Wt as BaseRadioGroup_default, at as AlertBox_default, ct as SecretInput_default, j as MoleculeInput_default, k as UnitInput_default, ot as FileUploader_default, qt as Tooltip_default, st as NumberInput_default, tt as DateTimePicker_default, xt as TagsInput_default, zt as DatePicker_default } from "../useControlSchema-aMZlb4Sc.js";
4
- import { $ as SmartGroupFieldRecipe_default, A as ProtocolStepEditor_default, At as AppToastContainer_default, B as Breadcrumb_default, Ct as AppAvatarMenu_default, Dt as ActionMenu_default, Et as ThemeToggle_default, F as RackEditor_default, Ft as SegmentedControl_default, G as AppContainer_default, H as ProgressBar_default, I as BioTemplatePresetWorkspaceView_default, It as BaseTabs_default, J as ComponentBindingRenderer_default, K as DoseDesignWorkspaceView_default, L as BioTemplatePackWorkspaceView_default, Lt as ColorSlider_default, M as ReagentEditor_default, Mt as LoadingSpinner_default, N as SmartGroupModal_default, Nt as Calendar_default, O as ChemicalFormula_default, Ot as IconButton_default, P as GroupAssigner_default, Pt as DropdownButton_default, Q as SmartGroupManual_default, R as BioTemplateExperimentWorkspaceView_default, St as AppPluginSwitcher_default, Tt as CollapsibleCard_default, U as StatusIndicator_default, V as Avatar_default, W as Divider_default, X as SampleSelector_default, Y as ScheduleCalendar_default, Z as AutoGroupModal_default, _t as AppSidebar_default, a as ResourceCard_default, at as DoseCalculator_default, b as InstrumentAlertLog_default, bt as StepWizard_default, c as BatchProgressList_default, ct as GeneratedResultRenderer_default, et as ReagentList_default, gt as AppLayout_default, ht as MobileSupportGate_default, i as SectionCard_default, it as ExperimentTimeline_default, j as SampleHierarchyTree_default, jt as DataFrame_default, k as ScientificNumber_default, kt as RuntimeUpdateNotice_default, l as AuditTrail_default, lt as GeneratedPlotlyResult_default, mt as PluginWorkspaceView_default, n as FitPanel_default, nt as SampleLegend_default, o as TimeRangeInput_default, ot as GeneratedPluginView_default, q as ControlWorkspaceView_default, r as ArtifactSaveDialog_default, rt as WellPlate_default, s as ExperimentDataViewer_default, st as JobsStatusTray_default, tt as PlateMapEditor_default, u as LcmsSequenceTable_default, ut as ChartContainer_default, v as InstrumentStatusCard_default, vt as FormBuilder_default, wt as PluginIcon_default, x as SequenceProgressBar_default, xt as AppTopBar_default, y as InstrumentStateBadge_default, yt as FormActions_default, z as BioTemplateRenderer_default } from "../components-CgAUzF8F.js";
4
+ import { $ as AutoGroupModal_default, A as ChemicalFormula_default, At as IconButton_default, B as BioTemplateExperimentWorkspaceView_default, C as SequenceProgressBar_default, Ct as AppTopBar_default, Dt as CollapsibleCard_default, Et as PluginIcon_default, F as SmartGroupModal_default, Ft as Calendar_default, G as StatusIndicator_default, H as Breadcrumb_default, I as GroupAssigner_default, It as DropdownButton_default, J as DoseDesignWorkspaceView_default, K as Divider_default, L as RackEditor_default, Lt as SegmentedControl_default, M as ProtocolStepEditor_default, Mt as AppToastContainer_default, N as SampleHierarchyTree_default, Nt as DataFrame_default, Ot as ThemeToggle_default, P as ReagentEditor_default, Pt as LoadingSpinner_default, Q as SampleSelector_default, R as BioTemplatePresetWorkspaceView_default, Rt as BaseTabs_default, S as InstrumentAlertLog_default, St as StepWizard_default, Tt as AppAvatarMenu_default, U as Avatar_default, V as BioTemplateRenderer_default, W as ProgressBar_default, X as ComponentBindingRenderer_default, Y as ControlWorkspaceView_default, Z as ScheduleCalendar_default, _t as MobileSupportGate_default, a as FileBrowserModal_default, at as WellPlate_default, b as InstrumentStatusCard_default, bt as FormBuilder_default, c as TimeRangeInput_default, ct as GeneratedPluginView_default, d as AuditTrail_default, dt as GeneratedPlotlyResult_default, et as SmartGroupManual_default, f as LcmsSequenceTable_default, ft as ChartContainer_default, gt as PluginWorkspaceView_default, i as ArtifactSaveDialog_default, it as SampleLegend_default, j as ScientificNumber_default, jt as RuntimeUpdateNotice_default, kt as ActionMenu_default, l as ExperimentDataViewer_default, lt as JobsStatusTray_default, n as FilePicker_default, nt as ReagentList_default, o as SectionCard_default, ot as ExperimentTimeline_default, q as AppContainer_default, r as FitPanel_default, rt as PlateMapEditor_default, s as ResourceCard_default, st as DoseCalculator_default, tt as SmartGroupFieldRecipe_default, u as BatchProgressList_default, ut as GeneratedResultRenderer_default, vt as AppLayout_default, wt as AppPluginSwitcher_default, x as InstrumentStateBadge_default, xt as FormActions_default, yt as AppSidebar_default, z as BioTemplatePackWorkspaceView_default, zt as ColorSlider_default } from "../components-DuQRC810.js";
5
5
  import { s as FormField_default, t as SettingsModal_default } from "../SettingsModal-Dphh3RrI.js";
6
- import { r as ConfirmDialog_default, t as ExperimentPopover_default } from "../ExperimentPopover-oL0fg_A0.js";
6
+ import { r as ConfirmDialog_default, t as ExperimentPopover_default } from "../ExperimentPopover-BIZKoRTT.js";
7
7
  import { r as ExperimentCodeBadge_default, t as ExperimentSelectorModal_default } from "../ExperimentSelectorModal-BeEOomw_.js";
8
- export { ActionMenu_default as ActionMenu, AlertBox_default as AlertBox, AppAvatarMenu_default as AppAvatarMenu, AppContainer_default as AppContainer, AppLayout_default as AppLayout, AppPluginSwitcher_default as AppPluginSwitcher, AppSidebar_default as AppSidebar, AppToastContainer_default as AppToastContainer, AppTopBar_default as AppTopBar, ArtifactSaveDialog_default as ArtifactSaveDialog, ArtifactSelectorModal_default as ArtifactSelectorModal, AuditTrail_default as AuditTrail, AutoGroupModal_default as AutoGroupModal, Avatar_default as Avatar, BaseButton_default as BaseButton, BaseCheckbox_default as BaseCheckbox, BaseInput_default as BaseInput, BaseModal_default as BaseModal, BasePill_default as BasePill, BaseRadioGroup_default as BaseRadioGroup, BaseSelect_default as BaseSelect, BaseSlider_default as BaseSlider, BaseTabs_default as BaseTabs, BaseTextarea_default as BaseTextarea, BaseToggle_default as BaseToggle, BatchProgressList_default as BatchProgressList, BioTemplateExperimentWorkspaceView_default as BioTemplateExperimentWorkspaceView, BioTemplatePackWorkspaceView_default as BioTemplatePackWorkspaceView, BioTemplatePresetWorkspaceView_default as BioTemplatePresetWorkspaceView, BioTemplateRenderer_default as BioTemplateRenderer, Breadcrumb_default as Breadcrumb, Calendar_default as Calendar, ChartContainer_default as ChartContainer, ChemicalFormula_default as ChemicalFormula, CollapsibleCard_default as CollapsibleCard, ColorSlider_default as ColorSlider, ComponentBindingRenderer_default as ComponentBindingRenderer, ConcentrationInput_default as ConcentrationInput, ConfirmDialog_default as ConfirmDialog, ControlWorkspaceView_default as ControlWorkspaceView, DataFrame_default as DataFrame, DatePicker_default as DatePicker, DateTimePicker_default as DateTimePicker, Divider_default as Divider, DoseCalculator_default as DoseCalculator, DoseDesignWorkspaceView_default as DoseDesignWorkspaceView, DropdownButton_default as DropdownButton, EmptyState_default as EmptyState, ExperimentCodeBadge_default as ExperimentCodeBadge, ExperimentDataViewer_default as ExperimentDataViewer, ExperimentPopover_default as ExperimentPopover, ExperimentSelectorModal_default as ExperimentSelectorModal, ExperimentTimeline_default as ExperimentTimeline, FileUploader_default as FileUploader, FitPanel_default as FitPanel, FormActions_default as FormActions, FormBuilder_default as FormBuilder, FormField_default as FormField, FormulaInput_default as FormulaInput, GeneratedPathInput_default as GeneratedPathInput, GeneratedPlotlyResult_default as GeneratedPlotlyResult, GeneratedPluginView_default as GeneratedPluginView, GeneratedResultRenderer_default as GeneratedResultRenderer, GroupAssigner_default as GroupAssigner, IconButton_default as IconButton, InstrumentAlertLog_default as InstrumentAlertLog, InstrumentStateBadge_default as InstrumentStateBadge, InstrumentStatusCard_default as InstrumentStatusCard, JobsStatusTray_default as JobsStatusTray, LcmsSequenceTable_default as LcmsSequenceTable, LoadingSpinner_default as LoadingSpinner, MobileSupportGate_default as MobileSupportGate, MoleculeInput_default as MoleculeInput, MultiSelect_default as MultiSelect, NumberInput_default as NumberInput, PlateMapEditor_default as PlateMapEditor, PluginIcon_default as PluginIcon, PluginWorkspaceView_default as PluginWorkspaceView, ProgressBar_default as ProgressBar, ProtocolStepEditor_default as ProtocolStepEditor, RackEditor_default as RackEditor, ReagentEditor_default as ReagentEditor, ReagentList_default as ReagentList, ResourceCard_default as ResourceCard, RuntimeUpdateNotice_default as RuntimeUpdateNotice, SampleHierarchyTree_default as SampleHierarchyTree, SampleLegend_default as SampleLegend, SampleSelector_default as SampleSelector, ScheduleCalendar_default as ScheduleCalendar, ScientificNumber_default as ScientificNumber, SecretInput_default as SecretInput, SectionCard_default as SectionCard, SegmentedControl_default as SegmentedControl, SequenceInput_default as SequenceInput, SequenceProgressBar_default as SequenceProgressBar, SettingsModal_default as SettingsModal, Skeleton_default as Skeleton, SmartGroupFieldRecipe_default as SmartGroupFieldRecipe, SmartGroupManual_default as SmartGroupManual, SmartGroupModal_default as SmartGroupModal, StatusIndicator_default as StatusIndicator, StepWizard_default as StepWizard, TagsInput_default as TagsInput, ThemeToggle_default as ThemeToggle, TimePicker_default as TimePicker, TimeRangeInput_default as TimeRangeInput, Tooltip_default as Tooltip, UnitInput_default as UnitInput, WellPlate_default as WellPlate };
8
+ export { ActionMenu_default as ActionMenu, AlertBox_default as AlertBox, AppAvatarMenu_default as AppAvatarMenu, AppContainer_default as AppContainer, AppLayout_default as AppLayout, AppPluginSwitcher_default as AppPluginSwitcher, AppSidebar_default as AppSidebar, AppToastContainer_default as AppToastContainer, AppTopBar_default as AppTopBar, ArtifactSaveDialog_default as ArtifactSaveDialog, ArtifactSelectorModal_default as ArtifactSelectorModal, AuditTrail_default as AuditTrail, AutoGroupModal_default as AutoGroupModal, Avatar_default as Avatar, BaseButton_default as BaseButton, BaseCheckbox_default as BaseCheckbox, BaseInput_default as BaseInput, BaseModal_default as BaseModal, BasePill_default as BasePill, BaseRadioGroup_default as BaseRadioGroup, BaseSelect_default as BaseSelect, BaseSlider_default as BaseSlider, BaseTabs_default as BaseTabs, BaseTextarea_default as BaseTextarea, BaseToggle_default as BaseToggle, BatchProgressList_default as BatchProgressList, BioTemplateExperimentWorkspaceView_default as BioTemplateExperimentWorkspaceView, BioTemplatePackWorkspaceView_default as BioTemplatePackWorkspaceView, BioTemplatePresetWorkspaceView_default as BioTemplatePresetWorkspaceView, BioTemplateRenderer_default as BioTemplateRenderer, Breadcrumb_default as Breadcrumb, Calendar_default as Calendar, ChartContainer_default as ChartContainer, ChemicalFormula_default as ChemicalFormula, CollapsibleCard_default as CollapsibleCard, ColorSlider_default as ColorSlider, ComponentBindingRenderer_default as ComponentBindingRenderer, ConcentrationInput_default as ConcentrationInput, ConfirmDialog_default as ConfirmDialog, ControlWorkspaceView_default as ControlWorkspaceView, DataFrame_default as DataFrame, DatePicker_default as DatePicker, DateTimePicker_default as DateTimePicker, Divider_default as Divider, DoseCalculator_default as DoseCalculator, DoseDesignWorkspaceView_default as DoseDesignWorkspaceView, DropdownButton_default as DropdownButton, EmptyState_default as EmptyState, ExperimentCodeBadge_default as ExperimentCodeBadge, ExperimentDataViewer_default as ExperimentDataViewer, ExperimentPopover_default as ExperimentPopover, ExperimentSelectorModal_default as ExperimentSelectorModal, ExperimentTimeline_default as ExperimentTimeline, FileBrowserModal_default as FileBrowserModal, FilePicker_default as FilePicker, FileUploader_default as FileUploader, FitPanel_default as FitPanel, FormActions_default as FormActions, FormBuilder_default as FormBuilder, FormField_default as FormField, FormulaInput_default as FormulaInput, GeneratedPathInput_default as GeneratedPathInput, GeneratedPlotlyResult_default as GeneratedPlotlyResult, GeneratedPluginView_default as GeneratedPluginView, GeneratedResultRenderer_default as GeneratedResultRenderer, GroupAssigner_default as GroupAssigner, IconButton_default as IconButton, InstrumentAlertLog_default as InstrumentAlertLog, InstrumentStateBadge_default as InstrumentStateBadge, InstrumentStatusCard_default as InstrumentStatusCard, JobsStatusTray_default as JobsStatusTray, LcmsSequenceTable_default as LcmsSequenceTable, LoadingSpinner_default as LoadingSpinner, MobileSupportGate_default as MobileSupportGate, MoleculeInput_default as MoleculeInput, MultiSelect_default as MultiSelect, NumberInput_default as NumberInput, PlateMapEditor_default as PlateMapEditor, PluginIcon_default as PluginIcon, PluginWorkspaceView_default as PluginWorkspaceView, ProgressBar_default as ProgressBar, ProtocolStepEditor_default as ProtocolStepEditor, RackEditor_default as RackEditor, ReagentEditor_default as ReagentEditor, ReagentList_default as ReagentList, ResourceCard_default as ResourceCard, RuntimeUpdateNotice_default as RuntimeUpdateNotice, SampleHierarchyTree_default as SampleHierarchyTree, SampleLegend_default as SampleLegend, SampleSelector_default as SampleSelector, ScheduleCalendar_default as ScheduleCalendar, ScientificNumber_default as ScientificNumber, SecretInput_default as SecretInput, SectionCard_default as SectionCard, SegmentedControl_default as SegmentedControl, SequenceInput_default as SequenceInput, SequenceProgressBar_default as SequenceProgressBar, SettingsModal_default as SettingsModal, Skeleton_default as Skeleton, SmartGroupFieldRecipe_default as SmartGroupFieldRecipe, SmartGroupManual_default as SmartGroupManual, SmartGroupModal_default as SmartGroupModal, StatusIndicator_default as StatusIndicator, StepWizard_default as StepWizard, TagsInput_default as TagsInput, ThemeToggle_default as ThemeToggle, TimePicker_default as TimePicker, TimeRangeInput_default as TimeRangeInput, Tooltip_default as Tooltip, UnitInput_default as UnitInput, WellPlate_default as WellPlate };
@@ -0,0 +1,34 @@
1
+ import { ModalSize } from '../../types';
2
+ type __VLS_Props = {
3
+ open: boolean;
4
+ label: string;
5
+ size: ModalSize;
6
+ variant?: 'picker';
7
+ };
8
+ declare function __VLS_template(): {
9
+ attrs: Partial<{}>;
10
+ slots: {
11
+ header?(_: {}): any;
12
+ default?(_: {}): any;
13
+ footer?(_: {}): any;
14
+ };
15
+ refs: {
16
+ containerRef: HTMLElement;
17
+ };
18
+ rootEl: any;
19
+ };
20
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
21
+ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
22
+ close: () => any;
23
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
24
+ onClose?: (() => any) | undefined;
25
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
26
+ containerRef: HTMLElement;
27
+ }, any>;
28
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
29
+ export default _default;
30
+ type __VLS_WithTemplateSlots<T, S> = T & {
31
+ new (): {
32
+ $slots: S;
33
+ };
34
+ };
@@ -0,0 +1,25 @@
1
+ import { FileEntry, FileSelection } from '../../types/fileBrowserTypes';
2
+ type __VLS_Props = {
3
+ mountId: string;
4
+ entries: FileEntry[];
5
+ selected: FileSelection[];
6
+ loading: boolean;
7
+ error?: string | null;
8
+ dimNonMatching: boolean;
9
+ totalCount: number | null;
10
+ matchCount: number | null;
11
+ truncated: boolean;
12
+ hasMounts: boolean;
13
+ hasAvailableMounts: boolean;
14
+ search: string;
15
+ };
16
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
17
+ toggle: (entry: FileEntry) => any;
18
+ open: (entry: FileEntry) => any;
19
+ refresh: () => any;
20
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
21
+ onToggle?: ((entry: FileEntry) => any) | undefined;
22
+ onOpen?: ((entry: FileEntry) => any) | undefined;
23
+ onRefresh?: (() => any) | undefined;
24
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
25
+ export default _default;
@@ -0,0 +1,26 @@
1
+ import { FileBrowserSortKey, FilePathCrumb, FileBrowserLocation } from '../../types/fileBrowserTypes';
2
+ type __VLS_Props = {
3
+ mountId: string;
4
+ path: string;
5
+ parent: string | null;
6
+ breadcrumbs: FilePathCrumb[];
7
+ search: string;
8
+ sort: FileBrowserSortKey;
9
+ typeRules: string[];
10
+ loading: boolean;
11
+ error?: string | null;
12
+ };
13
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
14
+ refresh: () => any;
15
+ navigate: (location: FileBrowserLocation) => any;
16
+ "update:sort": (value: FileBrowserSortKey) => any;
17
+ selectFolder: (location: FileBrowserLocation) => any;
18
+ "update:search": (value: string) => any;
19
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
20
+ onRefresh?: (() => any) | undefined;
21
+ onNavigate?: ((location: FileBrowserLocation) => any) | undefined;
22
+ "onUpdate:sort"?: ((value: FileBrowserSortKey) => any) | undefined;
23
+ onSelectFolder?: ((location: FileBrowserLocation) => any) | undefined;
24
+ "onUpdate:search"?: ((value: string) => any) | undefined;
25
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
26
+ export default _default;
@@ -0,0 +1,18 @@
1
+ import { PickerNode, PickerExcluded, PickerSource } from '../../types/filePicker';
2
+ type __VLS_Props = {
3
+ totalCount?: number | null;
4
+ node: PickerNode | null;
5
+ source: PickerSource;
6
+ exclusions: PickerExcluded[];
7
+ busy: boolean;
8
+ error: string;
9
+ reviewing: boolean;
10
+ };
11
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
12
+ retry: () => any;
13
+ review: () => any;
14
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
15
+ onRetry?: (() => any) | undefined;
16
+ onReview?: (() => any) | undefined;
17
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLElement>;
18
+ export default _default;
@@ -0,0 +1,31 @@
1
+ import { PickerNode, PickerTreeRow, PickerSelectionMode } from '../../types/filePicker';
2
+ type __VLS_Props = {
3
+ emptyTitle?: string;
4
+ rows: PickerTreeRow[];
5
+ loading: boolean;
6
+ error: string;
7
+ query: string;
8
+ mode: PickerSelectionMode;
9
+ selected: (node: PickerNode) => boolean;
10
+ reason: (node: PickerNode) => string;
11
+ progress: (node: PickerNode) => string;
12
+ focusPath: string;
13
+ };
14
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
15
+ select: (node: PickerNode, event: MouseEvent | KeyboardEvent) => any;
16
+ retry: () => any;
17
+ enter: (node: PickerNode) => any;
18
+ up: () => any;
19
+ expand: (node: PickerNode) => any;
20
+ parent: (node: PickerNode) => any;
21
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
22
+ onSelect?: ((node: PickerNode, event: MouseEvent | KeyboardEvent) => any) | undefined;
23
+ onRetry?: (() => any) | undefined;
24
+ onEnter?: ((node: PickerNode) => any) | undefined;
25
+ onUp?: (() => any) | undefined;
26
+ onExpand?: ((node: PickerNode) => any) | undefined;
27
+ onParent?: ((node: PickerNode) => any) | undefined;
28
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
29
+ list: HTMLDivElement;
30
+ }, HTMLDivElement>;
31
+ export default _default;