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

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 (137) hide show
  1. package/dist/{EmptyState-p90quq8Z.js → EmptyState-NBqf2_8z.js} +2 -2
  2. package/dist/{EmptyState-p90quq8Z.js.map → EmptyState-NBqf2_8z.js.map} +1 -1
  3. package/dist/{ExperimentPopover-tLwJ7XF4.js → ExperimentPopover-CfOdh5Rm.js} +3 -3
  4. package/dist/{ExperimentPopover-tLwJ7XF4.js.map → ExperimentPopover-CfOdh5Rm.js.map} +1 -1
  5. package/dist/{ExperimentSelectorModal-B6P2msT4.js → ExperimentSelectorModal-DvIagrxY.js} +4 -4
  6. package/dist/{ExperimentSelectorModal-B6P2msT4.js.map → ExperimentSelectorModal-DvIagrxY.js.map} +1 -1
  7. package/dist/{SettingsModal-CkNM8qAI.js → SettingsModal-W3TYfnP9.js} +4 -7
  8. package/dist/SettingsModal-W3TYfnP9.js.map +1 -0
  9. package/dist/__tests__/components/PluginWorkspaceView.internal.test.d.ts +1 -0
  10. package/dist/__tests__/components/SecretInput.test.d.ts +1 -0
  11. package/dist/__tests__/components/WellEditPopupInternal.test.d.ts +1 -0
  12. package/dist/components/AppAvatarMenu.vue.d.ts +4 -0
  13. package/dist/components/AppSidebar.vue.d.ts +1 -1
  14. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +1 -1
  15. package/dist/components/DropdownButton.vue.d.ts +2 -0
  16. package/dist/components/FitPanel.vue.d.ts +1 -1
  17. package/dist/components/PluginWorkspaceView.props.d.ts +29 -1
  18. package/dist/components/PluginWorkspaceView.vue.d.ts +5 -5
  19. package/dist/components/SecretInput.vue.d.ts +28 -0
  20. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +1 -1
  21. package/dist/components/index.d.ts +9 -0
  22. package/dist/components/index.js +8 -8
  23. package/dist/components/internal/WellEditPopupInternal.vue.d.ts +3 -1
  24. package/dist/components/internal/WorkspaceControlsInternal.vue.d.ts +23 -0
  25. package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +70 -0
  26. package/dist/components/internal/WorkspaceSidebarInternal.vue.d.ts +43 -0
  27. package/dist/{components-MGNL6tRn.js → components-B80gV0P6.js} +575 -561
  28. package/dist/components-B80gV0P6.js.map +1 -0
  29. package/dist/composables/flattenWorkspaceBindings.d.ts +61 -0
  30. package/dist/composables/index.d.ts +5 -0
  31. package/dist/composables/index.js +9 -9
  32. package/dist/composables/pluginWorkspaceModel.d.ts +164 -0
  33. package/dist/composables/useAsync.d.ts +5 -1
  34. package/dist/composables/useBioTemplateWorkspace.d.ts +4 -20
  35. package/dist/composables/useCommandHistory.d.ts +5 -1
  36. package/dist/composables/useFocusTrap.d.ts +21 -0
  37. package/dist/composables/useMenuKeyboard.d.ts +29 -0
  38. package/dist/composables/useOptimisticMutation.d.ts +5 -1
  39. package/dist/composables/usePluginWorkspace.d.ts +51 -0
  40. package/dist/composables/useResourceCrud.d.ts +5 -1
  41. package/dist/composables/useRovingFocus.d.ts +24 -0
  42. package/dist/composables/useWellPainting.d.ts +5 -1
  43. package/dist/composables/useWellPlateAdapter.d.ts +5 -1
  44. package/dist/composables/useWellPlateValidation.d.ts +5 -1
  45. package/dist/composables/workspaceRecipes.d.ts +188 -0
  46. package/dist/{composables-CKxOcvgh.js → composables-C8mmD5ta.js} +65 -17
  47. package/dist/composables-C8mmD5ta.js.map +1 -0
  48. package/dist/{experiment-utils-CLnzPPq5.js → experiment-utils-DV3DrvE_.js} +70 -51
  49. package/dist/experiment-utils-DV3DrvE_.js.map +1 -0
  50. package/dist/index.d.ts +1 -0
  51. package/dist/index.js +13 -13
  52. package/dist/install.js +7 -7
  53. package/dist/styles.css +100 -49
  54. package/dist/templates/builderReadUtils.d.ts +1 -1
  55. package/dist/templates/index.js +4 -4
  56. package/dist/{templates-BTJ9C9Kb.js → templates-CK72aKO1.js} +14 -23
  57. package/dist/templates-CK72aKO1.js.map +1 -0
  58. package/dist/types/form-builder.d.ts +1 -1
  59. package/dist/{useControlSchema-CXhxTul7.js → useControlSchema-_OVhavKq.js} +280 -63
  60. package/dist/useControlSchema-_OVhavKq.js.map +1 -0
  61. package/dist/{useDropdownState-DSb3BC3N.js → useDropdownState-D5G4UvWd.js} +2 -2
  62. package/dist/{useDropdownState-DSb3BC3N.js.map → useDropdownState-D5G4UvWd.js.map} +1 -1
  63. package/dist/{useExperimentSelector-D0pjj9WH.js → useExperimentSelector-DSEckf_g.js} +3 -3
  64. package/dist/{useExperimentSelector-D0pjj9WH.js.map → useExperimentSelector-DSEckf_g.js.map} +1 -1
  65. package/dist/{useFormBuilder-CuOFB3aP.js → useFormBuilder-Bd714C7y.js} +2 -2
  66. package/dist/{useFormBuilder-CuOFB3aP.js.map → useFormBuilder-Bd714C7y.js.map} +1 -1
  67. package/dist/{useProtocolTemplates-BWhQIWV5.js → useProtocolTemplates-Dq5Pzwyd.js} +481 -46
  68. package/dist/useProtocolTemplates-Dq5Pzwyd.js.map +1 -0
  69. package/dist/utils/pluginSecrets.d.ts +53 -0
  70. package/dist/utils/records.d.ts +4 -0
  71. package/package.json +1 -1
  72. package/src/__tests__/components/AppAvatarMenu.test.ts +123 -0
  73. package/src/__tests__/components/BaseTabs.test.ts +67 -0
  74. package/src/__tests__/components/DropdownButton.test.ts +134 -0
  75. package/src/__tests__/components/PluginWorkspaceView.internal.test.ts +230 -0
  76. package/src/__tests__/components/SecretInput.test.ts +87 -0
  77. package/src/__tests__/components/WellEditPopupInternal.test.ts +108 -0
  78. package/src/__tests__/composables/usePluginClient.test.ts +140 -0
  79. package/src/__tests__/docs/frontendDocsCatalog.test.ts +22 -1
  80. package/src/components/AppAvatarMenu.vue +34 -3
  81. package/src/components/BaseModal.vue +8 -56
  82. package/src/components/BaseTabs.vue +26 -1
  83. package/src/components/BioTemplateExperimentWorkspaceView.vue +10 -21
  84. package/src/components/BioTemplatePackWorkspaceView.vue +11 -15
  85. package/src/components/BioTemplatePresetWorkspaceView.vue +8 -13
  86. package/src/components/ComponentBindingRenderer.vue +1 -3
  87. package/src/components/ControlWorkspaceView.vue +11 -22
  88. package/src/components/DoseDesignWorkspaceView.vue +6 -25
  89. package/src/components/DropdownButton.vue +32 -2
  90. package/src/components/PluginWorkspaceView.props.ts +38 -0
  91. package/src/components/PluginWorkspaceView.vue +53 -224
  92. package/src/components/SecretInput.story.vue +79 -0
  93. package/src/components/SecretInput.vue +150 -0
  94. package/src/components/index.ts +9 -0
  95. package/src/components/internal/WellEditPopupInternal.vue +20 -1
  96. package/src/components/internal/WorkspaceControlsInternal.vue +20 -0
  97. package/src/components/internal/WorkspaceShellInternal.vue +125 -0
  98. package/src/components/internal/WorkspaceSidebarInternal.vue +82 -0
  99. package/src/composables/experimentDesignData.ts +1 -3
  100. package/src/composables/flattenWorkspaceBindings.ts +104 -0
  101. package/src/composables/formBuilderRegistry.ts +5 -0
  102. package/src/composables/index.ts +26 -0
  103. package/src/composables/pluginWorkspaceModel.ts +182 -0
  104. package/src/composables/useAsync.ts +5 -1
  105. package/src/composables/useBioTemplatePackWorkspace.ts +15 -9
  106. package/src/composables/useBioTemplatePresetWorkspace.ts +14 -15
  107. package/src/composables/useBioTemplateWorkspace.ts +18 -43
  108. package/src/composables/useCommandHistory.ts +5 -1
  109. package/src/composables/useFocusTrap.ts +91 -0
  110. package/src/composables/useMenuKeyboard.ts +90 -0
  111. package/src/composables/useOptimisticMutation.ts +5 -1
  112. package/src/composables/usePluginClient.ts +42 -4
  113. package/src/composables/usePluginWorkspace.ts +208 -0
  114. package/src/composables/useResourceCrud.ts +5 -1
  115. package/src/composables/useRovingFocus.ts +66 -0
  116. package/src/composables/useWellPainting.ts +5 -1
  117. package/src/composables/useWellPlateAdapter.ts +5 -1
  118. package/src/composables/useWellPlateValidation.ts +5 -1
  119. package/src/composables/workspaceRecipes.ts +267 -0
  120. package/src/index.ts +16 -0
  121. package/src/styles/components/secret-input.css +60 -0
  122. package/src/styles/index.css +1 -0
  123. package/src/templates/builderReadUtils.ts +1 -3
  124. package/src/templates/componentTargetResolvers.ts +1 -3
  125. package/src/templates/controlSchemaTargets.ts +1 -3
  126. package/src/types/form-builder.ts +1 -0
  127. package/src/utils/formModelSync.ts +1 -3
  128. package/src/utils/pluginIcon.ts +1 -3
  129. package/src/utils/pluginSecrets.ts +102 -0
  130. package/src/utils/records.ts +9 -0
  131. package/dist/SettingsModal-CkNM8qAI.js.map +0 -1
  132. package/dist/components-MGNL6tRn.js.map +0 -1
  133. package/dist/composables-CKxOcvgh.js.map +0 -1
  134. package/dist/experiment-utils-CLnzPPq5.js.map +0 -1
  135. package/dist/templates-BTJ9C9Kb.js.map +0 -1
  136. package/dist/useControlSchema-CXhxTul7.js.map +0 -1
  137. package/dist/useProtocolTemplates-BWhQIWV5.js.map +0 -1
@@ -1,16 +1,16 @@
1
1
  import { n as __exportAll, r as __toESM } from "./chunk-BoAXSpZd.js";
