@morscherlab/mint-sdk 1.5.0-beta.7 → 1.5.0-beta.8

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 (104) hide show
  1. package/dist/{AlertBox-CexONPhA.js → AlertBox-Cai0w7gF.js} +3 -3
  2. package/dist/{AlertBox-CexONPhA.js.map → AlertBox-Cai0w7gF.js.map} +1 -1
  3. package/dist/{AppSidebar-C4qQLHcH.js → AppSidebar-C1DT4nsZ.js} +351 -90
  4. package/dist/AppSidebar-C1DT4nsZ.js.map +1 -0
  5. package/dist/{ConfirmDialog-D9QXFpsy.js → ConfirmDialog-BjFsOpBe.js} +2 -2
  6. package/dist/{ConfirmDialog-D9QXFpsy.js.map → ConfirmDialog-BjFsOpBe.js.map} +1 -1
  7. package/dist/{ExperimentPopover-DyjoXwry.js → ExperimentPopover-DYy_s0kI.js} +21 -20
  8. package/dist/ExperimentPopover-DYy_s0kI.js.map +1 -0
  9. package/dist/{ExperimentSelectorModal-CUkKmgfr.js → ExperimentSelectorModal-Bfh5bdkv.js} +5 -5
  10. package/dist/{ExperimentSelectorModal-CUkKmgfr.js.map → ExperimentSelectorModal-Bfh5bdkv.js.map} +1 -1
  11. package/dist/{SegmentedControl-C-sckoJZ.js → SegmentedControl-B8KgyOjd.js} +2 -2
  12. package/dist/{SegmentedControl-C-sckoJZ.js.map → SegmentedControl-B8KgyOjd.js.map} +1 -1
  13. package/dist/{SettingsModal-B1ltysmg.js → SettingsModal-DPNblTe9.js} +7 -7
  14. package/dist/{SettingsModal-B1ltysmg.js.map → SettingsModal-DPNblTe9.js.map} +1 -1
  15. package/dist/__tests__/components/AppTopBarCompact.test.d.ts +1 -0
  16. package/dist/__tests__/components/AppTopBarCompactReset.test.d.ts +1 -0
  17. package/dist/__tests__/components/AutoGroupModal.experimentLoad.test.d.ts +1 -0
  18. package/dist/components/AppTopBar.compact.d.ts +5 -0
  19. package/dist/components/AppTopBar.vue.d.ts +17 -17
  20. package/dist/components/PluginWorkspaceView.vue.d.ts +4 -0
  21. package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +2 -2
  22. package/dist/components/internal/LucideIconInternal.vue.d.ts +17 -0
  23. package/dist/composables/appLayoutSidebar.d.ts +9 -0
  24. package/dist/composables/useVersionedSave.d.ts +5 -2
  25. package/dist/{controlSchemaModel-C_XqpkgE.js → controlSchemaModel-BtFNZj8t.js} +2 -2
  26. package/dist/{controlSchemaModel-C_XqpkgE.js.map → controlSchemaModel-BtFNZj8t.js.map} +1 -1
  27. package/dist/{data-CgIcnf9D.js → data-CJztFns8.js} +31 -15
  28. package/dist/{data-CgIcnf9D.js.map → data-CJztFns8.js.map} +1 -1
  29. package/dist/data.js +8 -8
  30. package/dist/{experimentStatus-DCn2QKG7.js → experimentStatus-Deokk7Br.js} +2 -2
  31. package/dist/{experimentStatus-DCn2QKG7.js.map → experimentStatus-Deokk7Br.js.map} +1 -1
  32. package/dist/index.js +14 -14
  33. package/dist/{install-DmyjbTJ5.js → install-9FkKs0iW.js} +14 -15
  34. package/dist/{install-DmyjbTJ5.js.map → install-9FkKs0iW.js.map} +1 -1
  35. package/dist/install.js +1 -1
  36. package/dist/{lab-BcX5JBSY.js → lab-BYhb_cJI.js} +22 -14
  37. package/dist/lab-BYhb_cJI.js.map +1 -0
  38. package/dist/lab.js +4 -4
  39. package/dist/{records-BAymyHAn.js → records-GtiVMlTQ.js} +198 -62
  40. package/dist/records-GtiVMlTQ.js.map +1 -0
  41. package/dist/{runtime-CjfAxufu.js → runtime-DcMsvlaS.js} +29 -12
  42. package/dist/runtime-DcMsvlaS.js.map +1 -0
  43. package/dist/runtime.js +6 -6
  44. package/dist/{shell-XDqDu_UD.js → shell-XZYkAZS_.js} +5 -5
  45. package/dist/{shell-XDqDu_UD.js.map → shell-XZYkAZS_.js.map} +1 -1
  46. package/dist/shell.js +5 -5
  47. package/dist/styles.css +136 -12
  48. package/dist/types/components.d.ts +22 -2
  49. package/dist/types/index.d.ts +1 -1
  50. package/dist/{useDropdownState-uFIz6Yv8.js → useDropdownState-CcBzUYZ6.js} +14 -5
  51. package/dist/useDropdownState-CcBzUYZ6.js.map +1 -0
  52. package/dist/{useExperimentSamples-DEDAKa2E.js → useExperimentSamples-CpNXvpUn.js} +3 -3
  53. package/dist/{useExperimentSamples-DEDAKa2E.js.map → useExperimentSamples-CpNXvpUn.js.map} +1 -1
  54. package/dist/{useListReorder-W1bzK_bo.js → useListReorder-Bp4EAI2w.js} +3 -3
  55. package/dist/{useListReorder-W1bzK_bo.js.map → useListReorder-Bp4EAI2w.js.map} +1 -1
  56. package/dist/{useRackEditor-Bmtuo0aj.js → useRackEditor-i2bdPUFf.js} +8 -8
  57. package/dist/{useRackEditor-Bmtuo0aj.js.map → useRackEditor-i2bdPUFf.js.map} +1 -1
  58. package/dist/{useRealtime-jOetF2mM.js → useRealtime-BLQEjbuq.js} +3 -3
  59. package/dist/{useRealtime-jOetF2mM.js.map → useRealtime-BLQEjbuq.js.map} +1 -1
  60. package/dist/useRequest-CXyPw3eh.js +76 -0
  61. package/dist/useRequest-CXyPw3eh.js.map +1 -0
  62. package/dist/utils/deprecation.d.ts +2 -0
  63. package/dist/utils/lucideIcon.d.ts +4 -0
  64. package/package.json +1 -1
  65. package/src/__tests__/components/AppTopBar.test.ts +102 -20
  66. package/src/__tests__/components/AppTopBarCompact.test.ts +65 -0
  67. package/src/__tests__/components/AppTopBarCompactReset.test.ts +24 -0
  68. package/src/__tests__/components/AutoGroupModal.experimentLoad.test.ts +58 -0
  69. package/src/__tests__/components/BaseModal.test.ts +33 -2
  70. package/src/__tests__/components/PluginWorkspaceView.test.ts +1 -1
  71. package/src/__tests__/composables/useJobCenter.test.ts +35 -0
  72. package/src/__tests__/composables/useVersionedSave.test.ts +71 -6
  73. package/src/__tests__/styles/menusShellRefresh.test.ts +5 -0
  74. package/src/components/AppLayout.story.vue +5 -5
  75. package/src/components/AppLayout.vue +13 -1
  76. package/src/components/AppTopBar.compact.ts +60 -0
  77. package/src/components/AppTopBar.story.vue +39 -14
  78. package/src/components/AppTopBar.vue +222 -89
  79. package/src/components/BaseModal.vue +16 -5
  80. package/src/components/ExperimentPopover.vue +1 -1
  81. package/src/components/GeneratedPluginView.vue +0 -1
  82. package/src/components/PluginWorkspaceView.vue +8 -0
  83. package/src/components/internal/AppTopBarPageSelectorInternal.vue +12 -0
  84. package/src/components/internal/AutoGroupModalInternal.vue +14 -3
  85. package/src/components/internal/LucideIconInternal.vue +23 -0
  86. package/src/composables/appLayoutSidebar.ts +11 -0
  87. package/src/composables/useJobCenter.ts +21 -1
  88. package/src/composables/usePluginWorkspace.ts +1 -1
  89. package/src/composables/useVersionedSave.ts +32 -7
  90. package/src/styles/components/app-layout.css +5 -0
  91. package/src/styles/components/app-top-bar.css +128 -8
  92. package/src/types/components.ts +23 -2
  93. package/src/types/index.ts +1 -0
  94. package/src/utils/deprecation.ts +8 -0
  95. package/src/utils/lucideIcon.ts +25 -0
  96. package/src/utils/lucideIconIndex.d.ts +2 -0
  97. package/dist/AppSidebar-C4qQLHcH.js.map +0 -1
  98. package/dist/ExperimentPopover-DyjoXwry.js.map +0 -1
  99. package/dist/lab-BcX5JBSY.js.map +0 -1
  100. package/dist/records-BAymyHAn.js.map +0 -1
  101. package/dist/runtime-CjfAxufu.js.map +0 -1
  102. package/dist/useDropdownState-uFIz6Yv8.js.map +0 -1
  103. package/dist/useRequest-D9-3BS-3.js +0 -215
  104. package/dist/useRequest-D9-3BS-3.js.map +0 -1