2
- import { f as BaseModal_default, m as BaseButton_default, p as useEventListener } from "./experiment-utils-CLnzPPq5.js";
3
- import { a as BaseSelect_default, i as BasePill_default, n as Skeleton_default, o as normalizeOptionInput, r as useRequestSyncState, s as BaseInput_default, t as EmptyState_default } from "./EmptyState-p90quq8Z.js";
4
- import { A as useConcentrationUnits, At as BaseToggle_default, Et as useListSelection, Ft as offset, I as useChemicalFormula, It as shift, K as useGeneratedAnalysis, L as GeneratedPathInput_default, Lt as BaseTextarea_default, M as SequenceInput_default, Mt as Tooltip_default, Nt as computePosition, O as ConcentrationInput_default, Ot as BaseSlider_default, P as FormulaInput_default, Pt as flip, R as ArtifactSelectorModal_default, T as getDefaultControlView, Tt as MultiSelect_default, U as resolveCurrentExperimentId, V as getInjectedPlatformContext, X as jobStatusLabel, Z as normalizeJobPercent, _ as controlsToFormSchema, at as NumberInput_default, f as resolveControlModel, g as mergeControlWorkspaceOptions, h as controlValuesToComponentProps, it as FileUploader_default, j as MoleculeInput_default, jt as BaseCheckbox_default, k as UnitInput_default, kt as BaseRadioGroup_default, lt as compareTime, m as controlValuesToComponentBindingsById, mt as formatTime, nt as _plugin_vue_export_helper_default, o as defineDoseDesignControlModel, ot as TagsInput_default, p as controlValuesToComponentBindings, pt as formatDuration, r as getControlDefaults, rt as AlertBox_default, st as TimePicker_default, tt as DateTimePicker_default, u as useControlWorkspace, ut as durationMinutes, w as controlsToViewItems, wt as DatePicker_default, x as controlsToSidebarPanels, y as controlsToSectionFormSchemas } from "./useControlSchema-CXhxTul7.js";
5
- import { a as pickExistingRecordKeys, c as normalizeItemInput, i as formSchemaFieldNames, l as normalizeLabelItemInput, o as recordValuesEqualForKeys, r as FormFieldRendererInternal_default, s as FormField_default, t as SettingsModal_default } from "./SettingsModal-CkNM8qAI.js";
6
- import { t as useDropdownState } from "./useDropdownState-DSb3BC3N.js";
7
- import { $ as useToast, B as useDoseCalculator, C as getSampleGroupParentPath, G as useMobileSupportGate, J as getInjectedFrontendRevision, K as APP_EXPERIMENT_KEY, N as useAutoGroup, P as parseCSV, Q as useTheme, R as DEFAULT_COLORS, S as getSampleGroupMajorPrefix, U as usePluginJobCenter, W as DEFAULT_MOBILE_VIEWPORT_QUERY, Y as useRuntimeAlignment, Z as usePresenceHeartbeat, _ as useScheduleDrag, a as useReagentSeries, b as useExpansionSet, c as useBioTemplatePresetWorkspace, it as useSortedItems, k as readFileAsText, l as useBioTemplatePackWorkspace, n as DEFAULT_PRESETS, nt as useTextSearch, o as useGroupAssignment, q as useAppExperiment, r as DEFAULT_UNITS, s as useRackEditor, t as useProtocolTemplates, v as useExperimentSamples, x as useSampleGroups, y as useExperimentData, z as useWellPlateEditor } from "./useProtocolTemplates-BWhQIWV5.js";
2
+ import { f as BaseModal_default, h as BaseButton_default, m as useEventListener, p as useFocusTrap } from "./experiment-utils-DV3DrvE_.js";
3
+ import { a as BaseSelect_default, i as BasePill_default, n as Skeleton_default, o as normalizeOptionInput, r as useRequestSyncState, s as BaseInput_default, t as EmptyState_default } from "./EmptyState-NBqf2_8z.js";
4
+ import { A as useConcentrationUnits, Bt as MultiSelect_default, Gt as BaseToggle_default, I as useChemicalFormula, Jt as computePosition, K as useGeneratedAnalysis, Kt as BaseCheckbox_default, L as GeneratedPathInput_default, M as SequenceInput_default, O as ConcentrationInput_default, Ot as formatDuration, P as FormulaInput_default, Qt as BaseTextarea_default, R as ArtifactSelectorModal_default, St as TimePicker_default, Tt as durationMinutes, U as resolveCurrentExperimentId, Ut as BaseSlider_default, V as getInjectedPlatformContext, Vt as useListSelection, Wt as BaseRadioGroup_default, X as jobStatusLabel, Xt as offset, Yt as flip, Z as normalizeJobPercent, Zt as shift, _ as controlsToFormSchema, at as AlertBox_default, ct as SecretInput_default, f as resolveControlModel, g as mergeControlWorkspaceOptions, it as _plugin_vue_export_helper_default, j as MoleculeInput_default, k as UnitInput_default, kt as formatTime, o as defineDoseDesignControlModel, ot as FileUploader_default, qt as Tooltip_default, r as getControlDefaults, rt as isRecord, st as NumberInput_default, tt as DateTimePicker_default, u as useControlWorkspace, wt as compareTime, x as controlsToSidebarPanels, xt as TagsInput_default, y as controlsToSectionFormSchemas, zt as DatePicker_default } from "./useControlSchema-_OVhavKq.js";
5
+ import { a as pickExistingRecordKeys, c as normalizeItemInput, i as formSchemaFieldNames, l as normalizeLabelItemInput, o as recordValuesEqualForKeys, r as FormFieldRendererInternal_default, s as FormField_default, t as SettingsModal_default } from "./SettingsModal-W3TYfnP9.js";
6
+ import { $ as useTheme, B as useDoseCalculator, C as getSampleGroupParentPath, G as DEFAULT_MOBILE_VIEWPORT_QUERY, J as useAppExperiment, K as useMobileSupportGate, N as useAutoGroup, P as parseCSV, Q as usePresenceHeartbeat, R as DEFAULT_COLORS, S as getSampleGroupMajorPrefix, U as usePluginJobCenter, W as usePluginWorkspace, X as useRuntimeAlignment, Y as getInjectedFrontendRevision, _ as useScheduleDrag, a as useReagentSeries, at as useSortedItems, b as useExpansionSet, c as useBioTemplatePresetWorkspace, et as useToast, k as readFileAsText, l as useBioTemplatePackWorkspace, n as DEFAULT_PRESETS, o as useGroupAssignment, ot as useMenuKeyboard, q as APP_EXPERIMENT_KEY, r as DEFAULT_UNITS, rt as useTextSearch, s as useRackEditor, st as useRovingFocus, t as useProtocolTemplates, v as useExperimentSamples, x as useSampleGroups, y as useExperimentData, z as useWellPlateEditor } from "./useProtocolTemplates-Dq5Pzwyd.js";
7
+ import { t as useDropdownState } from "./useDropdownState-D5G4UvWd.js";
8
8
  import { r as useApi } from "./useApi-CDBq6z23.js";
9
- import { i as usePlatformContext, t as useFormBuilder } from "./useFormBuilder-CuOFB3aP.js";
9
+ import { i as usePlatformContext, t as useFormBuilder } from "./useFormBuilder-Bd714C7y.js";
10
10
  import { t as ANALYSIS_FILE_ARTIFACT_SCHEMA } from "./analysisArtifactTypes-DQ0MjwHZ.js";