@@ -1,9 +1,9 @@
1
- import { a as BaseButton_default, i as useEventListener, t as useDropdownState } from "./useDropdownState-uFIz6Yv8.js";
1
+ import { a as BaseButton_default, i as useEventListener, t as useDropdownState } from "./useDropdownState-CcBzUYZ6.js";
2
2
  import { n as integrationHost, u as useSettingsStore } from "./experiment-DyO54FQB.js";
3
- import { E as useMenuKeyboard, I as FormField_default, _ as APP_EXPERIMENT_KEY, t as isRecord, z as BaseCheckbox_default } from "./records-BAymyHAn.js";
4
- import { F as applySpecDefaults, M as usePlatform, _ as getTypeDefault, a as StepWizard_default, c as normalizeControls, d as numericValue, g as getFieldRegistryEntry, l as normalizeOption, o as defaultValueForControl, p as orderedUnique, u as humanize } from "./useListReorder-W1bzK_bo.js";
5
- import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createTextVNode, createVNode, defineAsyncComponent, defineComponent, guardReactiveProps, inject, mergeProps, nextTick, normalizeClass, normalizeProps, normalizeStyle, onBeforeUnmount, onMounted, onScopeDispose, openBlock, provide, reactive, readonly, ref, renderList, renderSlot, resolveComponent, resolveDynamicComponent, shallowRef, toDisplayString, toRaw, toValue, unref, useId, useSlots, useTemplateRef, vShow, watch, withCtx, withDirectives, withModifiers } from "vue";
6
- import { Check, CircleAlert, CircleCheck, CircleHelp, CircleX, ListChecks, LoaderCircle, Moon, Play, Sun, X } from "lucide-vue-next";
3
+ import { B as BaseCheckbox_default, D as useMenuKeyboard, L as FormField_default, T as ActionMenu_default, _ as APP_EXPERIMENT_KEY, t as isRecord } from "./records-GtiVMlTQ.js";
4
+ import { F as applySpecDefaults, M as usePlatform, _ as getTypeDefault, a as StepWizard_default, c as normalizeControls, d as numericValue, g as getFieldRegistryEntry, l as normalizeOption, o as defaultValueForControl, p as orderedUnique, u as humanize } from "./useListReorder-Bp4EAI2w.js";
5
+ import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createTextVNode, createVNode, defineAsyncComponent, defineComponent, guardReactiveProps, inject, mergeProps, nextTick, normalizeClass, normalizeProps, normalizeStyle, onBeforeUnmount, onMounted, onScopeDispose, openBlock, provide, reactive, readonly, ref, renderList, renderSlot, resolveComponent, resolveDynamicComponent, shallowRef, toDisplayString, toRaw, toValue, unref, useId, useSlots, useTemplateRef, vShow, watch, watchEffect, withCtx, withDirectives, withModifiers } from "vue";
6
+ import { Check, CircleAlert, CircleCheck, CircleHelp, CircleX, Ellipsis, ListChecks, LoaderCircle, Menu, Moon, Play, Sun, X } from "lucide-vue-next";
7
7
  import { autoUpdate, computePosition, flip, offset, shift } from "@floating-ui/dom";
8
8
  //#region src/composables/useTheme.ts
9
9
  /** Reads and toggles the active theme (light/dark/system) with reactivity to OS preference changes. */
@@ -81,11 +81,11 @@ var _hoisted_11$6 = {
81
81
  };
82
82
  var _hoisted_12$5 = ["d"];
83
83
  var _hoisted_13$5 = ["d"];
84
- var _hoisted_14$3 = {
84
+ var _hoisted_14$4 = {
85
85
  key: 1,
86
86
  class: "mint-collapsible-card__action-text-icon"
87
87
  };
88
- var _hoisted_15$3 = [
88
+ var _hoisted_15$4 = [
89
89
  "disabled",
90
90
  "aria-label",
91
91
  "aria-expanded"
@@ -216,7 +216,7 @@ var CollapsibleCard_default = /* @__PURE__ */ defineComponent({
216
216
  }), 128)) : (openBlock(), createElementBlock("path", {
217
217
  key: 1,
218
218
  d: action.icon
219
- }, null, 8, _hoisted_13$5))])) : action.icon ? (openBlock(), createElementBlock("span", _hoisted_14$3, toDisplayString(action.icon), 1)) : createCommentVNode("", true)], 14, _hoisted_10$6);
219
+ }, null, 8, _hoisted_13$5))])) : action.icon ? (openBlock(), createElementBlock("span", _hoisted_14$4, toDisplayString(action.icon), 1)) : createCommentVNode("", true)], 14, _hoisted_10$6);
220
220
  }), 128)),
221
221
  __props.showToggle ? (openBlock(), createElementBlock("div", {
222
222
  key: 1,
@@ -245,7 +245,7 @@ var CollapsibleCard_default = /* @__PURE__ */ defineComponent({
245
245
  "stroke-linejoin": "round",
246
246
  viewBox: "0 0 24 24",
247
247
  "aria-hidden": "true"
248
- }, [..._cache[2] || (_cache[2] = [createElementVNode("path", { d: "m6 9 6 6 6-6" }, null, -1)])], 2))], 8, _hoisted_15$3)
248
+ }, [..._cache[2] || (_cache[2] = [createElementVNode("path", { d: "m6 9 6 6 6-6" }, null, -1)])], 2))], 8, _hoisted_15$4)
249
249
  ])]), createVNode(Transition, { name: "collapse" }, {
250
250
  default: withCtx(() => [withDirectives(createElementVNode("div", _hoisted_16$3, [createElementVNode("div", _hoisted_17$2, [renderSlot(_ctx.$slots, "default")])], 512), [[vShow, isOpen.value]])]),
251
251
  _: 3
@@ -763,7 +763,6 @@ function usePluginWorkspace(options) {
763
763
  const { props, slots, emit } = options;
764
764
  const sidebarSpec = computed(() => props.spec?.sidebar ?? {});
765
765
  const topBarSpec = computed(() => props.spec?.topBar === false ? false : applySpecDefaults({
766
- themeToggle: true,
767
766
  settings: {},
768
767
  standaloneLabel: false
769
768
  }, props.spec?.topBar));
@@ -848,6 +847,18 @@ function usePluginWorkspace(options) {
848
847
  };
849
848
  }
850
849
  //#endregion
850
+ //#region src/utils/deprecation.ts
851
+ var warned = /* @__PURE__ */ new Set();
852
+ /** Warn once per page load that a deprecated SDK option or slot is in use. */
853
+ function warnDeprecatedOnce(key, message) {
854
+ if (warned.has(key)) return;
855
+ warned.add(key);
856
+ console.warn(`[mint-sdk] ${message}`);
857
+ }
858
+ //#endregion
859
+ //#region src/composables/appLayoutSidebar.ts
860
+ var APP_LAYOUT_SIDEBAR_KEY = Symbol("mint-app-layout-sidebar");
861
+ //#endregion
851
862
  //#region src/components/AppLayout.vue?vue&type=script&setup=true&lang.ts
852
863
  var _hoisted_1$11 = {
853
864
  key: 0,
@@ -930,6 +941,7 @@ var AppLayout_default = /* @__PURE__ */ defineComponent({
930
941
  */
931
942
  const props = __props;
932
943
  const emit = __emit;
944
+ const slots = useSlots();
933
945
  const internalSidebarOpen = ref(props.defaultSidebarOpen);
934
946
  const sidebarOpenModel = computed({
935
947
  get: () => props.sidebarOpen ?? internalSidebarOpen.value,
@@ -951,6 +963,12 @@ var AppLayout_default = /* @__PURE__ */ defineComponent({
951
963
  function toggleSidebar() {
952
964
  sidebarOpenModel.value = !sidebarOpenModel.value;
953
965
  }
966
+ if (props.responsiveSidebar && slots.sidebar) provide(APP_LAYOUT_SIDEBAR_KEY, {
967
+ open: computed(() => sidebarOpenModel.value),
968
+ toggle: toggleSidebar,
969
+ openLabel: computed(() => props.sidebarToggleLabel),
970
+ closeLabel: computed(() => props.sidebarCloseLabel)
971
+ });
954
972
  function closeSidebar() {
955
973
  sidebarOpenModel.value = false;
956
974
  }
@@ -980,6 +998,51 @@ var AppLayout_default = /* @__PURE__ */ defineComponent({
980
998
  }
981
999
  });
982
1000
  //#endregion
1001
+ //#region src/utils/lucideIcon.ts
1002
+ /** A Lucide icon name in kebab case, such as `activity` or `flask-conical`. */
1003
+ var LUCIDE_NAME = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
1004
+ function isLucideIconName(value) {
1005
+ return !!value && LUCIDE_NAME.test(value);
1006
+ }
1007
+ function pascalCase(name) {
1008
+ return name.replace(/(^|-)([a-z0-9])/g, (_, __, char) => char.toUpperCase());
1009
+ }
1010
+ var iconSet;
1011
+ /** The Lucide component for `name`, or undefined when Lucide has no such icon. */
1012
+ async function loadLucideIcon(name) {
1013
+ iconSet ??= import("lucide-vue-next/dist/esm/icons/index.js");
1014
+ return (await iconSet)[pascalCase(name)];
1015
+ }
1016
+ //#endregion
1017
+ //#region src/components/internal/LucideIconInternal.vue
1018
+ var LucideIconInternal_default = /* @__PURE__ */ defineComponent({
1019
+ __name: "LucideIconInternal",
1020
+ props: {
1021
+ name: {},
1022
+ size: {}
1023
+ },
1024
+ setup(__props) {
1025
+ /** Internal: renders a Lucide icon by name; shows `fallback` until it loads or when the name is unknown. */
1026
+ const props = __props;
1027
+ const icon = shallowRef();
1028
+ watchEffect(async (onCleanup) => {
1029
+ let stale = false;
1030
+ onCleanup(() => {
1031
+ stale = true;
1032
+ });
1033
+ const loaded = await loadLucideIcon(props.name);
1034
+ if (!stale) icon.value = loaded;
1035
+ });
1036
+ return (_ctx, _cache) => {
1037
+ return icon.value ? (openBlock(), createBlock(resolveDynamicComponent(icon.value), {
1038
+ key: 0,
1039
+ size: __props.size ?? 14,
1040
+ "aria-hidden": "true"
1041
+ }, null, 8, ["size"])) : renderSlot(_ctx.$slots, "fallback", {}, void 0, void 0, 1);
1042
+ };
1043
+ }
1044
+ });
1045
+ //#endregion
983
1046
  //#region src/utils/items.ts
984
1047
  function normalizeItemInput(item) {
985
1048
  if (typeof item === "object") return item;
@@ -1374,31 +1437,33 @@ var _hoisted_1$8 = {
1374
1437
  };
1375
1438
  var _hoisted_2$6 = { class: "mint-page-selector__plugin" };
1376
1439
  var _hoisted_3$6 = ["aria-expanded"];
1377
- var _hoisted_4$6 = {
1378
- key: 1,
1440
+ var _hoisted_4$6 = { class: "mint-page-selector__icon-fallback" };
1441
+ var _hoisted_5$6 = {
1442
+ key: 2,
1379
1443
  class: "mint-page-selector__icon-fallback"
1380
1444
  };
1381
- var _hoisted_5$6 = { class: "mint-page-selector__label" };
1382
- var _hoisted_6$5 = {
1445
+ var _hoisted_6$5 = { class: "mint-page-selector__label" };
1446
+ var _hoisted_7$5 = {
1383
1447
  class: "mint-page-selector__chevron-wrap",
1384
1448
  "aria-hidden": "true"
1385
1449
  };
1386
- var _hoisted_7$5 = ["aria-label"];
1387
- var _hoisted_8$5 = {
1450
+ var _hoisted_8$5 = ["aria-label"];
1451
+ var _hoisted_9$5 = {
1388
1452
  class: "mint-page-selector__menu-title",
1389
1453
  "aria-hidden": "true"
1390
1454
  };
1391
- var _hoisted_9$5 = {
1392
- key: 1,
1455
+ var _hoisted_10$5 = { class: "mint-page-selector__icon-fallback" };
1456
+ var _hoisted_11$5 = {
1457
+ key: 2,
1393
1458
  class: "mint-page-selector__icon-fallback"
1394
1459
  };
1395
- var _hoisted_10$5 = { class: "mint-page-selector__item-text" };
1396
- var _hoisted_11$5 = { class: "mint-page-selector__item-label" };
1397
- var _hoisted_12$4 = {
1460
+ var _hoisted_12$4 = { class: "mint-page-selector__item-text" };
1461
+ var _hoisted_13$4 = { class: "mint-page-selector__item-label" };
1462
+ var _hoisted_14$3 = {
1398
1463
  key: 0,
1399
1464
  class: "mint-page-selector__item-hint"
1400
1465
  };
1401
- var _hoisted_13$4 = {
1466
+ var _hoisted_15$3 = {
1402
1467
  key: 0,
1403
1468
  class: "mint-page-selector__item-key",
1404
1469
  "aria-hidden": "true"
@@ -1503,9 +1568,15 @@ var AppTopBarPageSelectorInternal_default = /* @__PURE__ */ defineComponent({
1503
1568
  icon: current.value.icon,
1504
1569
  size: "sm",
1505
1570
  variant: "solid"
1506
- }, null, 8, ["icon"])) : (openBlock(), createElementBlock("span", _hoisted_4$6, toDisplayString(current.value.label.charAt(0)), 1))])], 2)) : createCommentVNode("", true),
1507
- createElementVNode("span", _hoisted_5$6, toDisplayString(current.value?.label ?? __props.placeholder), 1),
1508
- createElementVNode("span", _hoisted_6$5, [(openBlock(), createElementBlock("svg", {
1571
+ }, null, 8, ["icon"])) : unref(isLucideIconName)(current.value.icon) ? (openBlock(), createBlock(LucideIconInternal_default, {
1572
+ key: 1,
1573
+ name: current.value.icon
1574
+ }, {
1575
+ fallback: withCtx(() => [createElementVNode("span", _hoisted_4$6, toDisplayString(current.value.label.charAt(0)), 1)]),
1576
+ _: 1
1577
+ }, 8, ["name"])) : (openBlock(), createElementBlock("span", _hoisted_5$6, toDisplayString(current.value.label.charAt(0)), 1))])], 2)) : createCommentVNode("", true),
1578
+ createElementVNode("span", _hoisted_6$5, toDisplayString(current.value?.label ?? __props.placeholder), 1),
1579
+ createElementVNode("span", _hoisted_7$5, [(openBlock(), createElementBlock("svg", {
1509
1580
  class: normalizeClass(["mint-page-selector__chevron", { "mint-page-selector__chevron--open": unref(isOpen) }]),
1510
1581
  viewBox: "0 0 24 24",
1511
1582
  fill: "none",
@@ -1521,7 +1592,7 @@ var AppTopBarPageSelectorInternal_default = /* @__PURE__ */ defineComponent({
1521
1592
  role: "menu",
1522
1593
  "aria-label": menuTitle.value,
1523
1594
  onKeydown: handleMenuKeydown
1524
- }, [createElementVNode("div", _hoisted_8$5, toDisplayString(menuTitle.value), 1), (openBlock(true), createElementBlock(Fragment, null, renderList(normalizedPages.value, (page, index) => {
1595
+ }, [createElementVNode("div", _hoisted_9$5, toDisplayString(menuTitle.value), 1), (openBlock(true), createElementBlock(Fragment, null, renderList(normalizedPages.value, (page, index) => {
1525
1596
  return openBlock(), createBlock(ActionItemInternal_default, {
1526
1597
  key: page.id,
1527
1598
  href: page.href,
@@ -1544,9 +1615,15 @@ var AppTopBarPageSelectorInternal_default = /* @__PURE__ */ defineComponent({
1544
1615
  icon: page.icon,
1545
1616
  size: "sm",
1546
1617
  variant: "solid"
1547
- }, null, 8, ["icon"])) : (openBlock(), createElementBlock("span", _hoisted_9$5, toDisplayString(page.label.charAt(0)), 1))])], 2),
1548
- createElementVNode("span", _hoisted_10$5, [createElementVNode("span", _hoisted_11$5, toDisplayString(page.label), 1), page.hint ? (openBlock(), createElementBlock("span", _hoisted_12$4, toDisplayString(page.hint), 1)) : createCommentVNode("", true)]),
1549
- index < 9 ? (openBlock(), createElementBlock("span", _hoisted_13$4, toDisplayString(index + 1), 1)) : createCommentVNode("", true)
1618
+ }, null, 8, ["icon"])) : unref(isLucideIconName)(page.icon) ? (openBlock(), createBlock(LucideIconInternal_default, {
1619
+ key: 1,
1620
+ name: page.icon
1621
+ }, {
1622
+ fallback: withCtx(() => [createElementVNode("span", _hoisted_10$5, toDisplayString(page.label.charAt(0)), 1)]),
1623
+ _: 2
1624
+ }, 1032, ["name"])) : (openBlock(), createElementBlock("span", _hoisted_11$5, toDisplayString(page.label.charAt(0)), 1))])], 2),
1625
+ createElementVNode("span", _hoisted_12$4, [createElementVNode("span", _hoisted_13$4, toDisplayString(page.label), 1), page.hint ? (openBlock(), createElementBlock("span", _hoisted_14$3, toDisplayString(page.hint), 1)) : createCommentVNode("", true)]),
1626
+ index < 9 ? (openBlock(), createElementBlock("span", _hoisted_15$3, toDisplayString(index + 1), 1)) : createCommentVNode("", true)
1550
1627
  ]),
1551
1628
  _: 2
1552
1629
  }, 1032, [
@@ -1558,7 +1635,7 @@ var AppTopBarPageSelectorInternal_default = /* @__PURE__ */ defineComponent({
1558
1635
  "aria-keyshortcuts",
1559
1636
  "onClick"
1560
1637
  ]);
1561
- }), 128))], 40, _hoisted_7$5)) : createCommentVNode("", true)], 4)], 512);
1638
+ }), 128))], 40, _hoisted_8$5)) : createCommentVNode("", true)], 4)], 512);
1562
1639
  };