11
- import { r as ConfirmDialog_default, t as ExperimentPopover_default } from "./ExperimentPopover-tLwJ7XF4.js";
12
- import { B as toBioTemplateComponentProps, F as getBioTemplateComponentProps, H as toBioTemplateComponentPropsById, L as toBioTemplateComponentBindings, R as toBioTemplateComponentBindingsById, V as toBioTemplateComponentPropsByComponent, dn as extractTemplateCollection } from "./templates-BTJ9C9Kb.js";
13
- import { r as ExperimentCodeBadge_default, t as ExperimentSelectorModal_default } from "./ExperimentSelectorModal-B6P2msT4.js";
11
+ import { r as ConfirmDialog_default, t as ExperimentPopover_default } from "./ExperimentPopover-CfOdh5Rm.js";
12
+ import { B as toBioTemplateComponentProps, F as getBioTemplateComponentProps, H as toBioTemplateComponentPropsById, L as toBioTemplateComponentBindings, R as toBioTemplateComponentBindingsById, V as toBioTemplateComponentPropsByComponent, dn as extractTemplateCollection } from "./templates-CK72aKO1.js";
13
+ import { r as ExperimentCodeBadge_default, t as ExperimentSelectorModal_default } from "./ExperimentSelectorModal-DvIagrxY.js";
14
14
  import { Fragment, Teleport, Transition, TransitionGroup, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createStaticVNode, createTextVNode, createVNode, defineAsyncComponent, defineComponent, effectScope, guardReactiveProps, h, inject, mergeModels, mergeProps, nextTick, normalizeClass, normalizeProps, normalizeStyle, onBeforeUnmount, onMounted, onScopeDispose, onUnmounted, openBlock, reactive, ref, renderList, renderSlot, resolveComponent, resolveDynamicComponent, shallowRef, toDisplayString, toHandlers, toRaw, toRef, unref, useId, useModel, useSlots, vModelCheckbox, vModelSelect, vModelText, vShow, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
15
15
  //#region src/components/ColorSlider.vue?vue&type=script&setup=true&lang.ts
16
16
  var _hoisted_1$77 = { class: "mint-color-slider__row" };
@@ -167,8 +167,11 @@ var ColorSlider_default = /* @__PURE__ */ defineComponent({
167
167
  //#endregion
168
168
  //#region src/components/BaseTabs.vue?vue&type=script&setup=true&lang.ts
169
169
  var _hoisted_1$76 = [
170
+ "id",
170
171
  "aria-selected",
171
172
  "aria-disabled",
173
+ "aria-controls",
174
+ "tabindex",
172
175
  "onClick"
173
176
  ];
174
177
  var _hoisted_2$67 = { class: "mint-tab__content" };
@@ -217,23 +220,40 @@ var BaseTabs_default = /* @__PURE__ */ defineComponent({
217
220
  const tab = normalizedTabs.value.find((t) => t.id === tabId);
218
221
  if (tab && !tab.disabled) emit("update:modelValue", tabId);
219
222
  }
223
+ const tabButtonRefs = /* @__PURE__ */ new Map();
224
+ function setTabButtonRef(id, el) {
225
+ if (el instanceof HTMLElement) tabButtonRefs.set(id, el);
226
+ else tabButtonRefs.delete(id);
227
+ }
228
+ const { handleKeydown } = useRovingFocus({
229
+ ids: () => normalizedTabs.value.filter((tab) => !tab.disabled).map((tab) => tab.id),
230
+ activeId: () => activeTab.value,
231
+ activate: selectTab,
232
+ getElement: (id) => tabButtonRefs.get(id)
233
+ });
220
234
  return (_ctx, _cache) => {
221
235
  return openBlock(), createElementBlock("div", {
222
236
  class: normalizeClass(["mint-tabs", `mint-tabs--${__props.variant}`]),
223
237
  role: "tablist"
224
238
  }, [(openBlock(true), createElementBlock(Fragment, null, renderList(normalizedTabs.value, (tab) => {
225
239
  return openBlock(), createElementBlock("button", {
240
+ id: `mint-tab-${tab.id}`,
226
241
  key: tab.id,
242
+ ref_for: true,
243
+ ref: (el) => setTabButtonRef(tab.id, el),
227
244
  type: "button",
228
245
  role: "tab",
229
246
  "aria-selected": activeTab.value === tab.id,
230
247
  "aria-disabled": tab.disabled,
248
+ "aria-controls": `mint-tabpanel-${tab.id}`,
249
+ tabindex: activeTab.value === tab.id ? 0 : -1,
231
250
  class: normalizeClass([
232
251
  "mint-tab",
233
252
  activeTab.value === tab.id ? "mint-tab--active" : "",
234
253
  tab.disabled ? "mint-tab--disabled" : ""
235
254
  ]),
236
- onClick: ($event) => selectTab(tab.id)
255
+ onClick: ($event) => selectTab(tab.id),
256
+ onKeydown: _cache[0] || (_cache[0] = (...args) => unref(handleKeydown) && unref(handleKeydown)(...args))
237
257
  }, [createElementVNode("span", _hoisted_2$67, [
238
258
  isSvgIcon(tab.icon) ? (openBlock(), createElementBlock("svg", _hoisted_3$60, [Array.isArray(tab.icon) ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(tab.icon, (d, index) => {
239
259
  return openBlock(), createElementBlock("path", {
@@ -246,7 +266,7 @@ var BaseTabs_default = /* @__PURE__ */ defineComponent({
246
266
  }, null, 8, _hoisted_5$54))])) : tab.icon ? (openBlock(), createElementBlock("span", _hoisted_6$50, toDisplayString(tab.icon), 1)) : createCommentVNode("", true),
247
267
  createTextVNode(" " + toDisplayString(tab.label) + " ", 1),
248
268
  tab.badge !== void 0 ? (openBlock(), createElementBlock("span", _hoisted_7$44, toDisplayString(tab.badge), 1)) : createCommentVNode("", true)
249
- ])], 10, _hoisted_1$76);
269
+ ])], 42, _hoisted_1$76);
250
270
  }), 128))], 2);
251
271
  };
252
272
  }
@@ -353,7 +373,8 @@ var _hoisted_5$53 = [
353
373
  "id",
354
374
  "aria-selected",
355
375
  "aria-disabled",
356
- "onClick"
376
+ "onClick",
377
+ "onKeydown"
357
378
  ];
358
379
  var _hoisted_6$49 = { class: "mint-dropdown-button__option-label" };
359
380
  var _hoisted_7$43 = {
@@ -398,8 +419,24 @@ var DropdownButton_default = /* @__PURE__ */ defineComponent({
398
419
  * @event select - Emitted when an option is selected, includes full option object
399
420
  */
400
421
  const emit = __emit;
401
- const { isOpen, rootRef, close, toggle: toggleDropdown } = useDropdownState();
422
+ const { isOpen, rootRef, open, close: closeDropdown, toggle: toggleDropdown } = useDropdownState();
402
423
  const normalizedOptions = computed(() => props.options.map(normalizeOptionInput));
424
+ const triggerRef = ref(null);
425
+ const panelRef = ref(null);
426
+ function optionItems() {
427
+ if (!panelRef.value) return [];
428
+ return Array.from(panelRef.value.querySelectorAll("[role=\"option\"]:not([aria-disabled=\"true\"])"));
429
+ }
430
+ function close(returnFocus = false) {
431
+ closeDropdown();
432
+ if (returnFocus) nextTick(() => triggerRef.value?.focus());
433
+ }
434
+ const { handleTriggerKeydown, handlePanelKeydown } = useMenuKeyboard({
435
+ items: optionItems,
436
+ isOpen: () => isOpen.value,
437
+ open,
438
+ close
439
+ });
403
440
  const selectedLabel = computed(() => {
404
441
  if (props.modelValue === void 0) return props.placeholder ?? "Select...";
405
442
  return normalizedOptions.value.find((o) => o.value === props.modelValue)?.label ?? String(props.modelValue);
@@ -420,6 +457,8 @@ var DropdownButton_default = /* @__PURE__ */ defineComponent({
420
457
  ref: rootRef,
421
458
  class: "mint-dropdown-button"
422
459
  }, [createElementVNode("button", {
460
+ ref_key: "triggerRef",
461
+ ref: triggerRef,
423
462
  type: "button",
424
463
  disabled: __props.disabled || __props.loading,
425
464
  class: normalizeClass([
@@ -433,9 +472,10 @@ var DropdownButton_default = /* @__PURE__ */ defineComponent({
433
472
  ]),
434
473
  "aria-expanded": unref(isOpen),
435
474
  "aria-haspopup": "listbox",
436
- onClick: toggle
475
+ onClick: toggle,
476
+ onKeydown: _cache[0] || (_cache[0] = (...args) => unref(handleTriggerKeydown) && unref(handleTriggerKeydown)(...args))
437
477
  }, [
438
- __props.loading ? (openBlock(), createElementBlock("svg", _hoisted_2$65, [..._cache[0] || (_cache[0] = [createElementVNode("circle", {
478
+ __props.loading ? (openBlock(), createElementBlock("svg", _hoisted_2$65, [..._cache[2] || (_cache[2] = [createElementVNode("circle", {
439
479
  cx: "12",
440
480
  cy: "12",
441
481
  r: "10",
@@ -457,31 +497,36 @@ var DropdownButton_default = /* @__PURE__ */ defineComponent({
457
497
  "stroke-width": "2",
458
498
  "stroke-linecap": "round",
459
499
  "stroke-linejoin": "round"
460
- }, [..._cache[1] || (_cache[1] = [createElementVNode("path", { d: "m6 9 6 6 6-6" }, null, -1)])], 2))
461
- ], 10, _hoisted_1$74), createVNode(Transition, { name: "mint-dropdown-button-menu" }, {
500
+ }, [..._cache[3] || (_cache[3] = [createElementVNode("path", { d: "m6 9 6 6 6-6" }, null, -1)])], 2))
501
+ ], 42, _hoisted_1$74), createVNode(Transition, { name: "mint-dropdown-button-menu" }, {
462
502
  default: withCtx(() => [unref(isOpen) ? (openBlock(), createElementBlock("ul", {
463
503
  key: 0,
504
+ ref_key: "panelRef",
505
+ ref: panelRef,
464
506
  class: "mint-dropdown-button__menu",
465
507
  role: "listbox",
466
- "aria-activedescendant": __props.modelValue !== void 0 ? `mint-dropdown-option-${__props.modelValue}` : void 0
508
+ "aria-activedescendant": __props.modelValue !== void 0 ? `mint-dropdown-option-${__props.modelValue}` : void 0,
509
+ onKeydown: _cache[1] || (_cache[1] = (...args) => unref(handlePanelKeydown) && unref(handlePanelKeydown)(...args))
467
510
  }, [(openBlock(true), createElementBlock(Fragment, null, renderList(normalizedOptions.value, (option) => {
468
511
  return openBlock(), createElementBlock("li", {
469
512
  id: `mint-dropdown-option-${option.value}`,
470
513
  key: String(option.value),
471
514
  role: "option",
515
+ tabindex: -1,
472
516
  "aria-selected": option.value === __props.modelValue,
473
517
  "aria-disabled": option.disabled,
474
518
  class: normalizeClass(["mint-dropdown-button__option", {
475
519
  "mint-dropdown-button__option--selected": option.value === __props.modelValue,
476
520
  "mint-dropdown-button__option--disabled": option.disabled
477
521
  }]),
478
- onClick: ($event) => selectOption(option)
522
+ onClick: ($event) => selectOption(option),
523
+ onKeydown: [withKeys(withModifiers(($event) => selectOption(option), ["prevent"]), ["enter"]), withKeys(withModifiers(($event) => selectOption(option), ["prevent"]), ["space"])]
479
524
  }, [
480
525
  createElementVNode("span", _hoisted_6$49, toDisplayString(option.label), 1),
481
526
  option.description ? (openBlock(), createElementBlock("span", _hoisted_7$43, toDisplayString(option.description), 1)) : createCommentVNode("", true),
482
- option.value === __props.modelValue ? (openBlock(), createElementBlock("svg", _hoisted_8$39, [..._cache[2] || (_cache[2] = [createElementVNode("path", { d: "M20 6 9 17l-5-5" }, null, -1)])])) : createCommentVNode("", true)
483
- ], 10, _hoisted_5$53);
484
- }), 128))], 8, _hoisted_4$55)) : createCommentVNode("", true)]),
527
+ option.value === __props.modelValue ? (openBlock(), createElementBlock("svg", _hoisted_8$39, [..._cache[4] || (_cache[4] = [createElementVNode("path", { d: "M20 6 9 17l-5-5" }, null, -1)])])) : createCommentVNode("", true)
528
+ ], 42, _hoisted_5$53);
529
+ }), 128))], 40, _hoisted_4$55)) : createCommentVNode("", true)]),
485
530
  _: 1
486
531
  })], 512);
487
532
  };
@@ -822,7 +867,7 @@ var _hoisted_11$29 = {
822
867
  key: 0,
823
868
  class: "mint-dataframe__td mint-dataframe__td--checkbox"
824
869
  };
825
- var _hoisted_12$26 = ["checked", "onChange"];
870
+ var _hoisted_12$25 = ["checked", "onChange"];
826
871
  var _hoisted_13$25 = ["onClick"];
827
872
  var _hoisted_14$22 = [
828
873
  "aria-label",
@@ -1192,7 +1237,7 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1192
1237
  class: "mint-dataframe__checkbox",
1193
1238
  onClick: _cache[2] || (_cache[2] = withModifiers(() => {}, ["stop"])),
1194
1239
  onChange: ($event) => toggleRowSelect(getRowKey(row, rowIndex))
1195
- }, null, 40, _hoisted_12$26)])) : createCommentVNode("", true),
1240
+ }, null, 40, _hoisted_12$25)])) : createCommentVNode("", true),
1196
1241
  (openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (col) => {
1197
1242
  return openBlock(), createElementBlock("td", {
1198
1243
  key: col.key,
@@ -1942,7 +1987,7 @@ var _hoisted_11$28 = {
1942
1987
  "stroke-linejoin": "round",
1943
1988
  "aria-hidden": "true"
1944
1989
  };
1945
- var _hoisted_12$25 = ["d"];
1990
+ var _hoisted_12$24 = ["d"];
1946
1991
  var _hoisted_13$24 = ["d"];
1947
1992
  var _hoisted_14$21 = {
1948
1993
  key: 1,
@@ -2086,7 +2131,7 @@ var CollapsibleCard_default = /* @__PURE__ */ defineComponent({
2086
2131
  return openBlock(), createElementBlock("path", {
2087
2132
  key: i,
2088
2133
  d
2089
- }, null, 8, _hoisted_12$25);
2134
+ }, null, 8, _hoisted_12$24);
2090
2135
  }), 128)) : (openBlock(), createElementBlock("path", {
2091
2136
  key: 1,
2092
2137
  d: action.icon
@@ -2252,9 +2297,6 @@ function parseOffset(value) {
2252
2297
  if (typeof value !== "string") return void 0;
2253
2298
  if (/^(?:100|(?:[1-9]?\d)(?:\.\d+)?)%$/.test(value)) return value;
2254
2299
  }
2255
- function isRecord(value) {
2256
- return typeof value === "object" && value !== null && !Array.isArray(value);
2257
- }
2258
2300
  function isSafeColor(value) {
2259
2301
  return typeof value === "string" && COLOR_REGEX.test(value);
2260
2302
  }
@@ -2824,37 +2866,32 @@ var _hoisted_3$49 = {
2824
2866
  class: "mint-avatar-menu__name"
2825
2867
  };
2826
2868
  var _hoisted_4$48 = {
2827
- key: 0,
2828
- class: "mint-avatar-menu__panel",
2829
- role: "menu"
2830
- };
2831
- var _hoisted_5$46 = {
2832
2869
  key: 0,
2833
2870
  class: "mint-avatar-menu__header"
2834
2871
  };
2835
- var _hoisted_6$42 = {
2872
+ var _hoisted_5$46 = {
2836
2873
  key: 0,
2837
2874
  class: "mint-avatar-menu__user-name"
2838
2875
  };
2839
- var _hoisted_7$36 = {
2876
+ var _hoisted_6$42 = {
2840
2877
  key: 1,
2841
2878
  class: "mint-avatar-menu__user-email"
2842
2879
  };
2843
- var _hoisted_8$33 = {
2880
+ var _hoisted_7$36 = {
2844
2881
  key: 0,
2845
2882
  class: "mint-avatar-menu__divider",
2846
2883
  role: "separator"
2847
2884
  };
2848
- var _hoisted_9$31 = {
2885
+ var _hoisted_8$33 = {
2849
2886
  key: 0,
2850
2887
  class: "mint-avatar-menu__item-icon"
2851
2888
  };
2852
- var _hoisted_10$28 = { class: "mint-avatar-menu__item-label" };
2853
- var _hoisted_11$26 = {
2889
+ var _hoisted_9$31 = { class: "mint-avatar-menu__item-label" };
2890
+ var _hoisted_10$28 = {
2854
2891
  key: 1,
2855
2892
  class: "mint-avatar-menu__item-right"
2856
2893
  };
2857
- var _hoisted_12$24 = { class: "mint-avatar-menu__item-label" };
2894
+ var _hoisted_11$26 = { class: "mint-avatar-menu__item-label" };
2858
2895
  //#endregion
2859
2896
  //#region src/components/AppAvatarMenu.vue
2860
2897
  var AppAvatarMenu_default = /* @__PURE__ */ defineComponent({
@@ -2880,10 +2917,26 @@ var AppAvatarMenu_default = /* @__PURE__ */ defineComponent({
2880
2917
  /** Avatar-triggered dropdown with user name/email header, configurable menu items, dividers, and a sign-out action. */
2881
2918
  const props = __props;
2882
2919
  const emit = __emit;
2883
- const { isOpen, rootRef, close, toggle } = useDropdownState({
2920
+ const { isOpen, rootRef, open, close: closeDropdown, toggle } = useDropdownState({
2884
2921
  onOpen: () => emit("menu-open"),
2885
2922
  onClose: () => emit("menu-close")
2886
2923
  });
2924
+ const triggerRef = ref(null);
2925
+ const panelRef = ref(null);
2926
+ function menuItems() {
2927
+ if (!panelRef.value) return [];
2928
+ return Array.from(panelRef.value.querySelectorAll("[role=\"menuitem\"]"));
2929
+ }
2930
+ function close(returnFocus = false) {
2931
+ closeDropdown();
2932
+ if (returnFocus) nextTick(() => triggerRef.value?.focus());
2933
+ }
2934
+ const { handleTriggerKeydown, handlePanelKeydown } = useMenuKeyboard({
2935
+ items: menuItems,
2936
+ isOpen: () => isOpen.value,
2937
+ open,
2938
+ close
2939
+ });
2887
2940
  const initials = computed(() => {
2888
2941
  if (props.userInitial) return props.userInitial.slice(0, 2).toUpperCase();
2889
2942
  if (props.userName) {
@@ -2914,16 +2967,26 @@ var AppAvatarMenu_default = /* @__PURE__ */ defineComponent({
2914
2967
  ref: rootRef,
2915
2968
  class: "mint-avatar-menu"
2916
2969
  }, [createElementVNode("button", {
2970
+ ref_key: "triggerRef",
2971
+ ref: triggerRef,
2917
2972
  type: "button",
2918
2973
  class: normalizeClass(["mint-avatar-menu__trigger", { "mint-avatar-menu__trigger--open": unref(isOpen) }]),
2919
2974
  "aria-expanded": unref(isOpen),
2920
2975
  "aria-haspopup": "menu",
2921
2976
  title: __props.userName ? `${__props.userName} · Account menu` : "Account menu",
2922
- onClick: _cache[0] || (_cache[0] = withModifiers((...args) => unref(toggle) && unref(toggle)(...args), ["stop"]))
2923
- }, [createElementVNode("span", _hoisted_2$54, [renderSlot(_ctx.$slots, "avatar", { initials: initials.value }, () => [createTextVNode(toDisplayString(initials.value), 1)])]), __props.userName ? (openBlock(), createElementBlock("span", _hoisted_3$49, toDisplayString(__props.userName), 1)) : createCommentVNode("", true)], 10, _hoisted_1$61), unref(isOpen) ? (openBlock(), createElementBlock("div", _hoisted_4$48, [
2924
- __props.userName || __props.userEmail ? (openBlock(), createElementBlock("div", _hoisted_5$46, [__props.userName ? (openBlock(), createElementBlock("div", _hoisted_6$42, toDisplayString(__props.userName), 1)) : createCommentVNode("", true), __props.userEmail ? (openBlock(), createElementBlock("div", _hoisted_7$36, toDisplayString(__props.userEmail), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true),
2977
+ onClick: _cache[0] || (_cache[0] = withModifiers((...args) => unref(toggle) && unref(toggle)(...args), ["stop"])),
2978
+ onKeydown: _cache[1] || (_cache[1] = (...args) => unref(handleTriggerKeydown) && unref(handleTriggerKeydown)(...args))
2979
+ }, [createElementVNode("span", _hoisted_2$54, [renderSlot(_ctx.$slots, "avatar", { initials: initials.value }, () => [createTextVNode(toDisplayString(initials.value), 1)])]), __props.userName ? (openBlock(), createElementBlock("span", _hoisted_3$49, toDisplayString(__props.userName), 1)) : createCommentVNode("", true)], 42, _hoisted_1$61), unref(isOpen) ? (openBlock(), createElementBlock("div", {
2980
+ key: 0,
2981
+ ref_key: "panelRef",
2982
+ ref: panelRef,
2983
+ class: "mint-avatar-menu__panel",
2984
+ role: "menu",
2985
+ onKeydown: _cache[2] || (_cache[2] = (...args) => unref(handlePanelKeydown) && unref(handlePanelKeydown)(...args))
2986
+ }, [
2987
+ __props.userName || __props.userEmail ? (openBlock(), createElementBlock("div", _hoisted_4$48, [__props.userName ? (openBlock(), createElementBlock("div", _hoisted_5$46, toDisplayString(__props.userName), 1)) : createCommentVNode("", true), __props.userEmail ? (openBlock(), createElementBlock("div", _hoisted_6$42, toDisplayString(__props.userEmail), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true),
2925
2988
  renderSlot(_ctx.$slots, "items", { close: closeSilently }, () => [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item) => {
2926
- return openBlock(), createElementBlock(Fragment, { key: item.id }, [item.divider ? (openBlock(), createElementBlock("div", _hoisted_8$33)) : (openBlock(), createBlock(ActionItemInternal_default, {
2989
+ return openBlock(), createElementBlock(Fragment, { key: item.id }, [item.divider ? (openBlock(), createElementBlock("div", _hoisted_7$36)) : (openBlock(), createBlock(ActionItemInternal_default, {
2927
2990
  key: 1,
2928
2991
  href: item.href,
2929
2992
  to: item.to,
@@ -2932,9 +2995,9 @@ var AppAvatarMenu_default = /* @__PURE__ */ defineComponent({
2932
2995
  onClick: ($event) => handleSelect(item)
2933
2996
  }, {
2934
2997
  default: withCtx(() => [
2935
- item.icon ? (openBlock(), createElementBlock("span", _hoisted_9$31, [renderSlot(_ctx.$slots, "item-icon", { item })])) : createCommentVNode("", true),
2936
- createElementVNode("span", _hoisted_10$28, toDisplayString(item.label), 1),
2937
- item.rightLabel ? (openBlock(), createElementBlock("span", _hoisted_11$26, toDisplayString(item.rightLabel), 1)) : createCommentVNode("", true)
2998
+ item.icon ? (openBlock(), createElementBlock("span", _hoisted_8$33, [renderSlot(_ctx.$slots, "item-icon", { item })])) : createCommentVNode("", true),
2999
+ createElementVNode("span", _hoisted_9$31, toDisplayString(item.label), 1),
3000
+ item.rightLabel ? (openBlock(), createElementBlock("span", _hoisted_10$28, toDisplayString(item.rightLabel), 1)) : createCommentVNode("", true)
2938
3001
  ]),
2939
3002
  _: 2
2940
3003
  }, 1032, [
@@ -2944,7 +3007,7 @@ var AppAvatarMenu_default = /* @__PURE__ */ defineComponent({
2944
3007
  "onClick"
2945
3008
  ]))], 64);
2946
3009
  }), 128))]),
2947
- __props.showSignOut ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [_cache[2] || (_cache[2] = createElementVNode("div", {
3010
+ __props.showSignOut ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [_cache[4] || (_cache[4] = createElementVNode("div", {
2948
3011
  class: "mint-avatar-menu__divider",
2949
3012
  role: "separator"
2950
3013
  }, null, -1)), createElementVNode("button", {
@@ -2952,8 +3015,8 @@ var AppAvatarMenu_default = /* @__PURE__ */ defineComponent({
2952
3015
  class: "mint-avatar-menu__item mint-avatar-menu__item--danger",
2953
3016
  role: "menuitem",
2954
3017
  onClick: handleSignOut
2955
- }, [_cache[1] || (_cache[1] = createStaticVNode("<span class=\"mint-avatar-menu__item-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"></path><polyline points=\"16 17 21 12 16 7\"></polyline><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"></line></svg></span>", 1)), createElementVNode("span", _hoisted_12$24, toDisplayString(__props.signOutLabel), 1)])], 64)) : createCommentVNode("", true)
2956
- ])) : createCommentVNode("", true)], 512);
3018
+ }, [_cache[3] || (_cache[3] = createStaticVNode("<span class=\"mint-avatar-menu__item-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"></path><polyline points=\"16 17 21 12 16 7\"></polyline><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"></line></svg></span>", 1)), createElementVNode("span", _hoisted_11$26, toDisplayString(__props.signOutLabel), 1)])], 64)) : createCommentVNode("", true)
3019
+ ], 544)) : createCommentVNode("", true)], 512);
2957
3020
  };
2958
3021
  }
2959
3022
  });
@@ -3267,9 +3330,9 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
3267
3330
  setup(__props, { emit: __emit }) {
3268
3331
  /** Full application top bar with brand logo, page selector or plugin switcher, centered pill nav, experiment popover, and avatar menu. */
3269
3332
  const props = __props;
3270
- const SettingsModal = defineAsyncComponent(() => import("./SettingsModal-CkNM8qAI.js").then((n) => n.n));
3271
- const ExperimentPopover = defineAsyncComponent(() => import("./ExperimentPopover-tLwJ7XF4.js").then((n) => n.n));
3272
- const ExperimentSelectorModal = defineAsyncComponent(() => import("./ExperimentSelectorModal-B6P2msT4.js").then((n) => n.n));
3333
+ const SettingsModal = defineAsyncComponent(() => import("./SettingsModal-W3TYfnP9.js").then((n) => n.n));
3334
+ const ExperimentPopover = defineAsyncComponent(() => import("./ExperimentPopover-CfOdh5Rm.js").then((n) => n.n));
3335
+ const ExperimentSelectorModal = defineAsyncComponent(() => import("./ExperimentSelectorModal-DvIagrxY.js").then((n) => n.n));
3273
3336
  const emit = __emit;
3274
3337
  const settingsOpen = ref(false);
3275
3338
  const { isIntegrated, plugin } = usePlatformContext();
@@ -4744,162 +4807,236 @@ var MobileSupportGate_default = /* @__PURE__ */ defineComponent({
4744
4807
  }
4745
4808
  });
4746
4809
  //#endregion
4747
- //#region src/components/PluginWorkspaceView.controls.ts
4748
- function usePluginWorkspaceControls(options) {
4749
- const resolvedModel = computed(() => resolveControlModel(options.model()));
4750
- const resolvedControls = computed(() => options.controls() ?? resolvedModel.value?.controls);
4751
- const resolvedControlOptions = computed(() => mergeControlWorkspaceOptions(resolvedModel.value?.controlOptions ?? {}, options.controlOptions()));
4752
- const externalControlValues = computed(() => options.modelValue() ?? options.values());
4753
- const internalControlValues = reactive({});
4754
- let syncingControlValues = false;
4755
- const generatedControlDefaults = computed(() => {
4756
- if (!resolvedControls.value) return {};
4757
- return {
4758
- ...getControlDefaults(resolvedControls.value),
4759
- ...resolvedControlOptions.value.initialValues ?? {}
4810
+ //#region src/components/internal/WorkspaceControlsInternal.vue
4811
+ var WorkspaceControlsInternal_default = /* @__PURE__ */ defineComponent({
4812
+ __name: "WorkspaceControlsInternal",
4813
+ props: { controls: {} },
4814
+ setup(__props) {
4815
+ /**
4816
+ * Internal: renders PluginWorkspaceView's default (main content) slot bound to the
4817
+ * control-schema-derived scoped-slot payload (active view, values, component bindings/props).
4818
+ * Not part of the public SDK surface — see PluginWorkspaceView.vue for the public component.
4819
+ */
4820
+ return (_ctx, _cache) => {
4821
+ return renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(__props.controls)));
4760
4822
  };
4761
- });
4762
- function replaceControlValues(values) {
4763
- for (const key of Object.keys(internalControlValues)) if (!(key in values)) delete internalControlValues[key];
4764
- Object.assign(internalControlValues, values);
4765
- }
4766
- function emitControlValues() {
4767
- options.emitValues({ ...internalControlValues });
4768
- }
4769
- function syncResolvedControlValues() {
4770
- syncingControlValues = true;
4771
- replaceControlValues({
4772
- ...generatedControlDefaults.value,
4773
- ...externalControlValues.value === void 0 ? internalControlValues : externalControlValues.value
4774
- });
4775
- syncingControlValues = false;
4776
4823
  }
4777
- function handleControlValuesUpdate(values) {
4778
- syncingControlValues = true;
4779
- replaceControlValues({
4780
- ...generatedControlDefaults.value,
4781
- ...values
4782
- });
4783
- syncingControlValues = false;
4784
- emitControlValues();
4785
- }
4786
- const resolvedComponentBindings = computed(() => controlValuesToComponentBindings(internalControlValues, options.componentBindings() ?? resolvedModel.value?.componentBindings));
4787
- const resolvedComponentBindingsById = computed(() => controlValuesToComponentBindingsById(internalControlValues, options.componentBindings() ?? resolvedModel.value?.componentBindings));
4788
- const resolvedComponentProps = computed(() => {
4789
- const mapping = options.componentProps() ?? resolvedModel.value?.componentProps;
4790
- return mapping === void 0 ? {} : controlValuesToComponentProps(internalControlValues, mapping);
4791
- });
4792
- const resolvedComponentPropsById = computed(() => {
4793
- const mappings = options.componentPropsById() ?? resolvedModel.value?.componentPropsById;
4794
- if (mappings === void 0) return {};
4795
- return Object.fromEntries(Object.entries(mappings).map(([id, mapping]) => [id, controlValuesToComponentProps(internalControlValues, mapping)]));
4796
- });
4797
- const generatedPillNav = computed(() => {
4798
- if (!resolvedControls.value) return [];
4799
- return controlsToViewItems(resolvedControls.value, resolvedControlOptions.value);
4800
- });
4801
- const generatedDefaultView = computed(() => {
4802
- if (!resolvedControls.value) return "";
4803
- return getDefaultControlView(resolvedControls.value, resolvedControlOptions.value);
4804
- });
4805
- syncResolvedControlValues();
4806
- watch([generatedControlDefaults, externalControlValues], syncResolvedControlValues, { deep: true });
4807
- watch(internalControlValues, () => {
4808
- if (syncingControlValues) return;
4809
- emitControlValues();
4810
- }, {
4811
- deep: true,
4812
- flush: "sync"
4813
- });
4814
- return {
4815
- resolvedModel,
4816
- resolvedControls,
4817
- resolvedControlOptions,
4818
- generatedPillNav,
4819
- generatedDefaultView,
4820
- internalControlValues,
4821
- resolvedComponentBindings,
4822
- resolvedComponentBindingsById,
4823
- resolvedComponentProps,
4824
- resolvedComponentPropsById,
4825
- handleControlValuesUpdate
4826
- };
4827
- }
4824
+ });
4828
4825
  //#endregion
4829
- //#region src/components/PluginWorkspaceView.navigation.ts
4830
- function usePluginWorkspaceNavigation(options) {
4831
- const internalActiveView = ref(options.defaultActiveView());
4832
- const resolvedPillNav = computed(() => {
4833
- if (options.pillNav() !== void 0) return options.pillNav();
4834
- return options.generatedPillNav.value.length > 0 ? [...options.generatedPillNav.value] : void 0;
4835
- });
4836
- const firstConfiguredViewId = computed(() => options.defaultActiveView() ?? firstItemId(options.pillNav()) ?? options.generatedDefaultView.value ?? firstItemId(options.pageSelector()) ?? options.panelIds()[0] ?? "");
4837
- const resolvedActiveView = computed({
4838
- get: () => options.activeView() ?? options.currentPillId() ?? options.currentPageSelectorId() ?? internalActiveView.value ?? firstConfiguredViewId.value,
4839
- set: (value) => {
4840
- internalActiveView.value = value;
4841
- options.emitActiveView(value);
4826
+ //#region src/components/internal/WorkspaceShellInternal.vue
4827
+ var WorkspaceShellInternal_default = /* @__PURE__ */ defineComponent({
4828
+ __name: "WorkspaceShellInternal",
4829
+ props: { shell: {} },
4830
+ emits: [
4831
+ "page-selector-select",
4832
+ "pill-select",
4833
+ "pill-option-select",
4834
+ "plugin-switcher-select",
4835
+ "plugin-switcher-install",
4836
+ "account-menu-select",
4837
+ "sign-out",
4838
+ "notifications-click",
4839
+ "settings-values-change",
4840
+ "admin-click"
4841
+ ],
4842
+ setup(__props, { emit: __emit }) {
4843
+ /**
4844
+ * Internal: AppLayout + AppTopBar for PluginWorkspaceView, driven by a single `shell` model.
4845
+ * Owns the responsive/collapse layout props and the top bar's default rendering; the caller
4846
+ * decides whether to override the `topbar`/`sidebar` slots and supplies the sidebar content.
4847
+ * Not part of the public SDK surface — see PluginWorkspaceView.vue for the public component.
4848
+ */
4849
+ const emit = __emit;
4850
+ function handlePillOptionSelect(option, item) {
4851
+ emit("pill-option-select", option, item);
4842
4852
  }
4843
- });
4844
- const resolvedCurrentPillId = computed(() => options.currentPillId() ?? resolvedActiveView.value);
4845
- const resolvedCurrentPageSelectorId = computed(() => options.currentPageSelectorId() ?? resolvedActiveView.value);
4846
- function setActiveView(viewId) {
4847
- resolvedActiveView.value = viewId;
4848
- }
4849
- function handlePageSelectorSelect(page) {
4850
- setActiveView(page.id);
4851
- options.emitPageSelectorSelect(page);
4852
- }
4853
- function handlePillSelect(item) {
4854
- setActiveView(item.id);
4855
- options.emitPillSelect(item);
4853
+ return (_ctx, _cache) => {
4854
+ return openBlock(), createBlock(AppLayout_default, {
4855
+ class: "mint-plugin-workspace-view",
4856
+ "sidebar-position": __props.shell.sidebarPosition,
4857
+ "sidebar-width": __props.shell.sidebarWidth,
4858
+ floating: __props.shell.floating,
4859
+ "responsive-sidebar": __props.shell.responsiveSidebar,
4860
+ "sidebar-toggle-label": __props.shell.sidebarToggleLabel,
4861
+ "sidebar-close-label": __props.shell.sidebarCloseLabel
4862
+ }, createSlots({
4863
+ topbar: withCtx(() => [renderSlot(_ctx.$slots, "topbar", normalizeProps(guardReactiveProps(__props.shell.controls)), () => [createVNode(AppTopBar_default, {
4864
+ title: __props.shell.title,
4865
+ subtitle: __props.shell.subtitle,
4866
+ variant: __props.shell.topBarVariant,
4867
+ "home-path": __props.shell.homePath,
4868
+ "show-logo": __props.shell.showLogo,
4869
+ "page-selector": __props.shell.pageSelector,
4870
+ "current-page-selector-id": __props.shell.currentPageSelectorId,
4871
+ "plugin-switcher": __props.shell.pluginSwitcher,
4872
+ "pill-nav": __props.shell.pillNav,
4873
+ "current-pill-id": __props.shell.currentPillId,
4874
+ "show-theme-toggle": __props.shell.showThemeToggle,
4875
+ "show-settings": __props.shell.showSettings,
4876
+ "settings-config": __props.shell.settingsConfig,
4877
+ "show-standalone-label": __props.shell.showStandaloneLabel,
4878
+ "standalone-label": __props.shell.standaloneLabel,
4879
+ "account-menu": __props.shell.accountMenu,
4880
+ "show-notifications": __props.shell.showNotifications,
4881
+ "has-notification-dot": __props.shell.hasNotificationDot,
4882
+ "show-admin": __props.shell.showAdmin,
4883
+ "admin-path": __props.shell.adminPath,
4884
+ "user-name": __props.shell.userName,
4885
+ "user-initial": __props.shell.userInitial,
4886
+ "user-email": __props.shell.userEmail,
4887
+ onPageSelectorSelect: _cache[0] || (_cache[0] = ($event) => emit("page-selector-select", $event)),
4888
+ onPillSelect: _cache[1] || (_cache[1] = ($event) => emit("pill-select", $event)),
4889
+ onPillOptionSelect: handlePillOptionSelect,
4890
+ onPluginSwitcherSelect: _cache[2] || (_cache[2] = ($event) => emit("plugin-switcher-select", $event)),
4891
+ onPluginSwitcherInstall: _cache[3] || (_cache[3] = ($event) => emit("plugin-switcher-install")),
4892
+ onAccountMenuSelect: _cache[4] || (_cache[4] = ($event) => emit("account-menu-select", $event)),
4893
+ onSignOut: _cache[5] || (_cache[5] = ($event) => emit("sign-out")),
4894
+ onNotificationsClick: _cache[6] || (_cache[6] = ($event) => emit("notifications-click")),
4895
+ onSettingsValuesChange: _cache[7] || (_cache[7] = ($event) => emit("settings-values-change", $event)),
4896
+ onAdminClick: _cache[8] || (_cache[8] = ($event) => emit("admin-click"))
4897
+ }, createSlots({ _: 2 }, [renderList(__props.shell.topBarSlotNames, (slotName) => {
4898
+ return {
4899
+ name: slotName,
4900
+ fn: withCtx((slotProps) => [renderSlot(_ctx.$slots, slotName, normalizeProps(guardReactiveProps(slotProps ?? {})))])
4901
+ };
4902
+ })]), 1032, [
4903
+ "title",
4904
+ "subtitle",
4905
+ "variant",
4906
+ "home-path",
4907
+ "show-logo",
4908
+ "page-selector",
4909
+ "current-page-selector-id",
4910
+ "plugin-switcher",
4911
+ "pill-nav",
4912
+ "current-pill-id",
4913
+ "show-theme-toggle",
4914
+ "show-settings",
4915
+ "settings-config",
4916
+ "show-standalone-label",
4917
+ "standalone-label",
4918
+ "account-menu",
4919
+ "show-notifications",
4920
+ "has-notification-dot",
4921
+ "show-admin",
4922
+ "admin-path",
4923
+ "user-name",
4924
+ "user-initial",
4925
+ "user-email"
4926
+ ])])]),
4927
+ default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(__props.shell.controls)))]),
4928
+ _: 2
4929
+ }, [__props.shell.hasSidebarSurface ? {
4930
+ name: "sidebar",
4931
+ fn: withCtx(() => [renderSlot(_ctx.$slots, "sidebar", normalizeProps(guardReactiveProps(__props.shell.controls)))]),
4932
+ key: "0"
4933
+ } : void 0]), 1032, [
4934
+ "sidebar-position",
4935
+ "sidebar-width",
4936
+ "floating",
4937
+ "responsive-sidebar",
4938
+ "sidebar-toggle-label",
4939
+ "sidebar-close-label"
4940
+ ]);
4941
+ };
4856
4942
  }
4857
- return {
4858
- resolvedPillNav,
4859
- firstConfiguredViewId,
4860
- resolvedActiveView,
4861
- resolvedCurrentPillId,
4862
- resolvedCurrentPageSelectorId,
4863
- setActiveView,
4864
- handlePageSelectorSelect,
4865
- handlePillSelect
4866
- };
4867
- }
4868
- function firstItemId(items) {
4869
- const item = items?.[0];
4870
- if (item === void 0) return void 0;
4871
- return typeof item === "string" ? item : item.id;
4872
- }
4943
+ });
4873
4944
  //#endregion
4874
- //#region src/components/PluginWorkspaceView.shell.ts
4875
- var topBarForwardedSlots = new Set([
4876
- "icon",
4877
- "logo",
4878
- "page-selector-icon",
4879
- "page-selector-item-icon",
4880
- "nav",
4881
- "center",
4882
- "actions",
4883
- "account-menu-items",
4884
- "account-menu-item-icon",
4885
- "settings-appearance"
4886
- ]);
4887
- var sidebarForwardedSlots = new Set([
4888
- "header",
4889
- "collapsed",
4890
- "collapsed-footer",
4891
- "footer"
4892
- ]);
4893
- function getPluginWorkspaceTopBarSlotNames(slots) {
4894
- return Object.keys(slots).filter((name) => topBarForwardedSlots.has(name) || name.startsWith("settings-tab-"));
4895
- }
4896
- function getPluginWorkspaceSidebarSlotNames(slots) {
4897
- return Object.keys(slots).filter((name) => sidebarForwardedSlots.has(name) || name.startsWith("section-"));
4898
- }
4899
- function hasPluginWorkspaceSidebarSurface(options) {
4900
- if (!options.showSidebar) return false;
4901
- return Object.keys(options.panels).length > 0 || Object.keys(options.forms).length > 0 || options.model !== void 0 || options.controls !== void 0 || options.showSidebarWhenEmpty || options.sidebarContentId !== void 0 || options.sidebarTitle !== void 0 || options.sidebarSubtitle !== void 0 || options.sidebarBadge !== void 0 || options.hasSidebarSlot || options.sidebarSlotCount > 0;
4902
- }
4945
+ //#region src/components/internal/WorkspaceSidebarInternal.vue
4946
+ var WorkspaceSidebarInternal_default = /* @__PURE__ */ defineComponent({
4947
+ __name: "WorkspaceSidebarInternal",
4948
+ props: { sidebar: {} },
4949
+ emits: [
4950
+ "update:modelValue",
4951
+ "update:collapsed",
4952
+ "update:toggle",
4953
+ "section-action",
4954
+ "form-submit",
4955
+ "form-cancel"
4956
+ ],
4957
+ setup(__props) {
4958
+ /**
4959
+ * Internal: AppSidebar for PluginWorkspaceView, driven by a single `sidebar` model covering
4960
+ * chrome, panels/forms, collapse behavior, and the compact control-schema props that drive
4961
+ * AppSidebar's auto-generated form.
4962
+ * Not part of the public SDK surface — see PluginWorkspaceView.vue for the public component.
4963
+ */
4964
+ return (_ctx, _cache) => {
4965
+ return openBlock(), createBlock(AppSidebar_default, {
4966
+ title: __props.sidebar.title,
4967
+ subtitle: __props.sidebar.subtitle,
4968
+ badge: __props.sidebar.badge,
4969
+ variant: __props.sidebar.variant,
4970
+ panels: __props.sidebar.panels,
4971
+ "active-view": __props.sidebar.activeView,
4972
+ floating: __props.sidebar.floating,
4973
+ dense: __props.sidebar.dense,
4974
+ width: __props.sidebar.width,
4975
+ side: __props.sidebar.side,
4976
+ forms: __props.sidebar.forms,
4977
+ "content-id": __props.sidebar.contentId,
4978
+ "show-when-empty": __props.sidebar.showWhenEmpty,
4979
+ model: __props.sidebar.model,
4980
+ controls: __props.sidebar.controlSchema,
4981
+ "control-options": __props.sidebar.controlOptions,
4982
+ values: __props.sidebar.values,
4983
+ "form-enhancements": __props.sidebar.formEnhancements,
4984
+ "show-form-actions": __props.sidebar.showFormActions,
4985
+ "form-loading": __props.sidebar.formLoading,
4986
+ "form-disabled": __props.sidebar.formDisabled,
4987
+ "form-readonly": __props.sidebar.formReadonly,
4988
+ "form-size": __props.sidebar.formSize,
4989
+ collapsible: __props.sidebar.collapsible,
4990
+ collapsed: __props.sidebar.collapsed,
4991
+ "default-collapsed": __props.sidebar.defaultCollapsed,
4992
+ "collapsed-width": __props.sidebar.collapsedWidth,
4993
+ "collapse-button-label": __props.sidebar.collapseButtonLabel,
4994
+ "expand-button-label": __props.sidebar.expandButtonLabel,
4995
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.$emit("update:modelValue", $event)),
4996
+ "onUpdate:collapsed": _cache[1] || (_cache[1] = ($event) => _ctx.$emit("update:collapsed", $event)),
4997
+ "onUpdate:toggle": _cache[2] || (_cache[2] = (sectionId, value) => _ctx.$emit("update:toggle", sectionId, value)),
4998
+ onSectionAction: _cache[3] || (_cache[3] = (sectionId, actionId) => _ctx.$emit("section-action", sectionId, actionId)),
4999
+ onFormSubmit: _cache[4] || (_cache[4] = (sectionId, values) => _ctx.$emit("form-submit", sectionId, values)),
5000
+ onFormCancel: _cache[5] || (_cache[5] = ($event) => _ctx.$emit("form-cancel", $event))
5001
+ }, createSlots({ _: 2 }, [renderList(__props.sidebar.slotNames, (slotName) => {
5002
+ return {
5003
+ name: slotName,
5004
+ fn: withCtx((slotProps) => [renderSlot(_ctx.$slots, slotName, normalizeProps(guardReactiveProps(slotProps ?? {})))])
5005
+ };
5006
+ })]), 1032, [
5007
+ "title",
5008
+ "subtitle",
5009
+ "badge",
5010
+ "variant",
5011
+ "panels",
5012
+ "active-view",
5013
+ "floating",
5014
+ "dense",
5015
+ "width",
5016
+ "side",
5017
+ "forms",
5018
+ "content-id",
5019
+ "show-when-empty",
5020
+ "model",
5021
+ "controls",
5022
+ "control-options",
5023
+ "values",
5024
+ "form-enhancements",
5025
+ "show-form-actions",
5026
+ "form-loading",
5027
+ "form-disabled",
5028
+ "form-readonly",
5029
+ "form-size",
5030
+ "collapsible",
5031
+ "collapsed",
5032
+ "default-collapsed",
5033
+ "collapsed-width",
5034
+ "collapse-button-label",
5035
+ "expand-button-label"
5036
+ ]);
5037
+ };
5038
+ }
5039
+ });
4903
5040
  //#endregion
4904
5041
  //#region src/components/PluginWorkspaceView.vue
4905
5042
  var PluginWorkspaceView_default = /* @__PURE__ */ defineComponent({
@@ -5080,55 +5217,11 @@ var PluginWorkspaceView_default = /* @__PURE__ */ defineComponent({
5080
5217
  saveDisabled: computed(() => props.experimentSaveDisabled),
5081
5218
  saveDisabledMessage: computed(() => props.experimentSaveDisabledMessage)
5082
5219
  });
5083
- const topBarSlotNames = computed(() => getPluginWorkspaceTopBarSlotNames(slots));
5084
- const sidebarSlotNames = computed(() => getPluginWorkspaceSidebarSlotNames(slots));
5085
- const { generatedPillNav, generatedDefaultView, internalControlValues, resolvedComponentBindings, resolvedComponentBindingsById, resolvedComponentProps, resolvedComponentPropsById, handleControlValuesUpdate } = usePluginWorkspaceControls({
5086
- model: () => props.model,
5087
- controls: () => props.controls,
5088
- controlOptions: () => props.controlOptions,
5089
- modelValue: () => props.modelValue,
5090
- values: () => props.values,
5091
- componentBindings: () => props.componentBindings,
5092
- componentProps: () => props.componentProps,
5093
- componentPropsById: () => props.componentPropsById,
5094
- emitValues: (values) => {
5095
- emit("update:modelValue", values);
5096
- emit("update:values", values);
5097
- }
5220
+ const { shell, sidebar, controls, handleControlValuesUpdate, handlePageSelectorSelect, handlePillSelect } = usePluginWorkspace({
5221
+ props,
5222
+ slots,
5223
+ emit
5098
5224
  });
5099
- const { resolvedPillNav, resolvedActiveView, resolvedCurrentPillId, resolvedCurrentPageSelectorId, setActiveView, handlePageSelectorSelect, handlePillSelect } = usePluginWorkspaceNavigation({
5100
- activeView: () => props.activeView,
5101
- defaultActiveView: () => props.defaultActiveView,
5102
- currentPillId: () => props.currentPillId,
5103
- currentPageSelectorId: () => props.currentPageSelectorId,
5104
- pillNav: () => props.pillNav,
5105
- pageSelector: () => props.pageSelector,
5106
- panelIds: () => Object.keys(props.panels),
5107
- generatedPillNav,
5108
- generatedDefaultView,
5109
- emitActiveView: (viewId) => emit("update:activeView", viewId),
5110
- emitPageSelectorSelect: (page) => emit("page-selector-select", page),
5111
- emitPillSelect: (item) => emit("pill-select", item)
5112
- });
5113
- const hasSidebarSurface = computed(() => {
5114
- return hasPluginWorkspaceSidebarSurface({
5115
- showSidebar: props.showSidebar,
5116
- panels: props.panels,
5117
- forms: props.forms,
5118
- model: props.model,
5119
- controls: props.controls,
5120
- showSidebarWhenEmpty: props.showSidebarWhenEmpty,
5121
- sidebarContentId: props.sidebarContentId,
5122
- sidebarTitle: props.sidebarTitle,
5123
- sidebarSubtitle: props.sidebarSubtitle,
5124
- sidebarBadge: props.sidebarBadge,
5125
- hasSidebarSlot: Boolean(slots.sidebar),
5126
- sidebarSlotCount: sidebarSlotNames.value.length
5127
- });
5128
- });
5129
- function handlePillOptionSelect(option, item) {
5130
- emit("pill-option-select", option, item);
5131
- }
5132
5225
  function handleToggle(sectionId, value) {
5133
5226
  emit("update:toggle", sectionId, value);
5134
5227
  }
@@ -5139,189 +5232,58 @@ var PluginWorkspaceView_default = /* @__PURE__ */ defineComponent({
5139
5232
  emit("form-cancel", sectionId);
5140
5233
  }
5141
5234
  return (_ctx, _cache) => {
5142
- return openBlock(), createBlock(AppLayout_default, {
5143
- class: "mint-plugin-workspace-view",
5144
- "sidebar-position": __props.sidebarPosition,
5145
- "sidebar-width": __props.sidebarWidth,
5146
- floating: __props.floating,
5147
- "responsive-sidebar": __props.responsiveSidebar,
5148
- "sidebar-toggle-label": __props.sidebarToggleLabel,
5149
- "sidebar-close-label": __props.sidebarCloseLabel
5235
+ return openBlock(), createBlock(WorkspaceShellInternal_default, {
5236
+ shell: unref(shell),
5237
+ onPageSelectorSelect: unref(handlePageSelectorSelect),
5238
+ onPillSelect: unref(handlePillSelect),
5239
+ onPillOptionSelect: _cache[2] || (_cache[2] = (option, item) => emit("pill-option-select", option, item)),
5240
+ onPluginSwitcherSelect: _cache[3] || (_cache[3] = (plugin) => emit("plugin-switcher-select", plugin)),
5241
+ onPluginSwitcherInstall: _cache[4] || (_cache[4] = ($event) => emit("plugin-switcher-install")),
5242
+ onAccountMenuSelect: _cache[5] || (_cache[5] = (item) => emit("account-menu-select", item)),
5243
+ onSignOut: _cache[6] || (_cache[6] = ($event) => emit("sign-out")),
5244
+ onNotificationsClick: _cache[7] || (_cache[7] = ($event) => emit("notifications-click")),
5245
+ onSettingsValuesChange: _cache[8] || (_cache[8] = ($event) => emit("settings-values-change", $event)),
5246
+ onAdminClick: _cache[9] || (_cache[9] = ($event) => emit("admin-click"))
5150
5247
  }, createSlots({
5151
- topbar: withCtx(() => [renderSlot(_ctx.$slots, "topbar", {
5152
- activeView: unref(resolvedActiveView),
5153
- setActiveView: unref(setActiveView),
5154
- values: unref(internalControlValues),
5155
- componentBindings: unref(resolvedComponentBindings),
5156
- componentBindingsById: unref(resolvedComponentBindingsById),
5157
- componentProps: unref(resolvedComponentProps),
5158
- componentPropsById: unref(resolvedComponentPropsById)
5159
- }, () => [createVNode(AppTopBar_default, {
5160
- title: __props.title,
5161
- subtitle: __props.subtitle,
5162
- variant: __props.topBarVariant,
5163
- "home-path": __props.homePath,
5164
- "show-logo": __props.showLogo,
5165
- "page-selector": __props.pageSelector,
5166
- "current-page-selector-id": unref(resolvedCurrentPageSelectorId),
5167
- "plugin-switcher": __props.pluginSwitcher,
5168
- "pill-nav": unref(resolvedPillNav),
5169
- "current-pill-id": unref(resolvedCurrentPillId),
5170
- "show-theme-toggle": __props.showThemeToggle,
5171
- "show-settings": __props.showSettings,
5172
- "settings-config": __props.settingsConfig,
5173
- "show-standalone-label": __props.showStandaloneLabel,
5174
- "standalone-label": __props.standaloneLabel,
5175
- "account-menu": __props.accountMenu,
5176
- "show-notifications": __props.showNotifications,
5177
- "has-notification-dot": __props.hasNotificationDot,
5178
- "show-admin": __props.showAdmin,
5179
- "admin-path": __props.adminPath,
5180
- "user-name": __props.userName,
5181
- "user-initial": __props.userInitial,
5182
- "user-email": __props.userEmail,
5183
- onPageSelectorSelect: unref(handlePageSelectorSelect),
5184
- onPillSelect: unref(handlePillSelect),
5185
- onPillOptionSelect: handlePillOptionSelect,
5186
- onPluginSwitcherSelect: _cache[0] || (_cache[0] = ($event) => emit("plugin-switcher-select", $event)),
5187
- onPluginSwitcherInstall: _cache[1] || (_cache[1] = ($event) => emit("plugin-switcher-install")),
5188
- onAccountMenuSelect: _cache[2] || (_cache[2] = ($event) => emit("account-menu-select", $event)),
5189
- onSignOut: _cache[3] || (_cache[3] = ($event) => emit("sign-out")),
5190
- onNotificationsClick: _cache[4] || (_cache[4] = ($event) => emit("notifications-click")),
5191
- onSettingsValuesChange: _cache[5] || (_cache[5] = ($event) => emit("settings-values-change", $event)),
5192
- onAdminClick: _cache[6] || (_cache[6] = ($event) => emit("admin-click"))
5193
- }, createSlots({ _: 2 }, [renderList(topBarSlotNames.value, (slotName) => {
5194
- return {
5195
- name: slotName,
5196
- fn: withCtx((slotProps) => [renderSlot(_ctx.$slots, slotName, normalizeProps(guardReactiveProps(slotProps ?? {})))])
5197
- };
5198
- })]), 1032, [
5199
- "title",
5200
- "subtitle",
5201
- "variant",
5202
- "home-path",
5203
- "show-logo",
5204
- "page-selector",
5205
- "current-page-selector-id",
5206
- "plugin-switcher",
5207
- "pill-nav",
5208
- "current-pill-id",
5209
- "show-theme-toggle",
5210
- "show-settings",
5211
- "settings-config",
5212
- "show-standalone-label",
5213
- "standalone-label",
5214
- "account-menu",
5215
- "show-notifications",
5216
- "has-notification-dot",
5217
- "show-admin",
5218
- "admin-path",
5219
- "user-name",
5220
- "user-initial",
5221
- "user-email",
5222
- "onPageSelectorSelect",
5223
- "onPillSelect"
5224
- ])])]),
5225
- default: withCtx(() => [renderSlot(_ctx.$slots, "default", {
5226
- activeView: unref(resolvedActiveView),
5227
- setActiveView: unref(setActiveView),
5228
- values: unref(internalControlValues),
5229
- componentBindings: unref(resolvedComponentBindings),
5230
- componentBindingsById: unref(resolvedComponentBindingsById),
5231
- componentProps: unref(resolvedComponentProps),
5232
- componentPropsById: unref(resolvedComponentPropsById)
5233
- })]),
5248
+ default: withCtx(() => [createVNode(WorkspaceControlsInternal_default, { controls: unref(controls) }, {
5249
+ default: withCtx((controlsScope) => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(controlsScope)))]),
5250
+ _: 3
5251
+ }, 8, ["controls"])]),
5234
5252
  _: 2
5235
- }, [hasSidebarSurface.value ? {
5236
- name: "sidebar",
5237
- fn: withCtx(() => [renderSlot(_ctx.$slots, "sidebar", {
5238
- activeView: unref(resolvedActiveView),
5239
- setActiveView: unref(setActiveView),
5240
- values: unref(internalControlValues),
5241
- componentBindings: unref(resolvedComponentBindings),
5242
- componentBindingsById: unref(resolvedComponentBindingsById),
5243
- componentProps: unref(resolvedComponentProps),
5244
- componentPropsById: unref(resolvedComponentPropsById)
5245
- }, () => [createVNode(AppSidebar_default, {
5246
- title: __props.sidebarTitle,
5247
- subtitle: __props.sidebarSubtitle,
5248
- badge: __props.sidebarBadge,
5249
- variant: __props.sidebarVariant,
5250
- panels: __props.panels,
5251
- "active-view": unref(resolvedActiveView),
5252
- floating: false,
5253
- dense: __props.dense,
5254
- width: __props.sidebarWidth,
5255
- side: __props.sidebarPosition,
5256
- forms: __props.forms,
5257
- "content-id": __props.sidebarContentId,
5258
- "show-when-empty": __props.showSidebarWhenEmpty || __props.sidebarContentId !== void 0,
5259
- model: __props.model,
5260
- controls: __props.controls,
5261
- "control-options": __props.controlOptions,
5262
- values: unref(internalControlValues),
5263
- "form-enhancements": __props.formEnhancements,
5264
- "show-form-actions": __props.showFormActions,
5265
- "form-loading": __props.formLoading,
5266
- "form-disabled": __props.formDisabled,
5267
- "form-readonly": __props.formReadonly,
5268
- "form-size": __props.formSize,
5269
- collapsible: __props.sidebarCollapsible,
5270
- collapsed: __props.sidebarCollapsed,
5271
- "default-collapsed": __props.defaultSidebarCollapsed,
5272
- "collapsed-width": __props.sidebarCollapsedWidth,
5273
- "collapse-button-label": __props.sidebarCollapseButtonLabel,
5274
- "expand-button-label": __props.sidebarExpandButtonLabel,
5275
- "onUpdate:modelValue": unref(handleControlValuesUpdate),
5276
- "onUpdate:collapsed": _cache[7] || (_cache[7] = ($event) => emit("update:sidebarCollapsed", $event)),
5277
- "onUpdate:toggle": handleToggle,
5278
- onSectionAction: _cache[8] || (_cache[8] = (sectionId, actionId) => emit("section-action", sectionId, actionId)),
5279
- onFormSubmit: handleFormSubmit,
5280
- onFormCancel: handleFormCancel
5281
- }, createSlots({ _: 2 }, [renderList(sidebarSlotNames.value, (slotName) => {
5253
+ }, [
5254
+ unref(slots).topbar ? {
5255
+ name: "topbar",
5256
+ fn: withCtx((scope) => [renderSlot(_ctx.$slots, "topbar", normalizeProps(guardReactiveProps(scope)))]),
5257
+ key: "0"
5258
+ } : void 0,
5259
+ renderList(unref(shell).topBarSlotNames, (slotName) => {
5282
5260
  return {
5283
5261
  name: slotName,
5284
5262
  fn: withCtx((slotProps) => [renderSlot(_ctx.$slots, slotName, normalizeProps(guardReactiveProps(slotProps ?? {})))])
5285
5263
  };
5286
- })]), 1032, [
5287
- "title",
5288
- "subtitle",
5289
- "badge",
5290
- "variant",
5291
- "panels",
5292
- "active-view",
5293
- "dense",
5294
- "width",
5295
- "side",
5296
- "forms",
5297
- "content-id",
5298
- "show-when-empty",
5299
- "model",
5300
- "controls",
5301
- "control-options",
5302
- "values",
5303
- "form-enhancements",
5304
- "show-form-actions",
5305
- "form-loading",
5306
- "form-disabled",
5307
- "form-readonly",
5308
- "form-size",
5309
- "collapsible",
5310
- "collapsed",
5311
- "default-collapsed",
5312
- "collapsed-width",
5313
- "collapse-button-label",
5314
- "expand-button-label",
5315
- "onUpdate:modelValue"
5316
- ])])]),
5317
- key: "0"
5318
- } : void 0]), 1032, [
5319
- "sidebar-position",
5320
- "sidebar-width",
5321
- "floating",
5322
- "responsive-sidebar",
5323
- "sidebar-toggle-label",
5324
- "sidebar-close-label"
5264
+ }),
5265
+ unref(shell).hasSidebarSurface ? {
5266
+ name: "sidebar",
5267
+ fn: withCtx((scope) => [renderSlot(_ctx.$slots, "sidebar", normalizeProps(guardReactiveProps(scope)), () => [createVNode(WorkspaceSidebarInternal_default, {
5268
+ sidebar: unref(sidebar),
5269
+ "onUpdate:modelValue": unref(handleControlValuesUpdate),
5270
+ "onUpdate:collapsed": _cache[0] || (_cache[0] = ($event) => emit("update:sidebarCollapsed", $event)),
5271
+ "onUpdate:toggle": handleToggle,
5272
+ onSectionAction: _cache[1] || (_cache[1] = (sectionId, actionId) => emit("section-action", sectionId, actionId)),
5273
+ onFormSubmit: handleFormSubmit,
5274
+ onFormCancel: handleFormCancel
5275
+ }, createSlots({ _: 2 }, [renderList(unref(sidebar).slotNames, (slotName) => {
5276
+ return {
5277
+ name: slotName,
5278
+ fn: withCtx((slotProps) => [renderSlot(_ctx.$slots, slotName, normalizeProps(guardReactiveProps(slotProps ?? {})))])
5279
+ };
5280
+ })]), 1032, ["sidebar", "onUpdate:modelValue"])])]),
5281
+ key: "1"
5282
+ } : void 0
5283
+ ]), 1032, [
5284
+ "shell",
5285
+ "onPageSelectorSelect",
5286
+ "onPillSelect"
5325
5287
  ]);
5326
5288
  };
5327
5289
  }
@@ -7035,6 +6997,18 @@ var WellEditPopupInternal_default = /* @__PURE__ */ defineComponent({
7035
6997
  if (e.key === "Escape") close();
7036
6998
  }
7037
6999
  useEventListener(() => document, "keydown", handleKeydown);
7000
+ const containerRef = ref(null);
7001
+ const trapActive = ref(false);
7002
+ useFocusTrap({
7003
+ containerRef,
7004
+ active: trapActive
7005
+ });
7006
+ onMounted(() => {
7007
+ trapActive.value = true;
7008
+ });
7009
+ onBeforeUnmount(() => {
7010
+ trapActive.value = false;
7011
+ });
7038
7012
  const sampleTypeButtons = [
7039
7013
  {
7040
7014
  type: "sample",
@@ -7062,8 +7036,11 @@ var WellEditPopupInternal_default = /* @__PURE__ */ defineComponent({
7062
7036
  class: "mint-well-edit-popup__backdrop",
7063
7037
  onClick: close
7064
7038
  }), createElementVNode("div", {
7039
+ ref_key: "containerRef",
7040
+ ref: containerRef,
7065
7041
  class: "mint-well-edit-popup",
7066
7042
  style: normalizeStyle(popupStyle.value),
7043
+ tabindex: "-1",
7067
7044
  onClick: _cache[5] || (_cache[5] = withModifiers(() => {}, ["stop"]))
7068
7045
  }, [
7069
7046
  createElementVNode("div", _hoisted_1$42, [createElementVNode("div", _hoisted_2$38, [createElementVNode("span", _hoisted_3$34, toDisplayString(__props.wellId), 1), _cache[6] || (_cache[6] = createElementVNode("span", { class: "mint-well-edit-popup__title" }, "Edit Well", -1))]), createElementVNode("button", {
@@ -12529,9 +12506,6 @@ var ComponentBindingRenderer_default = /* @__PURE__ */ _plugin_vue_export_helper
12529
12506
  default: return base;
12530
12507
  }
12531
12508
  }
12532
- function isRecord(value) {
12533
- return typeof value === "object" && value !== null && !Array.isArray(value);
12534
- }
12535
12509
  return (_ctx, _cache) => {
12536
12510
  return openBlock(), createElementBlock("div", { class: normalizeClass(rendererClasses.value) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(renderableBindings.value, (renderableBinding) => {
12537
12511
  return openBlock(), createElementBlock("section", {
@@ -12544,7 +12518,140 @@ var ComponentBindingRenderer_default = /* @__PURE__ */ _plugin_vue_export_helper
12544
12518
  }), 128)), renderableBindings.value.length === 0 ? (openBlock(), createElementBlock("p", _hoisted_8$15, toDisplayString(__props.emptyText), 1)) : createCommentVNode("", true)], 2);
12545
12519
  };
12546
12520
  }
12547
- }), [["__scopeId", "data-v-ec0e5797"]]);
12521
+ }), [["__scopeId", "data-v-e6c3e169"]]);
12522
+ //#endregion
12523
+ //#region src/composables/workspaceRecipes.ts
12524
+ /**
12525
+ * Merges `initialValues`/external `modelValue`/`values` on top of a base
12526
+ * `ControlWorkspaceOptions.initialValues`, matching the layering FormBuilder expects: base
12527
+ * defaults, then caller-supplied initial values, then live external values win last. Shared by
12528
+ * {@link controlWorkspaceProps} and {@link bioTemplatePresetWorkspaceProps} so both "generate a
12529
+ * workspace from options, initialValues, and v-model" views merge options identically.
12530
+ */
12531
+ function resolveControlOptionsWithExternalValues(base, initialValues, externalValues) {
12532
+ if (initialValues === void 0 && externalValues === void 0) return base;
12533
+ return {
12534
+ ...base,
12535
+ initialValues: {
12536
+ ...base.initialValues ?? {},
12537
+ ...initialValues ?? {},
12538
+ ...externalValues ?? {}
12539
+ }
12540
+ };
12541
+ }
12542
+ /**
12543
+ * Resolves ControlWorkspaceView's `model`/`controls`/`controlOptions`/`initialValues`/
12544
+ * `modelValue`/`values` props into the schema + options pair `useControlWorkspace()` needs.
12545
+ * Pure and framework-free so callers wrap each field in their own `computed()`.
12546
+ *
12547
+ * @example Recommended
12548
+ * ```ts
12549
+ * const resolved = computed(() => controlWorkspaceProps(props))
12550
+ * const resolvedControls = computed(() => resolved.value.resolvedControls)
12551
+ * ```
12552
+ */
12553
+ function controlWorkspaceProps(props) {
12554
+ const externalValues = props.modelValue ?? props.values;
12555
+ const resolvedModel = resolveControlModel(props.model);
12556
+ return {
12557
+ externalValues,
12558
+ resolvedModel,
12559
+ resolvedControls: props.controls ?? resolvedModel?.controls ?? {},
12560
+ resolvedControlOptions: resolveControlOptionsWithExternalValues(mergeControlWorkspaceOptions(resolvedModel?.controlOptions, props.controlOptions), props.initialValues, externalValues)
12561
+ };
12562
+ }
12563
+ /**
12564
+ * Maps DoseDesignWorkspaceView's props straight through to the identically-named
12565
+ * ControlWorkspaceView props it wraps — the ~25-key pass-through list that used to be spelled
12566
+ * out attribute-by-attribute in the template. `model` is the caller's already-resolved dose
12567
+ * design model, not the raw (possibly absent) `props.model`.
12568
+ *
12569
+ * @example Recommended
12570
+ * ```vue
12571
+ * <ControlWorkspaceView v-bind="doseDesignWorkspaceProps(props, resolvedModel)" />
12572
+ * ```
12573
+ */
12574
+ function doseDesignWorkspaceProps(props, model) {
12575
+ return {
12576
+ model,
12577
+ workspace: props.workspace,
12578
+ controlOptions: props.controlOptions,
12579
+ initialValues: props.initialValues,
12580
+ modelValue: props.modelValue,
12581
+ values: props.values,
12582
+ title: props.title,
12583
+ subtitle: props.subtitle,
12584
+ topBarVariant: props.topBarVariant,
12585
+ sidebarWidth: props.sidebarWidth,
12586
+ sidebarVariant: props.sidebarVariant,
12587
+ responsiveSidebar: props.responsiveSidebar,
12588
+ sidebarPosition: props.sidebarPosition,
12589
+ sidebarTitle: props.sidebarTitle,
12590
+ sidebarSubtitle: props.sidebarSubtitle,
12591
+ sidebarBadge: props.sidebarBadge,
12592
+ floating: props.floating,
12593
+ dense: props.dense,
12594
+ showSettings: props.showSettings,
12595
+ showFormActions: props.showFormActions,
12596
+ formEnhancements: props.formEnhancements,
12597
+ formLoading: props.formLoading,
12598
+ formDisabled: props.formDisabled,
12599
+ formReadonly: props.formReadonly,
12600
+ formSize: props.formSize
12601
+ };
12602
+ }
12603
+ /**
12604
+ * Merges BioTemplateExperimentWorkspaceView's grouped `status` prop over its individual
12605
+ * `loading`/`error`/`hasExperiment`/... props: `status` wins whenever the corresponding field
12606
+ * on it is set, otherwise the flat prop (or its default) is used. Centralizes the six
12607
+ * independent fallback rules generated plugin pages rely on when they pass a request/experiment
12608
+ * `status` object instead of wiring each field by hand.
12609
+ */
12610
+ function bioTemplateExperimentWorkspaceProps(props) {
12611
+ const status = props.status;
12612
+ return {
12613
+ loading: status?.loading !== void 0 || status?.saving !== void 0 ? Boolean(status?.loading) || Boolean(status?.saving) : Boolean(props.loading),
12614
+ error: status?.error !== void 0 ? status.error : props.error,
12615
+ hasExperiment: status?.hasExperiment ?? props.hasExperiment ?? false,
12616
+ currentExperimentId: status?.currentExperimentId ?? props.currentExperimentId,
12617
+ lastLoadedAt: status?.lastLoadedAt !== void 0 ? status.lastLoadedAt : props.lastLoadedAt,
12618
+ lastSavedAt: status?.lastSavedAt !== void 0 ? status.lastSavedAt : props.lastSavedAt
12619
+ };
12620
+ }
12621
+ /**
12622
+ * Assembles the prop object BioTemplatePackWorkspaceView binds onto the
12623
+ * BioTemplateExperimentWorkspaceView it wraps: its own display props passed straight through,
12624
+ * plus the pack-derived `target`/`label`/`status`/`actions` computed by the caller.
12625
+ */
12626
+ function bioTemplatePackWorkspaceProps(props, derived) {
12627
+ return {
12628
+ target: derived.target,
12629
+ kind: "collection",
12630
+ label: derived.label,
12631
+ message: props.message,
12632
+ status: derived.status,
12633
+ actions: derived.actions,
12634
+ dense: props.dense,
12635
+ readonly: props.readonly,
12636
+ showStatus: props.showStatus,
12637
+ showTemplateSummary: props.showTemplateSummary,
12638
+ loadLabel: props.loadLabel,
12639
+ resetLabel: props.resetLabel,
12640
+ saveLabel: props.saveLabel
12641
+ };
12642
+ }
12643
+ /**
12644
+ * Resolves BioTemplatePresetWorkspaceView's `workspaceOptions`/`initialValues`/`modelValue`/
12645
+ * `values` props into the single options object `useBioTemplatePresetWorkspace()` needs,
12646
+ * reusing the same base/initialValues/external-values layering as {@link controlWorkspaceProps}.
12647
+ */
12648
+ function bioTemplatePresetWorkspaceProps(props) {
12649
+ const externalValues = props.modelValue ?? props.values;
12650
+ return {
12651
+ externalValues,
12652
+ resolvedWorkspaceOptions: resolveControlOptionsWithExternalValues(props.workspaceOptions ?? {}, props.initialValues, externalValues)
12653
+ };
12654
+ }
12548
12655
  //#endregion
12549
12656
  //#region src/components/ControlWorkspaceView.vue?vue&type=script&setup=true&lang.ts
12550
12657
  var _hoisted_1$29 = { class: "mint-control-workspace-view__content" };
@@ -12624,23 +12731,11 @@ var ControlWorkspaceView_default = /* @__PURE__ */ _plugin_vue_export_helper_def
12624
12731
  */
12625
12732
  const emit = __emit;
12626
12733
  const props = __props;
12627
- const externalValues = computed(() => props.modelValue ?? props.values);
12628
- const resolvedModel = computed(() => {
12629
- return resolveControlModel(props.model);
12630
- });
12631
- const resolvedControls = computed(() => props.controls ?? resolvedModel.value?.controls ?? {});
12632
- const baseControlOptions = computed(() => mergeControlWorkspaceOptions(resolvedModel.value?.controlOptions ?? {}, props.controlOptions));
12633
- const resolvedControlOptions = computed(() => {
12634
- if (props.initialValues === void 0 && externalValues.value === void 0) return baseControlOptions.value;
12635
- return {
12636
- ...baseControlOptions.value,
12637
- initialValues: {
12638
- ...baseControlOptions.value.initialValues ?? {},
12639
- ...props.initialValues ?? {},
12640
- ...externalValues.value ?? {}
12641
- }
12642
- };
12643
- });
12734
+ const resolvedWorkspaceModel = computed(() => controlWorkspaceProps(props));
12735
+ const externalValues = computed(() => resolvedWorkspaceModel.value.externalValues);
12736
+ const resolvedModel = computed(() => resolvedWorkspaceModel.value.resolvedModel);
12737
+ const resolvedControls = computed(() => resolvedWorkspaceModel.value.resolvedControls);
12738
+ const resolvedControlOptions = computed(() => resolvedWorkspaceModel.value.resolvedControlOptions);
12644
12739
  let generatedWorkspaceScope;
12645
12740
  function createGeneratedWorkspace(seedValues = {}) {
12646
12741
  generatedWorkspaceScope?.stop();
@@ -12810,7 +12905,7 @@ var ControlWorkspaceView_default = /* @__PURE__ */ _plugin_vue_export_helper_def
12810
12905
  ]);
12811
12906
  };
12812
12907
  }
12813
- }), [["__scopeId", "data-v-8121a7e6"]]);
12908
+ }), [["__scopeId", "data-v-f3b22df2"]]);
12814
12909
  //#endregion
12815
12910
  //#region src/components/DoseDesignWorkspaceView.vue?vue&type=script&setup=true&lang.ts
12816
12911
  var _hoisted_1$28 = { class: "mint-dose-design-workspace" };
@@ -12892,6 +12987,7 @@ var DoseDesignWorkspaceView_default = /* @__PURE__ */ _plugin_vue_export_helper_
12892
12987
  const props = __props;
12893
12988
  const emit = __emit;
12894
12989
  const resolvedModel = computed(() => props.model ?? defineDoseDesignControlModel(props.doseDesignOptions));
12990
+ const controlWorkspaceRecipe = computed(() => doseDesignWorkspaceProps(props, resolvedModel.value));
12895
12991
  function resolvedPlateId() {
12896
12992
  return props.plateId ?? props.doseDesignOptions.componentProps?.plateId ?? "plate";
12897
12993
  }
@@ -12920,69 +13016,18 @@ var DoseDesignWorkspaceView_default = /* @__PURE__ */ _plugin_vue_export_helper_
12920
13016
  };
12921
13017
  }
12922
13018
  return (_ctx, _cache) => {
12923
- return openBlock(), createBlock(ControlWorkspaceView_default, {
12924
- model: resolvedModel.value,
12925
- workspace: __props.workspace,
12926
- "control-options": __props.controlOptions,
12927
- "initial-values": __props.initialValues,
12928
- "model-value": __props.modelValue,
12929
- values: __props.values,
12930
- title: __props.title,
12931
- subtitle: __props.subtitle,
12932
- "top-bar-variant": __props.topBarVariant,
12933
- "sidebar-width": __props.sidebarWidth,
12934
- "sidebar-variant": __props.sidebarVariant,
12935
- "responsive-sidebar": __props.responsiveSidebar,
12936
- "sidebar-position": __props.sidebarPosition,
12937
- "sidebar-title": __props.sidebarTitle,
12938
- "sidebar-subtitle": __props.sidebarSubtitle,
12939
- "sidebar-badge": __props.sidebarBadge,
12940
- floating: __props.floating,
12941
- dense: __props.dense,
12942
- "show-settings": __props.showSettings,
12943
- "show-form-actions": __props.showFormActions,
12944
- "form-enhancements": __props.formEnhancements,
12945
- "form-loading": __props.formLoading,
12946
- "form-disabled": __props.formDisabled,
12947
- "form-readonly": __props.formReadonly,
12948
- "form-size": __props.formSize,
13019
+ return openBlock(), createBlock(ControlWorkspaceView_default, mergeProps(controlWorkspaceRecipe.value, {
12949
13020
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => emit("update:modelValue", $event)),
12950
13021
  "onUpdate:values": _cache[1] || (_cache[1] = ($event) => emit("update:values", $event)),
12951
13022
  onSubmit: _cache[2] || (_cache[2] = ($event) => emit("submit", $event)),
12952
13023
  onCancel: _cache[3] || (_cache[3] = ($event) => emit("cancel"))
12953
- }, {
13024
+ }), {
12954
13025
  default: withCtx((workspaceSlotProps) => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps(workspaceSlotProps))), () => [createElementVNode("div", _hoisted_1$28, [renderSlot(_ctx.$slots, "plate", normalizeProps(guardReactiveProps(slotProps(workspaceSlotProps))), () => [createVNode(WellPlate_default, normalizeProps(guardReactiveProps(wellPlateBinding(workspaceSlotProps.componentPropsById))), null, 16)], true), renderSlot(_ctx.$slots, "dose", normalizeProps(guardReactiveProps(slotProps(workspaceSlotProps))), () => [createVNode(DoseCalculator_default, normalizeProps(guardReactiveProps(doseCalculatorBinding(workspaceSlotProps.componentPropsById))), null, 16)], true)])], true)]),
12955
13026
  _: 3
12956
- }, 8, [
12957
- "model",
12958
- "workspace",
12959
- "control-options",
12960
- "initial-values",
12961
- "model-value",
12962
- "values",
12963
- "title",
12964
- "subtitle",
12965
- "top-bar-variant",
12966
- "sidebar-width",
12967
- "sidebar-variant",
12968
- "responsive-sidebar",
12969
- "sidebar-position",
12970
- "sidebar-title",
12971
- "sidebar-subtitle",
12972
- "sidebar-badge",
12973
- "floating",
12974
- "dense",
12975
- "show-settings",
12976
- "show-form-actions",
12977
- "form-enhancements",
12978
- "form-loading",
12979
- "form-disabled",
12980
- "form-readonly",
12981
- "form-size"
12982
- ]);
13027
+ }, 16);
12983
13028
  };
12984
13029
  }
12985
- }), [["__scopeId", "data-v-9923dd0b"]]);
13030
+ }), [["__scopeId", "data-v-76c99098"]]);
12986
13031
  //#endregion
12987
13032
  //#region src/components/AppContainer.vue
12988
13033
  var AppContainer_default = /* @__PURE__ */ defineComponent({
@@ -13491,15 +13536,13 @@ var BioTemplateExperimentWorkspaceView_default = /* @__PURE__ */ _plugin_vue_exp
13491
13536
  if (props.kind === "collection") return `${props.label} saves the full template collection to the current experiment.`;
13492
13537
  return `${props.label} template data saves to experiment design_data.`;
13493
13538
  });
13494
- const resolvedLoading = computed(() => {
13495
- if (props.status?.loading !== void 0 || props.status?.saving !== void 0) return Boolean(props.status.loading) || Boolean(props.status.saving);
13496
- return props.loading;
13497
- });
13498
- const resolvedError = computed(() => props.status?.error !== void 0 ? props.status.error : props.error);
13499
- const resolvedHasExperiment = computed(() => props.status?.hasExperiment ?? props.hasExperiment);
13500
- const resolvedCurrentExperimentId = computed(() => props.status?.currentExperimentId ?? props.currentExperimentId);
13501
- const resolvedLastLoadedAt = computed(() => props.status?.lastLoadedAt !== void 0 ? props.status.lastLoadedAt : props.lastLoadedAt);
13502
- const resolvedLastSavedAt = computed(() => props.status?.lastSavedAt !== void 0 ? props.status.lastSavedAt : props.lastSavedAt);
13539
+ const resolvedStatus = computed(() => bioTemplateExperimentWorkspaceProps(props));
13540
+ const resolvedLoading = computed(() => resolvedStatus.value.loading);
13541
+ const resolvedError = computed(() => resolvedStatus.value.error);
13542
+ const resolvedHasExperiment = computed(() => resolvedStatus.value.hasExperiment);
13543
+ const resolvedCurrentExperimentId = computed(() => resolvedStatus.value.currentExperimentId);
13544
+ const resolvedLastLoadedAt = computed(() => resolvedStatus.value.lastLoadedAt);
13545
+ const resolvedLastSavedAt = computed(() => resolvedStatus.value.lastSavedAt);
13503
13546
  const templateSummaries = computed(() => Object.values(extractTemplateCollection(props.target)).map((template) => ({
13504
13547
  id: String(template.template_id),
13505
13548
  version: String(template.template_version ?? "unknown")
@@ -13603,7 +13646,7 @@ var BioTemplateExperimentWorkspaceView_default = /* @__PURE__ */ _plugin_vue_exp
13603
13646
  ]);
13604
13647
  };
13605
13648
  }
13606
- }), [["__scopeId", "data-v-319cba33"]]);
13649
+ }), [["__scopeId", "data-v-d823d800"]]);
13607
13650
  //#endregion
13608
13651
  //#region src/components/BioTemplatePackWorkspaceView.vue
13609
13652
  var BioTemplatePackWorkspaceView_default = /* @__PURE__ */ defineComponent({
@@ -13678,26 +13721,18 @@ var BioTemplatePackWorkspaceView_default = /* @__PURE__ */ defineComponent({
13678
13721
  reset: props.actions?.reset ?? (() => resolvedWorkspace.value.resetToDefaultCollection()),
13679
13722
  save: props.actions?.save ?? (() => resolvedWorkspace.value.saveCurrent())
13680
13723
  }));
13724
+ const experimentWorkspaceRecipe = computed(() => bioTemplatePackWorkspaceProps(props, {
13725
+ target: target.value,
13726
+ label: label.value,
13727
+ status: resolvedStatus.value,
13728
+ actions: resolvedActions.value
13729
+ }));
13681
13730
  watch([() => props.pack, () => props.workspaceOptions], () => {
13682
13731
  generatedWorkspace.value = createGeneratedWorkspace();
13683
13732
  }, { deep: true });
13684
13733
  onScopeDispose(() => generatedWorkspaceScope?.stop());
13685
13734
  return (_ctx, _cache) => {
13686
- return openBlock(), createBlock(BioTemplateExperimentWorkspaceView_default, {
13687
- target: target.value,
13688
- kind: "collection",
13689
- label: label.value,
13690
- message: __props.message,
13691
- status: resolvedStatus.value,
13692
- actions: resolvedActions.value,
13693
- dense: __props.dense,
13694
- readonly: __props.readonly,
13695
- "show-status": __props.showStatus,
13696
- "show-template-summary": __props.showTemplateSummary,
13697
- "load-label": __props.loadLabel,
13698
- "reset-label": __props.resetLabel,
13699
- "save-label": __props.saveLabel
13700
- }, createSlots({ _: 2 }, [hasDefaultSlot.value ? {
13735
+ return openBlock(), createBlock(BioTemplateExperimentWorkspaceView_default, normalizeProps(guardReactiveProps(experimentWorkspaceRecipe.value)), createSlots({ _: 2 }, [hasDefaultSlot.value ? {
13701
13736
  name: "default",
13702
13737
  fn: withCtx((slotProps) => [renderSlot(_ctx.$slots, "default", mergeProps(slotProps, {
13703
13738
  workspace: resolvedWorkspace.value,
@@ -13710,20 +13745,7 @@ var BioTemplatePackWorkspaceView_default = /* @__PURE__ */ defineComponent({
13710
13745
  topBarSettings: topBarSettings.value
13711
13746
  }))]),
13712
13747
  key: "0"
13713
- } : void 0]), 1032, [
13714
- "target",
13715
- "label",
13716
- "message",
13717
- "status",
13718
- "actions",
13719
- "dense",
13720
- "readonly",
13721
- "show-status",
13722
- "show-template-summary",
13723
- "load-label",
13724
- "reset-label",
13725
- "save-label"
13726
- ]);
13748
+ } : void 0]), 1040);
13727
13749
  };
13728
13750
  }
13729
13751
  });
@@ -13797,18 +13819,9 @@ var BioTemplatePresetWorkspaceView_default = /* @__PURE__ */ _plugin_vue_export_
13797
13819
  */
13798
13820
  const emit = __emit;
13799
13821
  const props = __props;
13800
- const externalValues = computed(() => props.modelValue ?? props.values);
13801
- const resolvedWorkspaceOptions = computed(() => {
13802
- if (props.initialValues === void 0 && externalValues.value === void 0) return props.workspaceOptions;
13803
- return {
13804
- ...props.workspaceOptions,
13805
- initialValues: {
13806
- ...props.workspaceOptions.initialValues ?? {},
13807
- ...props.initialValues ?? {},
13808
- ...externalValues.value ?? {}
13809
- }
13810
- };
13811
- });
13822
+ const resolvedPresetProps = computed(() => bioTemplatePresetWorkspaceProps(props));
13823
+ const externalValues = computed(() => resolvedPresetProps.value.externalValues);
13824
+ const resolvedWorkspaceOptions = computed(() => resolvedPresetProps.value.resolvedWorkspaceOptions);
13812
13825
  let generatedWorkspaceScope;
13813
13826
  function createGeneratedWorkspace() {
13814
13827
  generatedWorkspaceScope?.stop();
@@ -13968,7 +13981,7 @@ var BioTemplatePresetWorkspaceView_default = /* @__PURE__ */ _plugin_vue_export_
13968
13981
  ]);
13969
13982
  };
13970
13983
  }
13971
- }), [["__scopeId", "data-v-f889ed9c"]]);
13984
+ }), [["__scopeId", "data-v-7935b698"]]);
13972
13985
  //#endregion