1563
1640
  }
1564
1641
  });
@@ -2647,9 +2724,53 @@ function trackTopBarForToasts(el) {
2647
2724
  };
2648
2725
  }
2649
2726
  //#endregion
2727
+ //#region src/components/AppTopBar.compact.ts
2728
+ var CHIP_MIN_PX = 192;
2729
+ var LABELS = ".mint-experiment-popover__save-label, .mint-topbar__job-label";
2730
+ /** Identity text that truncates when the left side is squeezed. */
2731
+ var IDENTITY_TEXT = ".mint-page-selector__plugin, .mint-page-selector__label, .mint-topbar__plugin-name, .mint-topbar-title, .mint-topbar__title-only";
2732
+ function overflows(el) {
2733
+ return !!el && el.scrollWidth > el.clientWidth + 1;
2734
+ }
2735
+ function trackTopBarCompact(header, compact) {
2736
+ if (typeof ResizeObserver === "undefined") return {
2737
+ reset: () => {},
2738
+ stop: () => {}
2739
+ };
2740
+ let expandAt = 0;
2741
+ function check() {
2742
+ const width = header.clientWidth;
2743
+ if (compact.value) {
2744
+ if (width >= expandAt) compact.value = false;
2745
+ return;
2746
+ }
2747
+ const chip = header.querySelector(".mint-experiment-popover__trigger");
2748
+ if (!(chip && chip.getBoundingClientRect().width < CHIP_MIN_PX && overflows(chip.querySelector(".mint-experiment-popover__trigger-text")) || [...header.querySelectorAll(IDENTITY_TEXT)].some(overflows) || overflows(header.querySelector(".mint-topbar__center")) || overflows(header.querySelector(".mint-topbar__context")))) return;
2749
+ const labelsWidth = [...header.querySelectorAll(LABELS)].reduce((sum, el) => sum + el.getBoundingClientRect().width, 0);
2750
+ if (labelsWidth === 0) return;
2751
+ expandAt = width + labelsWidth;
2752
+ compact.value = true;
2753
+ }
2754
+ const observer = new ResizeObserver(check);
2755
+ function observe() {
2756
+ observer.disconnect();
2757
+ observer.observe(header);
2758
+ for (const el of header.querySelectorAll(".mint-topbar__center, .mint-topbar__context")) observer.observe(el);
2759
+ }
2760
+ observe();
2761
+ return {
2762
+ reset: () => {
2763
+ compact.value = false;
2764
+ expandAt = 0;
2765
+ requestAnimationFrame(observe);
2766
+ },
2767
+ stop: () => observer.disconnect()
2768
+ };
2769
+ }
2770
+ //#endregion
2650
2771
  //#region src/components/AppTopBar.vue?vue&type=script&setup=true&lang.ts
2651
- var _hoisted_1$4 = { class: "mint-topbar__container" };
2652
- var _hoisted_2$2 = { class: "mint-topbar__start" };
2772
+ var _hoisted_1$4 = { class: "mint-topbar__start" };
2773
+ var _hoisted_2$2 = ["aria-label", "aria-expanded"];
2653
2774
  var _hoisted_3$2 = { class: "mint-topbar__brand" };
2654
2775
  var _hoisted_4$2 = ["href"];
2655
2776
  var _hoisted_5$2 = {
@@ -2677,7 +2798,7 @@ var _hoisted_10$1 = {
2677
2798
  class: "mint-topbar__logo"
2678
2799
  };
2679
2800
  var _hoisted_11$1 = {
2680
- key: 0,
2801
+ key: 1,
2681
2802
  class: "mint-topbar__plugin-identity"
2682
2803
  };
2683
2804
  var _hoisted_12$1 = { class: "mint-topbar__plugin-name" };
@@ -2686,13 +2807,13 @@ var _hoisted_13$1 = {
2686
2807
  class: "mint-topbar__plugin-subtitle"
2687
2808
  };
2688
2809
  var _hoisted_14$1 = {
2689
- key: 3,
2810
+ key: 4,
2690
2811
  class: "mint-topbar-title-group"
2691
2812
  };
2692
2813
  var _hoisted_15$1 = { class: "mint-topbar-title" };
2693
2814
  var _hoisted_16$1 = { class: "mint-topbar-subtitle" };
2694
2815
  var _hoisted_17$1 = {
2695
- key: 4,
2816
+ key: 5,
2696
2817
  class: "mint-topbar__title-only"
2697
2818
  };
2698
2819
  var _hoisted_18$1 = {
@@ -2703,33 +2824,56 @@ var _hoisted_18$1 = {
2703
2824
  var _hoisted_19$1 = { class: "mint-topbar__right" };
2704
2825
  var _hoisted_20$1 = {
2705
2826
  key: 0,
2706
- class: "mint-topbar__standalone-badge"
2827
+ class: "mint-topbar__context"
2707
2828
  };
2708
2829
  var _hoisted_21$1 = {
2830
+ key: 0,
2831
+ class: "mint-topbar__standalone-badge"
2832
+ };
2833
+ var _hoisted_22$1 = {
2709
2834
  class: "mint-topbar__job-status",
2710
2835
  "aria-live": "polite"
2711
2836
  };
2712
- var _hoisted_22$1 = [
2837
+ var _hoisted_23$1 = [
2713
2838
  "title",
2714
2839
  "aria-label",
2715
2840
  "aria-expanded",
2716
2841
  "aria-controls"
2717
2842
  ];
2718
- var _hoisted_23$1 = {
2843
+ var _hoisted_24$1 = {
2719
2844
  key: 0,
2720
2845
  class: "mint-topbar__job-bar",
2721
2846
  "aria-hidden": "true"
2722
2847
  };
2723
- var _hoisted_24$1 = [
2848
+ var _hoisted_25$1 = [
2724
2849
  "aria-label",
2725
2850
  "aria-expanded",
2726
2851
  "aria-controls"
2727
2852
  ];
2728
- var _hoisted_25$1 = {
2853
+ var _hoisted_26$1 = {
2729
2854
  key: 0,
2730
2855
  class: "mint-topbar__job-count",
2731
2856
  "aria-hidden": "true"
2732
2857
  };
2858
+ var _hoisted_27$1 = [
2859
+ "aria-label",
2860
+ "title",
2861
+ "disabled",
2862
+ "aria-busy",
2863
+ "data-action",
2864
+ "onClick"
2865
+ ];
2866
+ var _hoisted_28$1 = [
2867
+ "aria-expanded",
2868
+ "onClick",
2869
+ "onKeydown"
2870
+ ];
2871
+ var _hoisted_29$1 = {
2872
+ key: 4,
2873
+ class: "mint-topbar__legacy-actions"
2874
+ };
2875
+ var _hoisted_30$1 = { class: "mint-topbar__tail" };
2876
+ var MAX_VISIBLE_ACTIONS = 2;
2733
2877
  //#endregion
2734
2878
  //#region src/components/AppTopBar.vue
2735
2879
  var AppTopBar_default = /* @__PURE__ */ defineComponent({
@@ -2762,29 +2906,50 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
2762
2906
  * Full application top bar with brand logo, static plugin identity, page selector, centered pill nav, experiment popover, and an account slot.
2763
2907
  *
2764
2908
  * The `#icon` slot applies in standalone mode only; integrated branding comes from `Metadata.icon`.
2909
+ *
2910
+ * The order is fixed: identity or page selector, pills, the context group (standalone badge, run slot,
2911
+ * onboarding, `spec.actions`), then the tail: theme toggle, settings, `#account`. Below 1024px of bar
2912
+ * width the pills and the context group move to a second row. Inside a responsive AppLayout the bar
2913
+ * holds the sidebar drawer button.
2765
2914
  */
2766
2915
  const props = __props;
2767
2916
  const config = computed(() => applySpecDefaults({
2768
2917
  variant: "card",
2769
2918
  homePath: "/",
2770
2919
  logo: true,
2771
- themeToggle: false,
2772
- settings: false,
2773
2920
  standaloneLabel: "Standalone"
2774
2921
  }, props.spec));
2775
- const settingsConfig = computed(() => toValue(config.value.settings) || void 0);
2776
- const showSettings = computed(() => settingsConfig.value !== void 0);
2777
- const SettingsModal = defineAsyncComponent(() => import("./SettingsModal-B1ltysmg.js").then((n) => n.n));
2778
- const ExperimentPopover = defineAsyncComponent(() => import("./ExperimentPopover-DyjoXwry.js").then((n) => n.n));
2779
- const ExperimentSelectorModal = defineAsyncComponent(() => import("./ExperimentSelectorModal-CUkKmgfr.js").then((n) => n.n));
2922
+ const settingsConfig = computed(() => toValue(config.value.settings) || {});
2923
+ /** Plugin buttons: two show, the rest fold into the More menu. */
2924
+ const visibleActions = computed(() => (config.value.actions ?? []).slice(0, MAX_VISIBLE_ACTIONS));
2925
+ const overflowActions = computed(() => (config.value.actions ?? []).slice(MAX_VISIBLE_ACTIONS));
2926
+ const overflowMenuItems = computed(() => overflowActions.value.map(({ id, label, disabled, loading }) => ({
2927
+ id,
2928
+ label,
2929
+ disabled: disabled || loading
2930
+ })));
2931
+ function selectOverflowAction(item) {
2932
+ overflowActions.value.find((action) => action.id === item.id)?.onSelect();
2933
+ }
2934
+ const drawer = inject(APP_LAYOUT_SIDEBAR_KEY, null);
2935
+ const SettingsModal = defineAsyncComponent(() => import("./SettingsModal-DPNblTe9.js").then((n) => n.n));
2936
+ const ExperimentPopover = defineAsyncComponent(() => import("./ExperimentPopover-DYy_s0kI.js").then((n) => n.n));
2937
+ const ExperimentSelectorModal = defineAsyncComponent(() => import("./ExperimentSelectorModal-Bfh5bdkv.js").then((n) => n.n));
2780
2938
  const emit = __emit;
2781
2939
  const settingsOpen = ref(false);
2782
2940
  const headerEl = ref(null);
2783
2941
  let untrackToastOffset;
2942
+ const compact = ref(false);
2943
+ let compactTracker;
2784
2944
  onMounted(() => {
2785
- if (headerEl.value) untrackToastOffset = trackTopBarForToasts(headerEl.value);
2945
+ if (!headerEl.value) return;
2946
+ untrackToastOffset = trackTopBarForToasts(headerEl.value);
2947
+ compactTracker = trackTopBarCompact(headerEl.value, compact);
2948
+ });
2949
+ onBeforeUnmount(() => {
2950
+ untrackToastOffset?.();
2951
+ compactTracker?.stop();
2786
2952
  });
2787
- onBeforeUnmount(() => untrackToastOffset?.());
2788
2953
  const { integrated: isIntegrated, plugin } = usePlatform();
2789
2954
  const isStandalone = computed(() => !isIntegrated.value);
2790
2955
  const appExperiment = inject(APP_EXPERIMENT_KEY, null);
@@ -2822,6 +2987,14 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
2822
2987
  cancelled: CircleX
2823
2988
  };
2824
2989
  const slots = useSlots();
2990
+ if (props.spec.themeToggle !== void 0) warnDeprecatedOnce("topbar.themeToggle", "AppTopBar spec.themeToggle is ignored: the theme toggle always shows. Remove it; it is removed in 2.0.");
2991
+ for (const name of [
2992
+ "nav",
2993
+ "center",
2994
+ "actions",
2995
+ "page-selector-icon",
2996
+ "page-selector-item-icon"
2997
+ ]) if (slots[name]) warnDeprecatedOnce(`topbar.slot.${name}`, name.startsWith("page-selector") ? `AppTopBar #${name} is deprecated: give the page an icon (a Lucide name). It is removed in 2.0.` : `AppTopBar #${name} is deprecated${name === "actions" ? ": use spec.actions" : ""}. It is removed in 2.0.`);
2825
2998
  const pluginIcon = computed(() => plugin.value?.icon || (slots.logo ? void 0 : pluginIdentity.icon));
2826
2999
  const seeded = computed(() => isStandalone.value && !props.title && !props.subtitle);
2827
3000
  const titleText = computed(() => props.title || (seeded.value ? pluginIdentity.name : void 0));
@@ -2840,6 +3013,17 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
2840
3013
  const pageSelectorPluginName = computed(() => isIntegrated.value ? plugin.value?.display_name || plugin.value?.name : props.title || pluginIdentity.name);
2841
3014
  const identitySubtitle = computed(() => plugin.value?.subtitle || plugin.value?.description);
2842
3015
  const hasPillNav = computed(() => !!config.value.pills?.length);
3016
+ const showStandaloneBadge = computed(() => config.value.standaloneLabel !== false && isStandalone.value);
3017
+ const showRunSlot = computed(() => showExperiment.value || props.job !== void 0 || runSlotJoined.value);
3018
+ /** The context group: standalone badge, run slot, onboarding and plugin buttons. Below 1024px it is row 2. */
3019
+ watch([
3020
+ () => config.value.actions?.map((action) => action.label).join(),
3021
+ () => props.job === void 0,
3022
+ () => props.job === null,
3023
+ showExperiment,
3024
+ () => config.value.pills?.length
3025
+ ], () => compactTracker?.reset());
3026
+ const hasContext = computed(() => showStandaloneBadge.value || showRunSlot.value || !!config.value.actions?.length || !!slots.actions || !!onboarding?.enabled.value);
2843
3027
  const hasTitleGroup = computed(() => !hasPageSelector.value && !identityName.value && !!titleText.value && !!subtitleText.value);
2844
3028
  const hasTitleOnly = computed(() => !hasPageSelector.value && !identityName.value && !hasTitleGroup.value && !!titleText.value);
2845
3029
  const normalizedPageSelector = computed(() => props.pageSelector?.map(normalizeItemInput) ?? []);
@@ -2855,9 +3039,24 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
2855
3039
  createElementVNode("header", {
2856
3040
  ref_key: "headerEl",
2857
3041
  ref: headerEl,
2858
- class: normalizeClass(["mint-topbar", `mint-topbar--${config.value.variant}`])
2859
- }, [createElementVNode("div", _hoisted_1$4, [
2860
- createElementVNode("div", _hoisted_2$2, [
3042
+ class: normalizeClass([
3043
+ "mint-topbar",
3044
+ `mint-topbar--${config.value.variant}`,
3045
+ { "mint-topbar--compact": compact.value }
3046
+ ])
3047
+ }, [createElementVNode("div", { class: normalizeClass(["mint-topbar__container", { "mint-topbar__container--stackable": hasPillNav.value || _ctx.$slots.center || hasContext.value }]) }, [
3048
+ createElementVNode("div", _hoisted_1$4, [
3049
+ unref(drawer) ? (openBlock(), createElementBlock("button", {
3050
+ key: 0,
3051
+ type: "button",
3052
+ class: "mint-topbar__icon-btn mint-topbar__sidebar-toggle",
3053
+ "aria-label": unref(drawer).open.value ? unref(drawer).closeLabel.value : unref(drawer).openLabel.value,
3054
+ "aria-expanded": unref(drawer).open.value,
3055
+ onClick: _cache[0] || (_cache[0] = ($event) => unref(drawer).toggle())
3056
+ }, [(openBlock(), createBlock(resolveDynamicComponent(unref(drawer).open.value ? unref(X) : unref(Menu)), {
3057
+ class: "mint-topbar__icon-btn-icon",
3058
+ "aria-hidden": "true"
3059
+ }))], 8, _hoisted_2$2)) : createCommentVNode("", true),
2861
3060
  createElementVNode("div", _hoisted_3$2, [config.value.homePath && (config.value.homePath.startsWith("http") || config.value.homePath.startsWith("/")) ? (openBlock(), createElementBlock("a", {
2862
3061
  key: 0,
2863
3062
  href: config.value.homePath,
@@ -2874,7 +3073,7 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
2874
3073
  icon: pluginIcon.value,
2875
3074
  size: "topbar",
2876
3075
  variant: "solid"
2877
- }, null, 8, ["icon"])) : renderSlot(_ctx.$slots, "logo", {}, () => [config.value.logo ? (openBlock(), createElementBlock("div", _hoisted_6$1, [..._cache[11] || (_cache[11] = [createElementVNode("div", { class: "mint-topbar__logo-icon" }, [createElementVNode("span", { class: "mint-topbar__logo-text" }, "M")], -1)])])) : createCommentVNode("", true)], void 0, 1)], void 0, 1)])) : createCommentVNode("", true)], 8, _hoisted_4$2)) : config.value.homePath ? (openBlock(), createBlock(_component_router_link, {
3076
+ }, null, 8, ["icon"])) : renderSlot(_ctx.$slots, "logo", {}, () => [config.value.logo ? (openBlock(), createElementBlock("div", _hoisted_6$1, [..._cache[12] || (_cache[12] = [createElementVNode("div", { class: "mint-topbar__logo-icon" }, [createElementVNode("span", { class: "mint-topbar__logo-text" }, "M")], -1)])])) : createCommentVNode("", true)], void 0, 1)], void 0, 1)])) : createCommentVNode("", true)], 8, _hoisted_4$2)) : config.value.homePath ? (openBlock(), createBlock(_component_router_link, {
2878
3077
  key: 1,
2879
3078
  to: config.value.homePath,
2880
3079
  class: "mint-topbar-home-link"
@@ -2891,7 +3090,7 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
2891
3090
  icon: pluginIcon.value,
2892
3091
  size: "topbar",
2893
3092
  variant: "solid"
2894
- }, null, 8, ["icon"])) : renderSlot(_ctx.$slots, "logo", {}, () => [config.value.logo ? (openBlock(), createElementBlock("div", _hoisted_8$1, [..._cache[12] || (_cache[12] = [createElementVNode("div", { class: "mint-topbar__logo-icon" }, [createElementVNode("span", { class: "mint-topbar__logo-text" }, "M")], -1)])])) : createCommentVNode("", true)], void 0, 1)], void 0, 1)])) : createCommentVNode("", true)]),
3093
+ }, null, 8, ["icon"])) : renderSlot(_ctx.$slots, "logo", {}, () => [config.value.logo ? (openBlock(), createElementBlock("div", _hoisted_8$1, [..._cache[13] || (_cache[13] = [createElementVNode("div", { class: "mint-topbar__logo-icon" }, [createElementVNode("span", { class: "mint-topbar__logo-text" }, "M")], -1)])])) : createCommentVNode("", true)], void 0, 1)], void 0, 1)])) : createCommentVNode("", true)]),
2895
3094
  _: 3