13973
13986
  //#region src/components/RackEditor.vue?vue&type=script&setup=true&lang.ts
13974
13987
  var _hoisted_1$20 = { class: "mint-rack-editor__tabs" };
@@ -18320,6 +18333,7 @@ var components_exports = /* @__PURE__ */ __exportAll({
18320
18333
  SampleSelector: () => SampleSelector_default,
18321
18334
  ScheduleCalendar: () => ScheduleCalendar_default,
18322
18335
  ScientificNumber: () => ScientificNumber_default,
18336
+ SecretInput: () => SecretInput_default,
18323
18337
  SectionCard: () => SectionCard_default,
18324
18338
  SegmentedControl: () => SegmentedControl_default,
18325
18339
  SequenceInput: () => SequenceInput_default,
@@ -18342,4 +18356,4 @@ var components_exports = /* @__PURE__ */ __exportAll({
18342
18356
  //#endregion
18343
18357
  export { SmartGroupFieldRecipe_default as $, ProtocolStepEditor_default as A, RuntimeUpdateNotice_default as At, Breadcrumb_default as B, estimateSequenceRemainingSeconds as C, AppPluginSwitcher_default as Ct, sequenceSamplesRemaining as D, ThemeToggle_default as Dt, sequenceProgressPercent as E, CollapsibleCard_default as Et, RackEditor_default as F, SegmentedControl_default as Ft, AppContainer_default as G, ProgressBar_default as H, BioTemplatePresetWorkspaceView_default as I, BaseTabs_default as It, ComponentBindingRenderer_default as J, DoseDesignWorkspaceView_default as K, BioTemplatePackWorkspaceView_default as L, ColorSlider_default as Lt, ReagentEditor_default as M, DataFrame_default as Mt, SmartGroupModal_default as N, Calendar_default as Nt, ChemicalFormula_default as O, ActionMenu_default as Ot, GroupAssigner_default as P, DropdownButton_default as Pt, SmartGroupManual_default as Q, BioTemplateExperimentWorkspaceView_default as R, estimateSequenceFinishDate as S, AppTopBar_default as St, formatSequenceRemaining as T, PluginIcon_default as Tt, StatusIndicator_default as U, Avatar_default as V, Divider_default as W, SampleSelector_default as X, ScheduleCalendar_default as Y, AutoGroupModal_default as Z, reconstructLcmsPlateCellsFromSequenceItems as _, AppLayout_default as _t, ResourceCard_default as a, DoseCalculator_default as at, InstrumentAlertLog_default as b, FormActions_default as bt, BatchProgressList_default as c, GeneratedResultRenderer_default as ct, DEFAULT_LCMS_SEQUENCE_COLUMNS as d, LoadingSpinner_default as dt, ReagentList_default as et, basenameFromWindowsPath as f, generatedJobDefaults as ft, lcmsWellIdFromPosition as g, MobileSupportGate_default as gt, inferLcmsPlateTypeFromWellIds as h, PluginWorkspaceView_default as ht, SectionCard_default as i, ExperimentTimeline_default as it, SampleHierarchyTree_default as j, AppToastContainer_default as jt, ScientificNumber_default as k, IconButton_default as kt, AuditTrail_default as l, GeneratedPlotlyResult_default as lt, extractLcmsSampleName as m, normalizeGeneratedJobInput as mt, FitPanel_default as n, SampleLegend_default as nt, TimeRangeInput_default as o, GeneratedPluginView_default as ot, extractLcmsCommonPrefix as p, generatedJobFormSchema as pt, ControlWorkspaceView_default as q, ArtifactSaveDialog_default as r, WellPlate_default as rt, ExperimentDataViewer_default as s, JobsStatusTray_default as st, components_exports as t, PlateMapEditor_default as tt, LcmsSequenceTable_default as u, ChartContainer_default as ut, InstrumentStatusCard_default as v, AppSidebar_default as vt, formatSequenceEta as w, AppAvatarMenu_default as wt, SequenceProgressBar_default as x, StepWizard_default as xt, InstrumentStateBadge_default as y, FormBuilder_default as yt, BioTemplateRenderer_default as z };
18344
18358
 
18345
- //# sourceMappingURL=components-MGNL6tRn.js.map
18359
+ //# sourceMappingURL=components-B80gV0P6.js.map