2896
3095
  }, 8, ["to"])) : (openBlock(), createElementBlock(Fragment, { key: 2 }, [unref(isIntegrated) || _ctx.$slots.icon || _ctx.$slots.logo || pluginIcon.value || config.value.logo ? (openBlock(), createElementBlock("span", _hoisted_9$1, [unref(isIntegrated) ? (openBlock(), createBlock(PluginIcon_default, {
2897
3096
  key: 0,
@@ -2905,21 +3104,21 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
2905
3104
  icon: pluginIcon.value,
2906
3105
  size: "topbar",
2907
3106
  variant: "solid"
2908
- }, null, 8, ["icon"])) : renderSlot(_ctx.$slots, "logo", {}, () => [config.value.logo ? (openBlock(), createElementBlock("div", _hoisted_10$1, [..._cache[13] || (_cache[13] = [createElementVNode("div", { class: "mint-topbar__logo-icon" }, [createElementVNode("span", { class: "mint-topbar__logo-text" }, "M")], -1)])])) : createCommentVNode("", true)], void 0, 1)], void 0, 1)])) : createCommentVNode("", true)], 64))]),
3107
+ }, null, 8, ["icon"])) : renderSlot(_ctx.$slots, "logo", {}, () => [config.value.logo ? (openBlock(), createElementBlock("div", _hoisted_10$1, [..._cache[14] || (_cache[14] = [createElementVNode("div", { class: "mint-topbar__logo-icon" }, [createElementVNode("span", { class: "mint-topbar__logo-text" }, "M")], -1)])])) : createCommentVNode("", true)], void 0, 1)], void 0, 1)])) : createCommentVNode("", true)], 64))]),
2909
3108
  identityName.value ? (openBlock(), createElementBlock("span", _hoisted_11$1, [createElementVNode("span", _hoisted_12$1, toDisplayString(identityName.value), 1), identitySubtitle.value ? (openBlock(), createElementBlock("span", _hoisted_13$1, toDisplayString(identitySubtitle.value), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true),
2910
3109
  hasPlatformPageSelector.value ? (openBlock(), createElementBlock("span", {
2911
- key: 1,
3110
+ key: 2,
2912
3111
  ref_key: "platformPageSelectorEl",
2913
3112
  ref: platformPageSelectorEl,
2914
3113
  class: "mint-topbar__platform-page-selector",
2915
3114
  "data-onboarding": "topbar-page-selector"
2916
3115
  }, null, 512)) : hasPropPageSelector.value ? (openBlock(), createBlock(AppTopBarPageSelectorInternal_default, {
2917
- key: 2,
3116
+ key: 3,
2918
3117
  "data-onboarding": "topbar-page-selector",
2919
3118
  pages: normalizedPageSelector.value,
2920
3119
  "current-page-id": __props.currentPageSelectorId,
2921
3120
  "plugin-name": pageSelectorPluginName.value,
2922
- onSelect: _cache[0] || (_cache[0] = ($event) => emit("page-selector-select", $event))
3121
+ onSelect: _cache[1] || (_cache[1] = ($event) => emit("page-selector-select", $event))
2923
3122
  }, createSlots({ _: 2 }, [_ctx.$slots["page-selector-icon"] ? {
2924
3123
  name: "icon",
2925
3124
  fn: withCtx((slotProps) => [renderSlot(_ctx.$slots, "page-selector-icon", normalizeProps(guardReactiveProps(slotProps)))]),
@@ -2941,11 +3140,11 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
2941
3140
  items: normalizedPillNav.value,
2942
3141
  "current-item-id": __props.pill,
2943
3142
  onSelect: handlePillSelect,
2944
- onOptionSelect: _cache[1] || (_cache[1] = (option, item) => emit("pill-option-select", option, item))
3143
+ onOptionSelect: _cache[2] || (_cache[2] = (option, item) => emit("pill-option-select", option, item))
2945
3144
  }, null, 8, ["items", "current-item-id"])) : createCommentVNode("", true)])])) : createCommentVNode("", true),
2946
- createElementVNode("div", _hoisted_19$1, [
2947
- config.value.standaloneLabel !== false && isStandalone.value ? (openBlock(), createElementBlock("span", _hoisted_20$1, toDisplayString(config.value.standaloneLabel), 1)) : createCommentVNode("", true),
2948
- showExperiment.value || __props.job !== void 0 || runSlotJoined.value ? (openBlock(), createElementBlock("div", {
3145
+ createElementVNode("div", _hoisted_19$1, [hasContext.value ? (openBlock(), createElementBlock("div", _hoisted_20$1, [
3146
+ showStandaloneBadge.value ? (openBlock(), createElementBlock("span", _hoisted_21$1, toDisplayString(config.value.standaloneLabel), 1)) : createCommentVNode("", true),
3147
+ showRunSlot.value ? (openBlock(), createElementBlock("div", {
2949
3148
  key: 1,
2950
3149
  class: normalizeClass(["mint-topbar__run-slot", { "mint-topbar__run-slot--joined": runSlotJoined.value }]),
2951
3150
  "data-onboarding": "topbar-run"
@@ -2954,11 +3153,11 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
2954
3153
  ...unref(appExperiment).popover.value,
2955
3154
  showSave: false
2956
3155
  } : unref(appExperiment).popover.value, {
2957
- onSelect: _cache[2] || (_cache[2] = ($event) => unref(appExperiment).openModal()),
2958
- onSave: _cache[3] || (_cache[3] = ($event) => unref(appExperiment).handleSave()),
2959
- onDetach: _cache[4] || (_cache[4] = ($event) => unref(appExperiment).handleDetach())
3156
+ onSelect: _cache[3] || (_cache[3] = ($event) => unref(appExperiment).openModal()),
3157
+ onSave: _cache[4] || (_cache[4] = ($event) => unref(appExperiment).handleSave()),
3158
+ onDetach: _cache[5] || (_cache[5] = ($event) => unref(appExperiment).handleDetach())
2960
3159
  }), null, 16)) : createCommentVNode("", true),
2961
- createElementVNode("span", _hoisted_21$1, toDisplayString(__props.job ? JOB_STATUS_TEXT[__props.job.status] : ""), 1),
3160
+ createElementVNode("span", _hoisted_22$1, toDisplayString(__props.job ? JOB_STATUS_TEXT[__props.job.status] : ""), 1),
2962
3161
  createVNode(Transition, {
2963
3162
  name: "mint-topbar-job",
2964
3163
  mode: "out-in",
@@ -2974,48 +3173,110 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
2974
3173
  "aria-label": jobName.value,
2975
3174
  "aria-expanded": __props.jobsOpen,
2976
3175
  "aria-controls": __props.jobsPanelId,
2977
- onClick: _cache[5] || (_cache[5] = ($event) => emit("job-click"))
3176
+ onClick: _cache[6] || (_cache[6] = ($event) => emit("job-click"))
2978
3177
  }, [(openBlock(), createBlock(resolveDynamicComponent(JOB_ICONS[__props.job.status]), {
2979
3178
  class: normalizeClass(["mint-topbar__job-icon", { "mint-topbar__job-icon--spin": __props.job.status === "running" || __props.job.status === "queued" }]),
2980
3179
  size: 14,
2981
3180
  "aria-hidden": "true"
2982
- }, null, 8, ["class"])), jobPercent.value != null ? (openBlock(), createElementBlock("span", _hoisted_23$1, [createElementVNode("span", { style: normalizeStyle({ width: `${jobPercent.value}%` }) }, null, 4)])) : createCommentVNode("", true)], 10, _hoisted_22$1)) : __props.job === null ? (openBlock(), createElementBlock("button", {
3181
+ }, null, 8, ["class"])), jobPercent.value != null ? (openBlock(), createElementBlock("span", _hoisted_24$1, [createElementVNode("span", { style: normalizeStyle({ width: `${jobPercent.value}%` }) }, null, 4)])) : createCommentVNode("", true)], 10, _hoisted_23$1)) : __props.job === null ? (openBlock(), createElementBlock("button", {
2983
3182
  key: "idle",
2984
3183
  type: "button",
2985
3184
  class: "mint-topbar__job mint-topbar__job--idle",
2986
- "aria-label": __props.jobsDone ? `Jobs, ${__props.jobsDone} completed` : void 0,
3185
+ "aria-label": __props.jobsDone ? `Jobs, ${__props.jobsDone} completed` : "Jobs",
3186
+ title: "Jobs",
2987
3187
  "aria-expanded": __props.jobsOpen,
2988
3188
  "aria-controls": __props.jobsPanelId,
2989
- onClick: _cache[6] || (_cache[6] = ($event) => emit("job-click"))
3189
+ onClick: _cache[7] || (_cache[7] = ($event) => emit("job-click"))
2990
3190
  }, [
2991
3191
  createVNode(unref(ListChecks), {
2992
3192
  class: "mint-topbar__job-icon",
2993
3193
  size: 14,
2994
3194
  "aria-hidden": "true"
2995
3195
  }),
2996
- _cache[14] || (_cache[14] = createElementVNode("span", { class: "mint-topbar__job-label" }, "Jobs", -1)),
2997
- __props.jobsDone ? (openBlock(), createElementBlock("span", _hoisted_25$1, toDisplayString(__props.jobsDone), 1)) : createCommentVNode("", true)
2998
- ], 8, _hoisted_24$1)) : createCommentVNode("", true)]),
3196
+ _cache[15] || (_cache[15] = createElementVNode("span", { class: "mint-topbar__job-label" }, "Jobs", -1)),
3197
+ __props.jobsDone ? (openBlock(), createElementBlock("span", _hoisted_26$1, toDisplayString(__props.jobsDone), 1)) : createCommentVNode("", true)
3198
+ ], 8, _hoisted_25$1)) : createCommentVNode("", true)]),
2999
3199
  _: 1
3000
3200
  })
3001
3201
  ], 2)) : createCommentVNode("", true),
3002
- renderSlot(_ctx.$slots, "actions"),
3003
3202
  unref(onboarding)?.enabled.value ? (openBlock(), createBlock(AppTopBarOnboardingInternal_default, {
3004
3203
  key: 2,
3005
3204
  state: unref(onboarding)
3006
3205
  }, null, 8, ["state"])) : createCommentVNode("", true),
3007
- config.value.themeToggle ? (openBlock(), createBlock(ThemeToggle_default, {
3206
+ (openBlock(true), createElementBlock(Fragment, null, renderList(visibleActions.value, (action) => {
3207
+ return openBlock(), createElementBlock(Fragment, { key: action.id }, [action.icon ? (openBlock(), createElementBlock("button", {
3208
+ key: 0,
3209
+ type: "button",
3210
+ class: "mint-topbar__icon-btn",
3211
+ "aria-label": action.label,
3212
+ title: action.title ?? action.label,
3213
+ disabled: action.disabled || action.loading,
3214
+ "aria-busy": action.loading || void 0,
3215
+ "data-action": action.id,
3216
+ onClick: ($event) => action.onSelect()
3217
+ }, [action.loading ? (openBlock(), createBlock(unref(LoaderCircle), {
3218
+ key: 0,
3219
+ class: "mint-topbar__icon-btn-icon mint-topbar__job-icon--spin",
3220
+ "aria-hidden": "true"
3221
+ })) : (openBlock(), createBlock(LucideIconInternal_default, {
3222
+ key: 1,
3223
+ name: action.icon,
3224
+ size: 16
3225
+ }, null, 8, ["name"])), action.dot ? (openBlock(), createElementBlock("span", {
3226
+ key: 2,
3227
+ class: normalizeClass(["mint-topbar__icon-btn-dot", `mint-topbar__icon-btn-dot--${action.dot}`]),
3228
+ "aria-hidden": "true"
3229
+ }, null, 2)) : createCommentVNode("", true)], 8, _hoisted_27$1)) : (openBlock(), createBlock(BaseButton_default, {
3230
+ key: 1,
3231
+ variant: "secondary",
3232
+ size: "sm",
3233
+ title: action.title,
3234
+ loading: action.loading,
3235
+ disabled: action.disabled,
3236
+ "data-action": action.id,
3237
+ onClick: ($event) => action.onSelect()
3238
+ }, {
3239
+ default: withCtx(() => [createTextVNode(toDisplayString(action.label), 1)]),
3240
+ _: 2
3241
+ }, 1032, [
3242
+ "title",
3243
+ "loading",
3244
+ "disabled",
3245
+ "data-action",
3246
+ "onClick"
3247
+ ]))], 64);
3248
+ }), 128)),
3249
+ overflowMenuItems.value.length ? (openBlock(), createBlock(ActionMenu_default, {
3008
3250
  key: 3,
3009
- size: "sm"
3010
- })) : createCommentVNode("", true),
3011
- showSettings.value ? (openBlock(), createElementBlock("button", {
3012
- key: 4,
3251
+ label: "More actions",
3252
+ items: overflowMenuItems.value,
3253
+ onSelect: selectOverflowAction
3254
+ }, {
3255
+ trigger: withCtx(({ open, toggle, keydown }) => [createElementVNode("button", {
3256
+ type: "button",
3257
+ class: "mint-topbar__icon-btn",
3258
+ "aria-label": "More actions",
3259
+ title: "More actions",
3260
+ "aria-haspopup": "menu",
3261
+ "aria-expanded": open,
3262
+ onClick: toggle,
3263
+ onKeydown: keydown
3264
+ }, [createVNode(unref(Ellipsis), {
3265
+ class: "mint-topbar__icon-btn-icon",
3266
+ "aria-hidden": "true"
3267
+ })], 40, _hoisted_28$1)]),
3268
+ _: 1
3269
+ }, 8, ["items"])) : createCommentVNode("", true),
3270
+ _ctx.$slots.actions ? (openBlock(), createElementBlock("span", _hoisted_29$1, [renderSlot(_ctx.$slots, "actions")])) : createCommentVNode("", true)
3271
+ ])) : createCommentVNode("", true), createElementVNode("div", _hoisted_30$1, [
3272
+ createVNode(ThemeToggle_default, { size: "sm" }),
3273
+ createElementVNode("button", {
3013
3274
  type: "button",
3014
3275
  class: "mint-topbar__settings-btn",
3015
3276
  "aria-label": "Open settings",
3016
3277
  "data-onboarding": "topbar-settings",
3017
- onClick: _cache[7] || (_cache[7] = ($event) => settingsOpen.value = true)
3018
- }, [..._cache[15] || (_cache[15] = [createElementVNode("svg", {
3278
+ onClick: _cache[8] || (_cache[8] = ($event) => settingsOpen.value = true)
3279
+ }, [..._cache[16] || (_cache[16] = [createElementVNode("svg", {
3019
3280
  class: "mint-topbar__settings-icon",
3020
3281
  viewBox: "0 0 24 24",
3021
3282
  fill: "none",
@@ -3027,14 +3288,14 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
3027
3288
  cx: "12",
3028
3289
  cy: "12",
3029
3290
  r: "3"
3030
- })], -1)])])) : createCommentVNode("", true),
3291
+ })], -1)])]),
3031
3292
  renderSlot(_ctx.$slots, "account")
3032
- ])
3033
- ])], 2),
3034
- showSettings.value && settingsOpen.value ? (openBlock(), createBlock(unref(SettingsModal), {
3293
+ ])])
3294
+ ], 2)], 2),
3295
+ settingsOpen.value ? (openBlock(), createBlock(unref(SettingsModal), {
3035
3296
  key: 0,
3036
3297
  open: settingsOpen.value,
3037
- "onUpdate:open": _cache[8] || (_cache[8] = ($event) => settingsOpen.value = $event),
3298
+ "onUpdate:open": _cache[9] || (_cache[9] = ($event) => settingsOpen.value = $event),
3038
3299
  title: settingsConfig.value?.title,
3039
3300
  tabs: normalizedSettingsTabs.value,
3040
3301
  "show-appearance": settingsConfig.value?.showAppearance ?? true,
@@ -3044,7 +3305,7 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
3044
3305
  spec: settingsConfig.value?.spec,
3045
3306
  values: settingsConfig.value?.values,
3046
3307
  "user-type": settingsConfig.value?.userType,
3047
- "onUpdate:values": _cache[9] || (_cache[9] = ($event) => emit("settings-values-change", $event))
3308
+ "onUpdate:values": _cache[10] || (_cache[10] = ($event) => emit("settings-values-change", $event))
3048
3309
  }, createSlots({
3049
3310
  appearance: withCtx(() => [renderSlot(_ctx.$slots, "settings-appearance")]),
3050
3311
  _: 2
@@ -3065,7 +3326,7 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
3065
3326
  "values",
3066
3327
  "user-type"
3067
3328
  ])) : createCommentVNode("", true),
3068
- unref(appExperiment) && !isStandalone.value && canBindExperiment.value && unref(appExperiment).selectorModal.value.open ? (openBlock(), createBlock(unref(ExperimentSelectorModal), mergeProps({ key: 1 }, unref(appExperiment).selectorModal.value, { "onUpdate:open": _cache[10] || (_cache[10] = ($event) => $event ? unref(appExperiment).openModal() : unref(appExperiment).closeModal()) }), null, 16)) : createCommentVNode("", true)
3329
+ unref(appExperiment) && !isStandalone.value && canBindExperiment.value && unref(appExperiment).selectorModal.value.open ? (openBlock(), createBlock(unref(ExperimentSelectorModal), mergeProps({ key: 1 }, unref(appExperiment).selectorModal.value, { "onUpdate:open": _cache[11] || (_cache[11] = ($event) => $event ? unref(appExperiment).openModal() : unref(appExperiment).closeModal()) }), null, 16)) : createCommentVNode("", true)
3069
3330
  ], 64);
3070
3331
  };
3071
3332
  }
@@ -4534,6 +4795,6 @@ var AppSidebar_default = /* @__PURE__ */ defineComponent({
4534
4795
  }
4535
4796
  });
4536
4797
  //#endregion
4537
- export { controlValuesToComponentBindingsById as A, usePluginWorkspace as C, useControlSchema as D, getControlDefaults as E, getDefaultControlView as F, CollapsibleCard_default as I, ThemeToggle_default as L, controlsTo as M, controlsToFormSchema as N, controlBindings as O, controlsToSettingsSchema as P, useTheme as R, AppLayout_default as S, defineControls as T, provideOnboarding as _, pickExistingRecordKeys as a, normalizeItemInput as b, valuesEqual as c, useForm as d, AppTopBar_default as f, defineOnboarding as g, ONBOARDING_KEY as h, formSchemaFieldNames as i, controlValuesToComponentProps as j, controlValuesToComponentBindings as k, useFormBuilder as l, ANCHOR_WAIT_MS as m, FormSchemaInternal_default as n, pickRecordKeys as o, providePluginIdentity as p, FormFieldRendererInternal_default as r, recordValuesEqualForKeys as s, AppSidebar_default as t, evaluateCondition as u, useOnboarding as v, defineControlComponentBindings as w, normalizeLabelItemInput as x, PluginIcon_default as y };
4798
+ export { controlValuesToComponentBindings as A, warnDeprecatedOnce as C, getControlDefaults as D, defineControls as E, controlsToSettingsSchema as F, getDefaultControlView as I, CollapsibleCard_default as L, controlValuesToComponentProps as M, controlsTo as N, useControlSchema as O, controlsToFormSchema as P, ThemeToggle_default as R, AppLayout_default as S, defineControlComponentBindings as T, provideOnboarding as _, pickExistingRecordKeys as a, normalizeItemInput as b, valuesEqual as c, useForm as d, AppTopBar_default as f, defineOnboarding as g, ONBOARDING_KEY as h, formSchemaFieldNames as i, controlValuesToComponentBindingsById as j, controlBindings as k, useFormBuilder as l, ANCHOR_WAIT_MS as m, FormSchemaInternal_default as n, pickRecordKeys as o, providePluginIdentity as p, FormFieldRendererInternal_default as r, recordValuesEqualForKeys as s, AppSidebar_default as t, evaluateCondition as u, useOnboarding as v, usePluginWorkspace as w, normalizeLabelItemInput as x, PluginIcon_default as y, useTheme as z };
4538
4799
 
4539
- //# sourceMappingURL=AppSidebar-C4qQLHcH.js.map
4800
+ //# sourceMappingURL=AppSidebar-C1DT4nsZ.js.map