@morscherlab/mint-sdk 1.5.0-beta.1 → 1.5.0-beta.11

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 (174) hide show
  1. package/dist/{AlertBox-CIhqsWbN.js → AlertBox-Cai0w7gF.js} +3 -3
  2. package/dist/{AlertBox-CIhqsWbN.js.map → AlertBox-Cai0w7gF.js.map} +1 -1
  3. package/dist/{AppSidebar-BDrd7Kwn.js → AppSidebar-C-Vq5x4I.js} +410 -127
  4. package/dist/AppSidebar-C-Vq5x4I.js.map +1 -0
  5. package/dist/{ConfirmDialog-CjWoxAD1.js → ConfirmDialog-BjFsOpBe.js} +3 -3
  6. package/dist/ConfirmDialog-BjFsOpBe.js.map +1 -0
  7. package/dist/{ExperimentPopover-BM92LlrQ.js → ExperimentPopover-DYy_s0kI.js} +25 -37
  8. package/dist/ExperimentPopover-DYy_s0kI.js.map +1 -0
  9. package/dist/{ExperimentSelectorModal-LsB1ABmh.js → ExperimentSelectorModal-Bfh5bdkv.js} +37 -8
  10. package/dist/ExperimentSelectorModal-Bfh5bdkv.js.map +1 -0
  11. package/dist/{SegmentedControl-Dz41vAFM.js → SegmentedControl-B8KgyOjd.js} +2 -2
  12. package/dist/{SegmentedControl-Dz41vAFM.js.map → SegmentedControl-B8KgyOjd.js.map} +1 -1
  13. package/dist/{SettingsModal-C-MSR-bk.js → SettingsModal-DwfrD1ER.js} +7 -7
  14. package/dist/{SettingsModal-C-MSR-bk.js.map → SettingsModal-DwfrD1ER.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/FormBuilder.vue.d.ts +1 -1
  21. package/dist/components/PluginIcon.vue.d.ts +2 -2
  22. package/dist/components/PluginWorkspaceView.vue.d.ts +4 -0
  23. package/dist/components/SectionCard.vue.d.ts +13 -1
  24. package/dist/components/SettingsModal.vue.d.ts +1 -1
  25. package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +2 -2
  26. package/dist/components/internal/FormSchemaInternal.vue.d.ts +9 -9
  27. package/dist/components/internal/FormSectionRenderer.vue.d.ts +4 -4
  28. package/dist/components/internal/LucideIconInternal.vue.d.ts +17 -0
  29. package/dist/composables/appLayoutSidebar.d.ts +9 -0
  30. package/dist/composables/useExperimentSelector.d.ts +2 -0
  31. package/dist/composables/useOnboarding.d.ts +1 -1
  32. package/dist/composables/usePluginWorkspace.d.ts +2 -0
  33. package/dist/composables/useVersionedSave.d.ts +5 -2
  34. package/dist/{controlSchemaModel-BbXbMgc6.js → controlSchemaModel-BtFNZj8t.js} +2 -2
  35. package/dist/{controlSchemaModel-BbXbMgc6.js.map → controlSchemaModel-BtFNZj8t.js.map} +1 -1
  36. package/dist/{data-LzdkEZJ-.js → data-CJztFns8.js} +31 -15
  37. package/dist/{data-LzdkEZJ-.js.map → data-CJztFns8.js.map} +1 -1
  38. package/dist/data.js +8 -8
  39. package/dist/{experimentStatus-DCn2QKG7.js → experimentStatus-Deokk7Br.js} +2 -2
  40. package/dist/{experimentStatus-DCn2QKG7.js.map → experimentStatus-Deokk7Br.js.map} +1 -1
  41. package/dist/index.d.ts +0 -1
  42. package/dist/index.js +15 -20
  43. package/dist/index.js.map +1 -1
  44. package/dist/{install-UTqrAgHe.js → install-Bk02tJ5M.js} +15 -40
  45. package/dist/install-Bk02tJ5M.js.map +1 -0
  46. package/dist/install.js +1 -1
  47. package/dist/{lab-CbdDLAVr.js → lab-BYhb_cJI.js} +47 -117
  48. package/dist/lab-BYhb_cJI.js.map +1 -0
  49. package/dist/lab.js +4 -4
  50. package/dist/{records-CWRztE5M.js → records-GtiVMlTQ.js} +207 -171
  51. package/dist/records-GtiVMlTQ.js.map +1 -0
  52. package/dist/{runtime-DrL6lKAb.js → runtime-aZPUPxoB.js} +112 -54
  53. package/dist/runtime-aZPUPxoB.js.map +1 -0
  54. package/dist/runtime.js +6 -6
  55. package/dist/{shell-Ch7cJnjo.js → shell-Bk9mD4Lc.js} +5 -5
  56. package/dist/{shell-Ch7cJnjo.js.map → shell-Bk9mD4Lc.js.map} +1 -1
  57. package/dist/shell.js +5 -5
  58. package/dist/styles.css +315 -134
  59. package/dist/styles.d.ts +1 -0
  60. package/dist/types/components.d.ts +22 -2
  61. package/dist/types/generated-ui.d.ts +2 -0
  62. package/dist/types/index.d.ts +2 -2
  63. package/dist/types/instrument.d.ts +5 -17
  64. package/dist/{useDropdownState-uFIz6Yv8.js → useDropdownState-CcBzUYZ6.js} +14 -5
  65. package/dist/useDropdownState-CcBzUYZ6.js.map +1 -0
  66. package/dist/{useExperimentSamples-Cz2v3V_q.js → useExperimentSamples-CpNXvpUn.js} +3 -3
  67. package/dist/{useExperimentSamples-Cz2v3V_q.js.map → useExperimentSamples-CpNXvpUn.js.map} +1 -1
  68. package/dist/{useListReorder-QqJc1dpX.js → useListReorder-Bp4EAI2w.js} +16 -4
  69. package/dist/useListReorder-Bp4EAI2w.js.map +1 -0
  70. package/dist/{useRackEditor-BHGM1Ngz.js → useRackEditor-i2bdPUFf.js} +156 -27
  71. package/dist/useRackEditor-i2bdPUFf.js.map +1 -0
  72. package/dist/{useRealtime-CNQbrS01.js → useRealtime-BLQEjbuq.js} +3 -3
  73. package/dist/{useRealtime-CNQbrS01.js.map → useRealtime-BLQEjbuq.js.map} +1 -1
  74. package/dist/useRequest-CXyPw3eh.js +76 -0
  75. package/dist/useRequest-CXyPw3eh.js.map +1 -0
  76. package/dist/utils/deprecation.d.ts +2 -0
  77. package/dist/utils/lucideIcon.d.ts +4 -0
  78. package/package.json +7 -4
  79. package/src/__tests__/components/AppTopBar.test.ts +102 -20
  80. package/src/__tests__/components/AppTopBarCompact.test.ts +65 -0
  81. package/src/__tests__/components/AppTopBarCompactReset.test.ts +24 -0
  82. package/src/__tests__/components/AppTopBarOnboarding.test.ts +10 -0
  83. package/src/__tests__/components/AutoGroupModal.experimentLoad.test.ts +58 -0
  84. package/src/__tests__/components/BaseModal.test.ts +33 -2
  85. package/src/__tests__/components/ConfirmDialog.test.ts +2 -2
  86. package/src/__tests__/components/ExperimentPopover.test.ts +32 -0
  87. package/src/__tests__/components/ExperimentSelectorModal.test.ts +16 -0
  88. package/src/__tests__/components/PluginWorkspaceView.test.ts +20 -1
  89. package/src/__tests__/components/SectionCard.test.ts +33 -0
  90. package/src/__tests__/components/deprecationTags.test.ts +4 -18
  91. package/src/__tests__/composables/useJobCenter.test.ts +35 -0
  92. package/src/__tests__/composables/useJobsEndpoint.test.ts +50 -0
  93. package/src/__tests__/composables/useOnboarding.test.ts +2 -2
  94. package/src/__tests__/composables/useVersionedSave.test.ts +71 -6
  95. package/src/__tests__/docs/frontendDocsCatalog.test.ts +3 -3
  96. package/src/__tests__/styles/menusShellRefresh.test.ts +10 -0
  97. package/src/components/AppLayout.story.vue +5 -5
  98. package/src/components/AppLayout.vue +13 -1
  99. package/src/components/AppSidebar.vue +2 -2
  100. package/src/components/AppTopBar.compact.ts +60 -0
  101. package/src/components/AppTopBar.story.vue +39 -14
  102. package/src/components/AppTopBar.vue +222 -89
  103. package/src/components/BaseModal.vue +16 -5
  104. package/src/components/CollapsibleCard.vue +1 -1
  105. package/src/components/ConfirmDialog.vue +1 -1
  106. package/src/components/ExperimentPopover.story.vue +2 -2
  107. package/src/components/ExperimentPopover.vue +6 -22
  108. package/src/components/ExperimentSelectorModal.vue +35 -0
  109. package/src/components/FileUploader.vue +3 -35
  110. package/src/components/GeneratedPluginView.vue +34 -81
  111. package/src/components/GeneratedResultRenderer.vue +2 -1
  112. package/src/components/InstrumentStatusPanels.vue +3 -3
  113. package/src/components/PlotlyChart.vue +1 -1
  114. package/src/components/PluginIcon.story.vue +2 -2
  115. package/src/components/PluginIcon.vue +2 -2
  116. package/src/components/PluginWorkspaceView.vue +10 -1
  117. package/src/components/SectionCard.vue +42 -6
  118. package/src/components/internal/AppTopBarOnboardingInternal.vue +30 -14
  119. package/src/components/internal/AppTopBarPageSelectorInternal.vue +12 -0
  120. package/src/components/internal/AutoGroupModalInternal.vue +14 -3
  121. package/src/components/internal/LucideIconInternal.vue +23 -0
  122. package/src/composables/appLayoutSidebar.ts +11 -0
  123. package/src/composables/index.ts +1 -2
  124. package/src/composables/useExperimentSelector.ts +4 -0
  125. package/src/composables/useJobCenter.ts +21 -1
  126. package/src/composables/useJobsEndpoint.ts +15 -4
  127. package/src/composables/useOnboarding.ts +3 -3
  128. package/src/composables/usePluginWorkspace.ts +15 -4
  129. package/src/composables/useVersionedSave.ts +32 -7
  130. package/src/generated-ui/main.ts +3 -1
  131. package/src/index.ts +0 -3
  132. package/src/styles/components/alert-box.css +1 -1
  133. package/src/styles/components/app-layout.css +5 -0
  134. package/src/styles/components/app-sidebar.css +5 -5
  135. package/src/styles/components/app-top-bar.css +130 -9
  136. package/src/styles/components/button.css +3 -3
  137. package/src/styles/components/checkbox.css +1 -1
  138. package/src/styles/components/collapsible-card.css +1 -1
  139. package/src/styles/components/confirm-dialog.css +2 -2
  140. package/src/styles/components/file-uploader.css +3 -3
  141. package/src/styles/components/icon-button.css +3 -3
  142. package/src/styles/components/loading-spinner.css +1 -1
  143. package/src/styles/components/onboarding.css +39 -0
  144. package/src/styles/components/pill.css +1 -1
  145. package/src/styles/components/plugin-icon.css +2 -2
  146. package/src/styles/components/presence-avatars.css +4 -4
  147. package/src/styles/components/progress-bar.css +1 -1
  148. package/src/styles/components/section-card.css +65 -6
  149. package/src/styles/components/sequence-input.css +1 -1
  150. package/src/styles/components/slider.css +1 -1
  151. package/src/styles/components/toggle.css +1 -1
  152. package/src/styles/variables.css +10 -4
  153. package/src/types/components.ts +23 -2
  154. package/src/types/generated-ui.ts +2 -0
  155. package/src/types/index.ts +1 -1
  156. package/src/types/instrument.ts +5 -18
  157. package/src/utils/deprecation.ts +8 -0
  158. package/src/utils/lucideIcon.ts +25 -0
  159. package/src/utils/lucideIconIndex.d.ts +2 -0
  160. package/dist/AppSidebar-BDrd7Kwn.js.map +0 -1
  161. package/dist/ConfirmDialog-CjWoxAD1.js.map +0 -1
  162. package/dist/ExperimentPopover-BM92LlrQ.js.map +0 -1
  163. package/dist/ExperimentSelectorModal-LsB1ABmh.js.map +0 -1
  164. package/dist/deprecatedRootExports.d.ts +0 -191
  165. package/dist/install-UTqrAgHe.js.map +0 -1
  166. package/dist/lab-CbdDLAVr.js.map +0 -1
  167. package/dist/records-CWRztE5M.js.map +0 -1
  168. package/dist/runtime-DrL6lKAb.js.map +0 -1
  169. package/dist/useDropdownState-uFIz6Yv8.js.map +0 -1
  170. package/dist/useListReorder-QqJc1dpX.js.map +0 -1
  171. package/dist/useRackEditor-BHGM1Ngz.js.map +0 -1
  172. package/dist/useRequest-Bfsh7gIm.js +0 -215
  173. package/dist/useRequest-Bfsh7gIm.js.map +0 -1
  174. package/src/deprecatedRootExports.ts +0 -226
@@ -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-CWRztE5M.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-QqJc1dpX.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,16 +81,16 @@ 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"
92
92
  ];
93
- var _hoisted_16$2 = { class: "mint-collapsible-card__body" };
93
+ var _hoisted_16$3 = { class: "mint-collapsible-card__body" };
94
94
  var _hoisted_17$2 = { class: "mint-collapsible-card__content" };
95
95
  //#endregion
96
96
  //#region src/components/CollapsibleCard.vue
@@ -100,7 +100,7 @@ var CollapsibleCard_default = /* @__PURE__ */ defineComponent({
100
100
  title: {},
101
101
  subtitle: {},
102
102
  badge: { default: void 0 },
103
- badgeTone: { default: "cta" },
103
+ badgeTone: { default: "primary" },
104
104
  defaultOpen: {
105
105
  type: Boolean,
106
106
  default: false
@@ -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,9 +245,9 @@ 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
- default: withCtx(() => [withDirectives(createElementVNode("div", _hoisted_16$2, [createElementVNode("div", _hoisted_17$2, [renderSlot(_ctx.$slots, "default")])], 512), [[vShow, isOpen.value]])]),
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
252
252
  })], 2);
253
253
  };
@@ -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));
@@ -787,6 +786,12 @@ function usePluginWorkspace(options) {
787
786
  });
788
787
  const topBarSlotNames = computed(() => getPluginWorkspaceTopBarSlotNames(slots));
789
788
  const sidebarSlotNames = computed(() => getPluginWorkspaceSidebarSlotNames(slots));
789
+ const internalCollapsed = ref(false);
790
+ const sidebarCollapsed = computed(() => props.sidebarCollapsed ?? internalCollapsed.value);
791
+ function handleSidebarCollapsedUpdate(value) {
792
+ internalCollapsed.value = value;
793
+ emit("update:sidebarCollapsed", value);
794
+ }
790
795
  const hasSidebarSurface = computed(() => hasPluginWorkspaceSidebarSurface({
791
796
  sidebar: sidebarSpec.value,
792
797
  hasSidebarSlot: Boolean(slots.sidebar),
@@ -806,7 +811,7 @@ function usePluginWorkspace(options) {
806
811
  const sidebar = sidebarSpec.value === false ? {} : sidebarSpec.value;
807
812
  return {
808
813
  sidebarPosition: sidebar.position ?? "left",
809
- sidebarWidth: sidebar.width,
814
+ sidebarWidth: sidebarCollapsed.value ? sidebar.collapsedWidth ?? "3rem" : sidebar.width,
810
815
  floating: props.spec?.floating ?? true,
811
816
  responsiveSidebar: sidebar.responsive ?? true,
812
817
  sidebarToggleLabel: sidebar.toggleLabel ?? "Open workspace sidebar",
@@ -834,7 +839,7 @@ function usePluginWorkspace(options) {
834
839
  },
835
840
  activeView: navigationState.resolvedActiveView.value,
836
841
  values: controlsState.internalControlValues,
837
- collapsed: props.sidebarCollapsed,
842
+ collapsed: sidebarCollapsed.value,
838
843
  formLoading: props.formLoading ?? false,
839
844
  formDisabled: props.formDisabled ?? false,
840
845
  formReadonly: props.formReadonly ?? false,
@@ -844,10 +849,23 @@ function usePluginWorkspace(options) {
844
849
  controls,
845
850
  hasSidebarSurface,
846
851
  handleControlValuesUpdate: controlsState.handleControlValuesUpdate,
847
- handlePillSelect: navigationState.handlePillSelect
852
+ handlePillSelect: navigationState.handlePillSelect,
853
+ handleSidebarCollapsedUpdate
848
854
  };
849
855
  }
850
856
  //#endregion
857
+ //#region src/utils/deprecation.ts
858
+ var warned = /* @__PURE__ */ new Set();
859
+ /** Warn once per page load that a deprecated SDK option or slot is in use. */
860
+ function warnDeprecatedOnce(key, message) {
861
+ if (warned.has(key)) return;
862
+ warned.add(key);
863
+ console.warn(`[mint-sdk] ${message}`);
864
+ }
865
+ //#endregion
866
+ //#region src/composables/appLayoutSidebar.ts
867
+ var APP_LAYOUT_SIDEBAR_KEY = Symbol("mint-app-layout-sidebar");
868
+ //#endregion
851
869
  //#region src/components/AppLayout.vue?vue&type=script&setup=true&lang.ts
852
870
  var _hoisted_1$11 = {
853
871
  key: 0,
@@ -930,6 +948,7 @@ var AppLayout_default = /* @__PURE__ */ defineComponent({
930
948
  */
931
949
  const props = __props;
932
950
  const emit = __emit;
951
+ const slots = useSlots();
933
952
  const internalSidebarOpen = ref(props.defaultSidebarOpen);
934
953
  const sidebarOpenModel = computed({
935
954
  get: () => props.sidebarOpen ?? internalSidebarOpen.value,
@@ -951,6 +970,12 @@ var AppLayout_default = /* @__PURE__ */ defineComponent({
951
970
  function toggleSidebar() {
952
971
  sidebarOpenModel.value = !sidebarOpenModel.value;
953
972
  }
973
+ if (props.responsiveSidebar && slots.sidebar) provide(APP_LAYOUT_SIDEBAR_KEY, {
974
+ open: computed(() => sidebarOpenModel.value),
975
+ toggle: toggleSidebar,
976
+ openLabel: computed(() => props.sidebarToggleLabel),
977
+ closeLabel: computed(() => props.sidebarCloseLabel)
978
+ });
954
979
  function closeSidebar() {
955
980
  sidebarOpenModel.value = false;
956
981
  }
@@ -980,6 +1005,51 @@ var AppLayout_default = /* @__PURE__ */ defineComponent({
980
1005
  }
981
1006
  });
982
1007
  //#endregion
1008
+ //#region src/utils/lucideIcon.ts
1009
+ /** A Lucide icon name in kebab case, such as `activity` or `flask-conical`. */
1010
+ var LUCIDE_NAME = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
1011
+ function isLucideIconName(value) {
1012
+ return !!value && LUCIDE_NAME.test(value);
1013
+ }
1014
+ function pascalCase(name) {
1015
+ return name.replace(/(^|-)([a-z0-9])/g, (_, __, char) => char.toUpperCase());
1016
+ }
1017
+ var iconSet;
1018
+ /** The Lucide component for `name`, or undefined when Lucide has no such icon. */
1019
+ async function loadLucideIcon(name) {
1020
+ iconSet ??= import("lucide-vue-next/dist/esm/icons/index.js");
1021
+ return (await iconSet)[pascalCase(name)];
1022
+ }
1023
+ //#endregion
1024
+ //#region src/components/internal/LucideIconInternal.vue
1025
+ var LucideIconInternal_default = /* @__PURE__ */ defineComponent({
1026
+ __name: "LucideIconInternal",
1027
+ props: {
1028
+ name: {},
1029
+ size: {}
1030
+ },
1031
+ setup(__props) {
1032
+ /** Internal: renders a Lucide icon by name; shows `fallback` until it loads or when the name is unknown. */
1033
+ const props = __props;
1034
+ const icon = shallowRef();
1035
+ watchEffect(async (onCleanup) => {
1036
+ let stale = false;
1037
+ onCleanup(() => {
1038
+ stale = true;
1039
+ });
1040
+ const loaded = await loadLucideIcon(props.name);
1041
+ if (!stale) icon.value = loaded;
1042
+ });
1043
+ return (_ctx, _cache) => {
1044
+ return icon.value ? (openBlock(), createBlock(resolveDynamicComponent(icon.value), {
1045
+ key: 0,
1046
+ size: __props.size ?? 14,
1047
+ "aria-hidden": "true"
1048
+ }, null, 8, ["size"])) : renderSlot(_ctx.$slots, "fallback", {}, void 0, void 0, 1);
1049
+ };
1050
+ }
1051
+ });
1052
+ //#endregion
983
1053
  //#region src/utils/items.ts
984
1054
  function normalizeItemInput(item) {
985
1055
  if (typeof item === "object") return item;
@@ -1374,31 +1444,33 @@ var _hoisted_1$8 = {
1374
1444
  };
1375
1445
  var _hoisted_2$6 = { class: "mint-page-selector__plugin" };
1376
1446
  var _hoisted_3$6 = ["aria-expanded"];
1377
- var _hoisted_4$6 = {
1378
- key: 1,
1447
+ var _hoisted_4$6 = { class: "mint-page-selector__icon-fallback" };
1448
+ var _hoisted_5$6 = {
1449
+ key: 2,
1379
1450
  class: "mint-page-selector__icon-fallback"
1380
1451
  };
1381
- var _hoisted_5$6 = { class: "mint-page-selector__label" };
1382
- var _hoisted_6$5 = {
1452
+ var _hoisted_6$5 = { class: "mint-page-selector__label" };
1453
+ var _hoisted_7$5 = {
1383
1454
  class: "mint-page-selector__chevron-wrap",
1384
1455
  "aria-hidden": "true"
1385
1456
  };
1386
- var _hoisted_7$5 = ["aria-label"];
1387
- var _hoisted_8$5 = {
1457
+ var _hoisted_8$5 = ["aria-label"];
1458
+ var _hoisted_9$5 = {
1388
1459
  class: "mint-page-selector__menu-title",
1389
1460
  "aria-hidden": "true"
1390
1461
  };
1391
- var _hoisted_9$5 = {
1392
- key: 1,
1462
+ var _hoisted_10$5 = { class: "mint-page-selector__icon-fallback" };
1463
+ var _hoisted_11$5 = {
1464
+ key: 2,
1393
1465
  class: "mint-page-selector__icon-fallback"
1394
1466
  };
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 = {
1467
+ var _hoisted_12$4 = { class: "mint-page-selector__item-text" };
1468
+ var _hoisted_13$4 = { class: "mint-page-selector__item-label" };
1469
+ var _hoisted_14$3 = {
1398
1470
  key: 0,
1399
1471
  class: "mint-page-selector__item-hint"
1400
1472
  };
1401
- var _hoisted_13$4 = {
1473
+ var _hoisted_15$3 = {
1402
1474
  key: 0,
1403
1475
  class: "mint-page-selector__item-key",
1404
1476
  "aria-hidden": "true"
@@ -1503,9 +1575,15 @@ var AppTopBarPageSelectorInternal_default = /* @__PURE__ */ defineComponent({
1503
1575
  icon: current.value.icon,
1504
1576
  size: "sm",
1505
1577
  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", {
1578
+ }, null, 8, ["icon"])) : unref(isLucideIconName)(current.value.icon) ? (openBlock(), createBlock(LucideIconInternal_default, {
1579
+ key: 1,
1580
+ name: current.value.icon
1581
+ }, {
1582
+ fallback: withCtx(() => [createElementVNode("span", _hoisted_4$6, toDisplayString(current.value.label.charAt(0)), 1)]),
1583
+ _: 1
1584
+ }, 8, ["name"])) : (openBlock(), createElementBlock("span", _hoisted_5$6, toDisplayString(current.value.label.charAt(0)), 1))])], 2)) : createCommentVNode("", true),
1585
+ createElementVNode("span", _hoisted_6$5, toDisplayString(current.value?.label ?? __props.placeholder), 1),
1586
+ createElementVNode("span", _hoisted_7$5, [(openBlock(), createElementBlock("svg", {
1509
1587
  class: normalizeClass(["mint-page-selector__chevron", { "mint-page-selector__chevron--open": unref(isOpen) }]),
1510
1588
  viewBox: "0 0 24 24",
1511
1589
  fill: "none",
@@ -1521,7 +1599,7 @@ var AppTopBarPageSelectorInternal_default = /* @__PURE__ */ defineComponent({
1521
1599
  role: "menu",
1522
1600
  "aria-label": menuTitle.value,
1523
1601
  onKeydown: handleMenuKeydown
1524
- }, [createElementVNode("div", _hoisted_8$5, toDisplayString(menuTitle.value), 1), (openBlock(true), createElementBlock(Fragment, null, renderList(normalizedPages.value, (page, index) => {
1602
+ }, [createElementVNode("div", _hoisted_9$5, toDisplayString(menuTitle.value), 1), (openBlock(true), createElementBlock(Fragment, null, renderList(normalizedPages.value, (page, index) => {
1525
1603
  return openBlock(), createBlock(ActionItemInternal_default, {
1526
1604
  key: page.id,
1527
1605
  href: page.href,
@@ -1544,9 +1622,15 @@ var AppTopBarPageSelectorInternal_default = /* @__PURE__ */ defineComponent({
1544
1622
  icon: page.icon,
1545
1623
  size: "sm",
1546
1624
  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)
1625
+ }, null, 8, ["icon"])) : unref(isLucideIconName)(page.icon) ? (openBlock(), createBlock(LucideIconInternal_default, {
1626
+ key: 1,
1627
+ name: page.icon
1628
+ }, {
1629
+ fallback: withCtx(() => [createElementVNode("span", _hoisted_10$5, toDisplayString(page.label.charAt(0)), 1)]),
1630
+ _: 2
1631
+ }, 1032, ["name"])) : (openBlock(), createElementBlock("span", _hoisted_11$5, toDisplayString(page.label.charAt(0)), 1))])], 2),
1632
+ 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)]),
1633
+ index < 9 ? (openBlock(), createElementBlock("span", _hoisted_15$3, toDisplayString(index + 1), 1)) : createCommentVNode("", true)
1550
1634
  ]),
1551
1635
  _: 2
1552
1636
  }, 1032, [
@@ -1558,7 +1642,7 @@ var AppTopBarPageSelectorInternal_default = /* @__PURE__ */ defineComponent({
1558
1642
  "aria-keyshortcuts",
1559
1643
  "onClick"
1560
1644
  ]);
1561
- }), 128))], 40, _hoisted_7$5)) : createCommentVNode("", true)], 4)], 512);
1645
+ }), 128))], 40, _hoisted_8$5)) : createCommentVNode("", true)], 4)], 512);
1562
1646
  };
1563
1647
  }
1564
1648
  });
@@ -2052,31 +2136,35 @@ var OnboardingLayerInternal_default = /* @__PURE__ */ defineComponent({
2052
2136
  });
2053
2137
  //#endregion
2054
2138
  //#region src/components/internal/AppTopBarOnboardingInternal.vue?vue&type=script&setup=true&lang.ts
2055
- var _hoisted_1$5 = ["aria-expanded"];
2056
- var _hoisted_2$3 = { class: "mint-onboarding-help__count" };
2057
- var _hoisted_3$3 = {
2139
+ var _hoisted_1$5 = {
2140
+ key: 0,
2141
+ class: "mint-onboarding-help__chip-group"
2142
+ };
2143
+ var _hoisted_2$3 = ["aria-expanded"];
2144
+ var _hoisted_3$3 = { class: "mint-onboarding-help__count" };
2145
+ var _hoisted_4$3 = {
2058
2146
  class: "mint-onboarding-help__bar",
2059
2147
  "aria-hidden": "true"
2060
2148
  };
2061
- var _hoisted_4$3 = ["aria-label", "aria-expanded"];
2062
- var _hoisted_5$3 = {
2149
+ var _hoisted_5$3 = ["aria-label", "aria-expanded"];
2150
+ var _hoisted_6$2 = {
2063
2151
  key: 0,
2064
2152
  class: "mint-onboarding-help__badge",
2065
2153
  "aria-hidden": "true"
2066
2154
  };
2067
- var _hoisted_6$2 = { class: "mint-onboarding-help__header" };
2068
- var _hoisted_7$2 = { class: "mint-onboarding-help__count" };
2069
- var _hoisted_8$2 = {
2155
+ var _hoisted_7$2 = { class: "mint-onboarding-help__header" };
2156
+ var _hoisted_8$2 = { class: "mint-onboarding-help__count" };
2157
+ var _hoisted_9$2 = {
2070
2158
  class: "mint-onboarding-help__progress",
2071
2159
  "aria-hidden": "true"
2072
2160
  };
2073
- var _hoisted_9$2 = { class: "mint-onboarding-help__todos" };
2074
- var _hoisted_10$2 = ["aria-label"];
2075
- var _hoisted_11$2 = { class: "mint-onboarding-help__todo-title" };
2076
- var _hoisted_12$2 = ["onClick"];
2161
+ var _hoisted_10$2 = { class: "mint-onboarding-help__todos" };
2162
+ var _hoisted_11$2 = ["aria-label"];
2163
+ var _hoisted_12$2 = { class: "mint-onboarding-help__todo-title" };
2077
2164
  var _hoisted_13$2 = ["onClick"];
2078
2165
  var _hoisted_14$2 = ["onClick"];
2079
- var _hoisted_15$2 = {
2166
+ var _hoisted_15$2 = ["onClick"];
2167
+ var _hoisted_16$2 = {
2080
2168
  key: 0,
2081
2169
  class: "mint-onboarding-help__new"
2082
2170
  };
@@ -2130,6 +2218,10 @@ var AppTopBarOnboardingInternal_default = /* @__PURE__ */ defineComponent({
2130
2218
  });
2131
2219
  });
2132
2220
  onBeforeUnmount(() => stopAutoUpdate?.());
2221
+ function hideChecklist() {
2222
+ props.state.setChecklistHidden(true);
2223
+ nextTick(() => helpButton.value?.focus());
2224
+ }
2133
2225
  function run(action) {
2134
2226
  open.value = false;
2135
2227
  action();
@@ -2148,8 +2240,7 @@ var AppTopBarOnboardingInternal_default = /* @__PURE__ */ defineComponent({
2148
2240
  ref: root,
2149
2241
  class: "mint-onboarding-help"
2150
2242
  }, [
2151
- __props.state.checklistVisible.value ? (openBlock(), createElementBlock("button", {
2152
- key: 0,
2243
+ __props.state.checklistVisible.value ? (openBlock(), createElementBlock("span", _hoisted_1$5, [createElementVNode("button", {
2153
2244
  type: "button",
2154
2245
  class: normalizeClass(["mint-onboarding-help__chip", { "mint-onboarding-help__chip--open": open.value }]),
2155
2246
  "data-onboarding": "topbar-checklist",
@@ -2157,9 +2248,18 @@ var AppTopBarOnboardingInternal_default = /* @__PURE__ */ defineComponent({
2157
2248
  onClick: toggle
2158
2249
  }, [
2159
2250
  _cache[1] || (_cache[1] = createTextVNode(" Getting started ", -1)),
2160
- createElementVNode("span", _hoisted_2$3, toDisplayString(__props.state.tasksDone.value) + "/" + toDisplayString(__props.state.tasks.value.length), 1),
2161
- createElementVNode("span", _hoisted_3$3, [createElementVNode("span", { style: normalizeStyle({ width: `${progress.value}%` }) }, null, 4)])
2162
- ], 10, _hoisted_1$5)) : createCommentVNode("", true),
2251
+ createElementVNode("span", _hoisted_3$3, toDisplayString(__props.state.tasksDone.value) + "/" + toDisplayString(__props.state.tasks.value.length), 1),
2252
+ createElementVNode("span", _hoisted_4$3, [createElementVNode("span", { style: normalizeStyle({ width: `${progress.value}%` }) }, null, 4)])
2253
+ ], 10, _hoisted_2$3), createElementVNode("button", {
2254
+ type: "button",
2255
+ class: "mint-onboarding-help__chip-close",
2256
+ "aria-label": "Hide checklist",
2257
+ title: "Hide checklist (Help can show it again)",
2258
+ onClick: hideChecklist
2259
+ }, [createVNode(unref(X), {
2260
+ size: 12,
2261
+ "aria-hidden": "true"
2262
+ })])])) : createCommentVNode("", true),
2163
2263
  createElementVNode("button", {
2164
2264
  ref_key: "helpButton",
2165
2265
  ref: helpButton,
@@ -2172,7 +2272,7 @@ var AppTopBarOnboardingInternal_default = /* @__PURE__ */ defineComponent({
2172
2272
  }, [createVNode(unref(CircleHelp), {
2173
2273
  class: "mint-topbar__settings-icon",
2174
2274
  "aria-hidden": "true"
2175
- }), __props.state.unseenNews.value ? (openBlock(), createElementBlock("span", _hoisted_5$3, toDisplayString(__props.state.unseenNews.value), 1)) : createCommentVNode("", true)], 10, _hoisted_4$3),
2275
+ }), __props.state.unseenNews.value ? (openBlock(), createElementBlock("span", _hoisted_6$2, toDisplayString(__props.state.unseenNews.value), 1)) : createCommentVNode("", true)], 10, _hoisted_5$3),
2176
2276
  (openBlock(), createBlock(Teleport, { to: "body" }, [open.value ? (openBlock(), createElementBlock("div", {
2177
2277
  key: 0,
2178
2278
  ref_key: "panel",
@@ -2186,9 +2286,9 @@ var AppTopBarOnboardingInternal_default = /* @__PURE__ */ defineComponent({
2186
2286
  })
2187
2287
  }, [
2188
2288
  __props.state.tasks.value.length ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
2189
- createElementVNode("div", _hoisted_6$2, [_cache[2] || (_cache[2] = createElementVNode("span", { class: "mint-onboarding-help__heading" }, "Getting started", -1)), createElementVNode("span", _hoisted_7$2, toDisplayString(__props.state.tasksDone.value) + "/" + toDisplayString(__props.state.tasks.value.length), 1)]),
2190
- createElementVNode("div", _hoisted_8$2, [createElementVNode("span", { style: normalizeStyle({ width: `${progress.value}%` }) }, null, 4)]),
2191
- createElementVNode("ul", _hoisted_9$2, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.state.tasks.value, (task) => {
2289
+ createElementVNode("div", _hoisted_7$2, [_cache[2] || (_cache[2] = createElementVNode("span", { class: "mint-onboarding-help__heading" }, "Getting started", -1)), createElementVNode("span", _hoisted_8$2, toDisplayString(__props.state.tasksDone.value) + "/" + toDisplayString(__props.state.tasks.value.length), 1)]),
2290
+ createElementVNode("div", _hoisted_9$2, [createElementVNode("span", { style: normalizeStyle({ width: `${progress.value}%` }) }, null, 4)]),
2291
+ createElementVNode("ul", _hoisted_10$2, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.state.tasks.value, (task) => {
2192
2292
  return openBlock(), createElementBlock("li", {
2193
2293
  key: task.id,
2194
2294
  class: normalizeClass(["mint-onboarding-help__todo", { "mint-onboarding-help__todo--done": task.done }])
@@ -2202,14 +2302,14 @@ var AppTopBarOnboardingInternal_default = /* @__PURE__ */ defineComponent({
2202
2302
  size: 10,
2203
2303
  "stroke-width": 3,
2204
2304
  "aria-hidden": "true"
2205
- })) : createCommentVNode("", true)], 8, _hoisted_10$2),
2206
- createElementVNode("span", _hoisted_11$2, toDisplayString(task.title), 1),
2305
+ })) : createCommentVNode("", true)], 8, _hoisted_11$2),
2306
+ createElementVNode("span", _hoisted_12$2, toDisplayString(task.title), 1),
2207
2307
  task.action && !task.done ? (openBlock(), createElementBlock("button", {
2208
2308
  key: 0,
2209
2309
  type: "button",
2210
2310
  class: "mint-onboarding-help__link",
2211
2311
  onClick: ($event) => run(task.action.run)
2212
- }, toDisplayString(task.action.label), 9, _hoisted_12$2)) : createCommentVNode("", true)
2312
+ }, toDisplayString(task.action.label), 9, _hoisted_13$2)) : createCommentVNode("", true)
2213
2313
  ], 2);
2214
2314
  }), 128))]),
2215
2315
  __props.state.tasksDone.value < __props.state.tasks.value.length ? (openBlock(), createElementBlock("button", {
@@ -2228,7 +2328,7 @@ var AppTopBarOnboardingInternal_default = /* @__PURE__ */ defineComponent({
2228
2328
  }, [createVNode(unref(Play), {
2229
2329
  class: "mint-onboarding-help__icon",
2230
2330
  "aria-hidden": "true"
2231
- }), createTextVNode(" " + toDisplayString(tour.title), 1)], 8, _hoisted_13$2);
2331
+ }), createTextVNode(" " + toDisplayString(tour.title), 1)], 8, _hoisted_14$2);
2232
2332
  }), 128))], 64)) : createCommentVNode("", true),
2233
2333
  __props.state.news.value.length ? (openBlock(), createElementBlock(Fragment, { key: 2 }, [_cache[4] || (_cache[4] = createElementVNode("div", { class: "mint-onboarding-help__section" }, "What's new", -1)), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.state.news.value, (item) => {
2234
2334
  return openBlock(), createElementBlock("button", {
@@ -2236,7 +2336,7 @@ var AppTopBarOnboardingInternal_default = /* @__PURE__ */ defineComponent({
2236
2336
  type: "button",
2237
2337
  class: "mint-menu-item",
2238
2338
  onClick: ($event) => run(() => __props.state.showNews(item.id))
2239
- }, [createTextVNode(toDisplayString(item.title) + " ", 1), item.unseen ? (openBlock(), createElementBlock("span", _hoisted_15$2, "New")) : createCommentVNode("", true)], 8, _hoisted_14$2);
2339
+ }, [createTextVNode(toDisplayString(item.title) + " ", 1), item.unseen ? (openBlock(), createElementBlock("span", _hoisted_16$2, "New")) : createCommentVNode("", true)], 8, _hoisted_15$2);
2240
2340
  }), 128))], 64)) : createCommentVNode("", true)
2241
2341
  ], 4)) : createCommentVNode("", true)]))
2242
2342
  ], 512)) : createCommentVNode("", true), createVNode(OnboardingLayerInternal_default, { state: __props.state }, null, 8, ["state"])], 64);
@@ -2493,8 +2593,7 @@ function provideOnboarding(definition, options) {
2493
2593
  }
2494
2594
  function dismiss() {
2495
2595
  autoStartAbort?.abort();
2496
- const tour = run?.tour;
2497
- if (tour) markSeen(...tour.steps.map((step) => stepKey(tour, step)));
2596
+ if (run?.tour) markSeen(...(definition.tours ?? []).flatMap((tour) => tour.steps.map((step) => stepKey(tour, step))));
2498
2597
  stop();
2499
2598
  }
2500
2599
  function complete(taskId) {
@@ -2632,9 +2731,53 @@ function trackTopBarForToasts(el) {
2632
2731
  };
2633
2732
  }
2634
2733
  //#endregion
2734
+ //#region src/components/AppTopBar.compact.ts
2735
+ var CHIP_MIN_PX = 192;
2736
+ var LABELS = ".mint-experiment-popover__save-label, .mint-topbar__job-label";
2737
+ /** Identity text that truncates when the left side is squeezed. */
2738
+ var IDENTITY_TEXT = ".mint-page-selector__plugin, .mint-page-selector__label, .mint-topbar__plugin-name, .mint-topbar-title, .mint-topbar__title-only";
2739
+ function overflows(el) {
2740
+ return !!el && el.scrollWidth > el.clientWidth + 1;
2741
+ }
2742
+ function trackTopBarCompact(header, compact) {
2743
+ if (typeof ResizeObserver === "undefined") return {
2744
+ reset: () => {},
2745
+ stop: () => {}
2746
+ };
2747
+ let expandAt = 0;
2748
+ function check() {
2749
+ const width = header.clientWidth;
2750
+ if (compact.value) {
2751
+ if (width >= expandAt) compact.value = false;
2752
+ return;
2753
+ }
2754
+ const chip = header.querySelector(".mint-experiment-popover__trigger");
2755
+ 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;
2756
+ const labelsWidth = [...header.querySelectorAll(LABELS)].reduce((sum, el) => sum + el.getBoundingClientRect().width, 0);
2757
+ if (labelsWidth === 0) return;
2758
+ expandAt = width + labelsWidth;
2759
+ compact.value = true;
2760
+ }
2761
+ const observer = new ResizeObserver(check);
2762
+ function observe() {
2763
+ observer.disconnect();
2764
+ observer.observe(header);
2765
+ for (const el of header.querySelectorAll(".mint-topbar__center, .mint-topbar__context")) observer.observe(el);
2766
+ }
2767
+ observe();
2768
+ return {
2769
+ reset: () => {
2770
+ compact.value = false;
2771
+ expandAt = 0;
2772
+ requestAnimationFrame(observe);
2773
+ },
2774
+ stop: () => observer.disconnect()
2775
+ };
2776
+ }
2777
+ //#endregion
2635
2778
  //#region src/components/AppTopBar.vue?vue&type=script&setup=true&lang.ts
2636
- var _hoisted_1$4 = { class: "mint-topbar__container" };
2637
- var _hoisted_2$2 = { class: "mint-topbar__start" };
2779
+ var _hoisted_1$4 = { class: "mint-topbar__start" };
2780
+ var _hoisted_2$2 = ["aria-label", "aria-expanded"];
2638
2781
  var _hoisted_3$2 = { class: "mint-topbar__brand" };
2639
2782
  var _hoisted_4$2 = ["href"];
2640
2783
  var _hoisted_5$2 = {
@@ -2662,7 +2805,7 @@ var _hoisted_10$1 = {
2662
2805
  class: "mint-topbar__logo"
2663
2806
  };
2664
2807
  var _hoisted_11$1 = {
2665
- key: 0,
2808
+ key: 1,
2666
2809
  class: "mint-topbar__plugin-identity"
2667
2810
  };
2668
2811
  var _hoisted_12$1 = { class: "mint-topbar__plugin-name" };
@@ -2671,13 +2814,13 @@ var _hoisted_13$1 = {
2671
2814
  class: "mint-topbar__plugin-subtitle"
2672
2815
  };
2673
2816
  var _hoisted_14$1 = {
2674
- key: 3,
2817
+ key: 4,
2675
2818
  class: "mint-topbar-title-group"
2676
2819
  };
2677
2820
  var _hoisted_15$1 = { class: "mint-topbar-title" };
2678
2821
  var _hoisted_16$1 = { class: "mint-topbar-subtitle" };
2679
2822
  var _hoisted_17$1 = {
2680
- key: 4,
2823
+ key: 5,
2681
2824
  class: "mint-topbar__title-only"
2682
2825
  };
2683
2826
  var _hoisted_18$1 = {
@@ -2688,33 +2831,56 @@ var _hoisted_18$1 = {
2688
2831
  var _hoisted_19$1 = { class: "mint-topbar__right" };
2689
2832
  var _hoisted_20$1 = {
2690
2833
  key: 0,
2691
- class: "mint-topbar__standalone-badge"
2834
+ class: "mint-topbar__context"
2692
2835
  };
2693
2836
  var _hoisted_21$1 = {
2837
+ key: 0,
2838
+ class: "mint-topbar__standalone-badge"
2839
+ };
2840
+ var _hoisted_22$1 = {
2694
2841
  class: "mint-topbar__job-status",
2695
2842
  "aria-live": "polite"
2696
2843
  };
2697
- var _hoisted_22$1 = [
2844
+ var _hoisted_23$1 = [
2698
2845
  "title",
2699
2846
  "aria-label",
2700
2847
  "aria-expanded",
2701
2848
  "aria-controls"
2702
2849
  ];
2703
- var _hoisted_23$1 = {
2850
+ var _hoisted_24$1 = {
2704
2851
  key: 0,
2705
2852
  class: "mint-topbar__job-bar",
2706
2853
  "aria-hidden": "true"
2707
2854
  };
2708
- var _hoisted_24$1 = [
2855
+ var _hoisted_25$1 = [
2709
2856
  "aria-label",
2710
2857
  "aria-expanded",
2711
2858
  "aria-controls"
2712
2859
  ];
2713
- var _hoisted_25$1 = {
2860
+ var _hoisted_26$1 = {
2714
2861
  key: 0,
2715
2862
  class: "mint-topbar__job-count",
2716
2863
  "aria-hidden": "true"
2717
2864
  };
2865
+ var _hoisted_27$1 = [
2866
+ "aria-label",
2867
+ "title",
2868
+ "disabled",
2869
+ "aria-busy",
2870
+ "data-action",
2871
+ "onClick"
2872
+ ];
2873
+ var _hoisted_28$1 = [
2874
+ "aria-expanded",
2875
+ "onClick",
2876
+ "onKeydown"
2877
+ ];
2878
+ var _hoisted_29$1 = {
2879
+ key: 4,
2880
+ class: "mint-topbar__legacy-actions"
2881
+ };
2882
+ var _hoisted_30$1 = { class: "mint-topbar__tail" };
2883
+ var MAX_VISIBLE_ACTIONS = 2;
2718
2884
  //#endregion
2719
2885
  //#region src/components/AppTopBar.vue
2720
2886
  var AppTopBar_default = /* @__PURE__ */ defineComponent({
@@ -2747,29 +2913,50 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
2747
2913
  * Full application top bar with brand logo, static plugin identity, page selector, centered pill nav, experiment popover, and an account slot.
2748
2914
  *
2749
2915
  * The `#icon` slot applies in standalone mode only; integrated branding comes from `Metadata.icon`.
2916
+ *
2917
+ * The order is fixed: identity or page selector, pills, the context group (standalone badge, run slot,
2918
+ * onboarding, `spec.actions`), then the tail: theme toggle, settings, `#account`. Below 1024px of bar
2919
+ * width the pills and the context group move to a second row. Inside a responsive AppLayout the bar
2920
+ * holds the sidebar drawer button.
2750
2921
  */
2751
2922
  const props = __props;
2752
2923
  const config = computed(() => applySpecDefaults({
2753
2924
  variant: "card",
2754
2925
  homePath: "/",
2755
2926
  logo: true,
2756
- themeToggle: false,
2757
- settings: false,
2758
2927
  standaloneLabel: "Standalone"
2759
2928
  }, props.spec));
2760
- const settingsConfig = computed(() => toValue(config.value.settings) || void 0);
2761
- const showSettings = computed(() => settingsConfig.value !== void 0);
2762
- const SettingsModal = defineAsyncComponent(() => import("./SettingsModal-C-MSR-bk.js").then((n) => n.n));
2763
- const ExperimentPopover = defineAsyncComponent(() => import("./ExperimentPopover-BM92LlrQ.js").then((n) => n.n));
2764
- const ExperimentSelectorModal = defineAsyncComponent(() => import("./ExperimentSelectorModal-LsB1ABmh.js").then((n) => n.n));
2929
+ const settingsConfig = computed(() => toValue(config.value.settings) || {});
2930
+ /** Plugin buttons: two show, the rest fold into the More menu. */
2931
+ const visibleActions = computed(() => (config.value.actions ?? []).slice(0, MAX_VISIBLE_ACTIONS));
2932
+ const overflowActions = computed(() => (config.value.actions ?? []).slice(MAX_VISIBLE_ACTIONS));
2933
+ const overflowMenuItems = computed(() => overflowActions.value.map(({ id, label, disabled, loading }) => ({
2934
+ id,
2935
+ label,
2936
+ disabled: disabled || loading
2937
+ })));
2938
+ function selectOverflowAction(item) {
2939
+ overflowActions.value.find((action) => action.id === item.id)?.onSelect();
2940
+ }
2941
+ const drawer = inject(APP_LAYOUT_SIDEBAR_KEY, null);
2942
+ const SettingsModal = defineAsyncComponent(() => import("./SettingsModal-DwfrD1ER.js").then((n) => n.n));
2943
+ const ExperimentPopover = defineAsyncComponent(() => import("./ExperimentPopover-DYy_s0kI.js").then((n) => n.n));
2944
+ const ExperimentSelectorModal = defineAsyncComponent(() => import("./ExperimentSelectorModal-Bfh5bdkv.js").then((n) => n.n));
2765
2945
  const emit = __emit;
2766
2946
  const settingsOpen = ref(false);
2767
2947
  const headerEl = ref(null);
2768
2948
  let untrackToastOffset;
2949
+ const compact = ref(false);
2950
+ let compactTracker;
2769
2951
  onMounted(() => {
2770
- if (headerEl.value) untrackToastOffset = trackTopBarForToasts(headerEl.value);
2952
+ if (!headerEl.value) return;
2953
+ untrackToastOffset = trackTopBarForToasts(headerEl.value);
2954
+ compactTracker = trackTopBarCompact(headerEl.value, compact);
2955
+ });
2956
+ onBeforeUnmount(() => {
2957
+ untrackToastOffset?.();
2958
+ compactTracker?.stop();
2771
2959
  });
2772
- onBeforeUnmount(() => untrackToastOffset?.());
2773
2960
  const { integrated: isIntegrated, plugin } = usePlatform();
2774
2961
  const isStandalone = computed(() => !isIntegrated.value);
2775
2962
  const appExperiment = inject(APP_EXPERIMENT_KEY, null);
@@ -2807,6 +2994,14 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
2807
2994
  cancelled: CircleX
2808
2995
  };
2809
2996
  const slots = useSlots();
2997
+ 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.");
2998
+ for (const name of [
2999
+ "nav",
3000
+ "center",
3001
+ "actions",
3002
+ "page-selector-icon",
3003
+ "page-selector-item-icon"
3004
+ ]) 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.`);
2810
3005
  const pluginIcon = computed(() => plugin.value?.icon || (slots.logo ? void 0 : pluginIdentity.icon));
2811
3006
  const seeded = computed(() => isStandalone.value && !props.title && !props.subtitle);
2812
3007
  const titleText = computed(() => props.title || (seeded.value ? pluginIdentity.name : void 0));
@@ -2825,6 +3020,17 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
2825
3020
  const pageSelectorPluginName = computed(() => isIntegrated.value ? plugin.value?.display_name || plugin.value?.name : props.title || pluginIdentity.name);
2826
3021
  const identitySubtitle = computed(() => plugin.value?.subtitle || plugin.value?.description);
2827
3022
  const hasPillNav = computed(() => !!config.value.pills?.length);
3023
+ const showStandaloneBadge = computed(() => config.value.standaloneLabel !== false && isStandalone.value);
3024
+ const showRunSlot = computed(() => showExperiment.value || props.job !== void 0 || runSlotJoined.value);
3025
+ /** The context group: standalone badge, run slot, onboarding and plugin buttons. Below 1024px it is row 2. */
3026
+ watch([
3027
+ () => config.value.actions?.map((action) => action.label).join(),
3028
+ () => props.job === void 0,
3029
+ () => props.job === null,
3030
+ showExperiment,
3031
+ () => config.value.pills?.length
3032
+ ], () => compactTracker?.reset());
3033
+ const hasContext = computed(() => showStandaloneBadge.value || showRunSlot.value || !!config.value.actions?.length || !!slots.actions || !!onboarding?.enabled.value);
2828
3034
  const hasTitleGroup = computed(() => !hasPageSelector.value && !identityName.value && !!titleText.value && !!subtitleText.value);
2829
3035
  const hasTitleOnly = computed(() => !hasPageSelector.value && !identityName.value && !hasTitleGroup.value && !!titleText.value);
2830
3036
  const normalizedPageSelector = computed(() => props.pageSelector?.map(normalizeItemInput) ?? []);
@@ -2840,9 +3046,24 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
2840
3046
  createElementVNode("header", {
2841
3047
  ref_key: "headerEl",
2842
3048
  ref: headerEl,
2843
- class: normalizeClass(["mint-topbar", `mint-topbar--${config.value.variant}`])
2844
- }, [createElementVNode("div", _hoisted_1$4, [
2845
- createElementVNode("div", _hoisted_2$2, [
3049
+ class: normalizeClass([
3050
+ "mint-topbar",
3051
+ `mint-topbar--${config.value.variant}`,
3052
+ { "mint-topbar--compact": compact.value }
3053
+ ])
3054
+ }, [createElementVNode("div", { class: normalizeClass(["mint-topbar__container", { "mint-topbar__container--stackable": hasPillNav.value || _ctx.$slots.center || hasContext.value }]) }, [
3055
+ createElementVNode("div", _hoisted_1$4, [
3056
+ unref(drawer) ? (openBlock(), createElementBlock("button", {
3057
+ key: 0,
3058
+ type: "button",
3059
+ class: "mint-topbar__icon-btn mint-topbar__sidebar-toggle",
3060
+ "aria-label": unref(drawer).open.value ? unref(drawer).closeLabel.value : unref(drawer).openLabel.value,
3061
+ "aria-expanded": unref(drawer).open.value,
3062
+ onClick: _cache[0] || (_cache[0] = ($event) => unref(drawer).toggle())
3063
+ }, [(openBlock(), createBlock(resolveDynamicComponent(unref(drawer).open.value ? unref(X) : unref(Menu)), {
3064
+ class: "mint-topbar__icon-btn-icon",
3065
+ "aria-hidden": "true"
3066
+ }))], 8, _hoisted_2$2)) : createCommentVNode("", true),
2846
3067
  createElementVNode("div", _hoisted_3$2, [config.value.homePath && (config.value.homePath.startsWith("http") || config.value.homePath.startsWith("/")) ? (openBlock(), createElementBlock("a", {
2847
3068
  key: 0,
2848
3069
  href: config.value.homePath,
@@ -2859,7 +3080,7 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
2859
3080
  icon: pluginIcon.value,
2860
3081
  size: "topbar",
2861
3082
  variant: "solid"
2862
- }, 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, {
3083
+ }, 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, {
2863
3084
  key: 1,
2864
3085
  to: config.value.homePath,
2865
3086
  class: "mint-topbar-home-link"
@@ -2876,7 +3097,7 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
2876
3097
  icon: pluginIcon.value,
2877
3098
  size: "topbar",
2878
3099
  variant: "solid"
2879
- }, 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)]),
3100
+ }, 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)]),
2880
3101
  _: 3
2881
3102
  }, 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, {
2882
3103
  key: 0,
@@ -2890,21 +3111,21 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
2890
3111
  icon: pluginIcon.value,
2891
3112
  size: "topbar",
2892
3113
  variant: "solid"
2893
- }, 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))]),
3114
+ }, 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))]),
2894
3115
  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),
2895
3116
  hasPlatformPageSelector.value ? (openBlock(), createElementBlock("span", {
2896
- key: 1,
3117
+ key: 2,
2897
3118
  ref_key: "platformPageSelectorEl",
2898
3119
  ref: platformPageSelectorEl,
2899
3120
  class: "mint-topbar__platform-page-selector",
2900
3121
  "data-onboarding": "topbar-page-selector"
2901
3122
  }, null, 512)) : hasPropPageSelector.value ? (openBlock(), createBlock(AppTopBarPageSelectorInternal_default, {
2902
- key: 2,
3123
+ key: 3,
2903
3124
  "data-onboarding": "topbar-page-selector",
2904
3125
  pages: normalizedPageSelector.value,
2905
3126
  "current-page-id": __props.currentPageSelectorId,
2906
3127
  "plugin-name": pageSelectorPluginName.value,
2907
- onSelect: _cache[0] || (_cache[0] = ($event) => emit("page-selector-select", $event))
3128
+ onSelect: _cache[1] || (_cache[1] = ($event) => emit("page-selector-select", $event))
2908
3129
  }, createSlots({ _: 2 }, [_ctx.$slots["page-selector-icon"] ? {
2909
3130
  name: "icon",
2910
3131
  fn: withCtx((slotProps) => [renderSlot(_ctx.$slots, "page-selector-icon", normalizeProps(guardReactiveProps(slotProps)))]),
@@ -2926,11 +3147,11 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
2926
3147
  items: normalizedPillNav.value,
2927
3148
  "current-item-id": __props.pill,
2928
3149
  onSelect: handlePillSelect,
2929
- onOptionSelect: _cache[1] || (_cache[1] = (option, item) => emit("pill-option-select", option, item))
3150
+ onOptionSelect: _cache[2] || (_cache[2] = (option, item) => emit("pill-option-select", option, item))
2930
3151
  }, null, 8, ["items", "current-item-id"])) : createCommentVNode("", true)])])) : createCommentVNode("", true),
2931
- createElementVNode("div", _hoisted_19$1, [
2932
- config.value.standaloneLabel !== false && isStandalone.value ? (openBlock(), createElementBlock("span", _hoisted_20$1, toDisplayString(config.value.standaloneLabel), 1)) : createCommentVNode("", true),
2933
- showExperiment.value || __props.job !== void 0 || runSlotJoined.value ? (openBlock(), createElementBlock("div", {
3152
+ createElementVNode("div", _hoisted_19$1, [hasContext.value ? (openBlock(), createElementBlock("div", _hoisted_20$1, [
3153
+ showStandaloneBadge.value ? (openBlock(), createElementBlock("span", _hoisted_21$1, toDisplayString(config.value.standaloneLabel), 1)) : createCommentVNode("", true),
3154
+ showRunSlot.value ? (openBlock(), createElementBlock("div", {
2934
3155
  key: 1,
2935
3156
  class: normalizeClass(["mint-topbar__run-slot", { "mint-topbar__run-slot--joined": runSlotJoined.value }]),
2936
3157
  "data-onboarding": "topbar-run"
@@ -2939,11 +3160,11 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
2939
3160
  ...unref(appExperiment).popover.value,
2940
3161
  showSave: false
2941
3162
  } : unref(appExperiment).popover.value, {
2942
- onSelect: _cache[2] || (_cache[2] = ($event) => unref(appExperiment).openModal()),
2943
- onSave: _cache[3] || (_cache[3] = ($event) => unref(appExperiment).handleSave()),
2944
- onDetach: _cache[4] || (_cache[4] = ($event) => unref(appExperiment).handleDetach())
3163
+ onSelect: _cache[3] || (_cache[3] = ($event) => unref(appExperiment).openModal()),
3164
+ onSave: _cache[4] || (_cache[4] = ($event) => unref(appExperiment).handleSave()),
3165
+ onDetach: _cache[5] || (_cache[5] = ($event) => unref(appExperiment).handleDetach())
2945
3166
  }), null, 16)) : createCommentVNode("", true),
2946
- createElementVNode("span", _hoisted_21$1, toDisplayString(__props.job ? JOB_STATUS_TEXT[__props.job.status] : ""), 1),
3167
+ createElementVNode("span", _hoisted_22$1, toDisplayString(__props.job ? JOB_STATUS_TEXT[__props.job.status] : ""), 1),
2947
3168
  createVNode(Transition, {
2948
3169
  name: "mint-topbar-job",
2949
3170
  mode: "out-in",
@@ -2959,48 +3180,110 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
2959
3180
  "aria-label": jobName.value,
2960
3181
  "aria-expanded": __props.jobsOpen,
2961
3182
  "aria-controls": __props.jobsPanelId,
2962
- onClick: _cache[5] || (_cache[5] = ($event) => emit("job-click"))
3183
+ onClick: _cache[6] || (_cache[6] = ($event) => emit("job-click"))
2963
3184
  }, [(openBlock(), createBlock(resolveDynamicComponent(JOB_ICONS[__props.job.status]), {
2964
3185
  class: normalizeClass(["mint-topbar__job-icon", { "mint-topbar__job-icon--spin": __props.job.status === "running" || __props.job.status === "queued" }]),
2965
3186
  size: 14,
2966
3187
  "aria-hidden": "true"
2967
- }, 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", {
3188
+ }, 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", {
2968
3189
  key: "idle",
2969
3190
  type: "button",
2970
3191
  class: "mint-topbar__job mint-topbar__job--idle",
2971
- "aria-label": __props.jobsDone ? `Jobs, ${__props.jobsDone} completed` : void 0,
3192
+ "aria-label": __props.jobsDone ? `Jobs, ${__props.jobsDone} completed` : "Jobs",
3193
+ title: "Jobs",
2972
3194
  "aria-expanded": __props.jobsOpen,
2973
3195
  "aria-controls": __props.jobsPanelId,
2974
- onClick: _cache[6] || (_cache[6] = ($event) => emit("job-click"))
3196
+ onClick: _cache[7] || (_cache[7] = ($event) => emit("job-click"))
2975
3197
  }, [
2976
3198
  createVNode(unref(ListChecks), {
2977
3199
  class: "mint-topbar__job-icon",
2978
3200
  size: 14,
2979
3201
  "aria-hidden": "true"
2980
3202
  }),
2981
- _cache[14] || (_cache[14] = createElementVNode("span", { class: "mint-topbar__job-label" }, "Jobs", -1)),
2982
- __props.jobsDone ? (openBlock(), createElementBlock("span", _hoisted_25$1, toDisplayString(__props.jobsDone), 1)) : createCommentVNode("", true)
2983
- ], 8, _hoisted_24$1)) : createCommentVNode("", true)]),
3203
+ _cache[15] || (_cache[15] = createElementVNode("span", { class: "mint-topbar__job-label" }, "Jobs", -1)),
3204
+ __props.jobsDone ? (openBlock(), createElementBlock("span", _hoisted_26$1, toDisplayString(__props.jobsDone), 1)) : createCommentVNode("", true)
3205
+ ], 8, _hoisted_25$1)) : createCommentVNode("", true)]),
2984
3206
  _: 1
2985
3207
  })
2986
3208
  ], 2)) : createCommentVNode("", true),
2987
- renderSlot(_ctx.$slots, "actions"),
2988
3209
  unref(onboarding)?.enabled.value ? (openBlock(), createBlock(AppTopBarOnboardingInternal_default, {
2989
3210
  key: 2,
2990
3211
  state: unref(onboarding)
2991
3212
  }, null, 8, ["state"])) : createCommentVNode("", true),
2992
- config.value.themeToggle ? (openBlock(), createBlock(ThemeToggle_default, {
3213
+ (openBlock(true), createElementBlock(Fragment, null, renderList(visibleActions.value, (action) => {
3214
+ return openBlock(), createElementBlock(Fragment, { key: action.id }, [action.icon ? (openBlock(), createElementBlock("button", {
3215
+ key: 0,
3216
+ type: "button",
3217
+ class: "mint-topbar__icon-btn",
3218
+ "aria-label": action.label,
3219
+ title: action.title ?? action.label,
3220
+ disabled: action.disabled || action.loading,
3221
+ "aria-busy": action.loading || void 0,
3222
+ "data-action": action.id,
3223
+ onClick: ($event) => action.onSelect()
3224
+ }, [action.loading ? (openBlock(), createBlock(unref(LoaderCircle), {
3225
+ key: 0,
3226
+ class: "mint-topbar__icon-btn-icon mint-topbar__job-icon--spin",
3227
+ "aria-hidden": "true"
3228
+ })) : (openBlock(), createBlock(LucideIconInternal_default, {
3229
+ key: 1,
3230
+ name: action.icon,
3231
+ size: 16
3232
+ }, null, 8, ["name"])), action.dot ? (openBlock(), createElementBlock("span", {
3233
+ key: 2,
3234
+ class: normalizeClass(["mint-topbar__icon-btn-dot", `mint-topbar__icon-btn-dot--${action.dot}`]),
3235
+ "aria-hidden": "true"
3236
+ }, null, 2)) : createCommentVNode("", true)], 8, _hoisted_27$1)) : (openBlock(), createBlock(BaseButton_default, {
3237
+ key: 1,
3238
+ variant: "secondary",
3239
+ size: "sm",
3240
+ title: action.title,
3241
+ loading: action.loading,
3242
+ disabled: action.disabled,
3243
+ "data-action": action.id,
3244
+ onClick: ($event) => action.onSelect()
3245
+ }, {
3246
+ default: withCtx(() => [createTextVNode(toDisplayString(action.label), 1)]),
3247
+ _: 2
3248
+ }, 1032, [
3249
+ "title",
3250
+ "loading",
3251
+ "disabled",
3252
+ "data-action",
3253
+ "onClick"
3254
+ ]))], 64);
3255
+ }), 128)),
3256
+ overflowMenuItems.value.length ? (openBlock(), createBlock(ActionMenu_default, {
2993
3257
  key: 3,
2994
- size: "sm"
2995
- })) : createCommentVNode("", true),
2996
- showSettings.value ? (openBlock(), createElementBlock("button", {
2997
- key: 4,
3258
+ label: "More actions",
3259
+ items: overflowMenuItems.value,
3260
+ onSelect: selectOverflowAction
3261
+ }, {
3262
+ trigger: withCtx(({ open, toggle, keydown }) => [createElementVNode("button", {
3263
+ type: "button",
3264
+ class: "mint-topbar__icon-btn",
3265
+ "aria-label": "More actions",
3266
+ title: "More actions",
3267
+ "aria-haspopup": "menu",
3268
+ "aria-expanded": open,
3269
+ onClick: toggle,
3270
+ onKeydown: keydown
3271
+ }, [createVNode(unref(Ellipsis), {
3272
+ class: "mint-topbar__icon-btn-icon",
3273
+ "aria-hidden": "true"
3274
+ })], 40, _hoisted_28$1)]),
3275
+ _: 1
3276
+ }, 8, ["items"])) : createCommentVNode("", true),
3277
+ _ctx.$slots.actions ? (openBlock(), createElementBlock("span", _hoisted_29$1, [renderSlot(_ctx.$slots, "actions")])) : createCommentVNode("", true)
3278
+ ])) : createCommentVNode("", true), createElementVNode("div", _hoisted_30$1, [
3279
+ createVNode(ThemeToggle_default, { size: "sm" }),
3280
+ createElementVNode("button", {
2998
3281
  type: "button",
2999
3282
  class: "mint-topbar__settings-btn",
3000
3283
  "aria-label": "Open settings",
3001
3284
  "data-onboarding": "topbar-settings",
3002
- onClick: _cache[7] || (_cache[7] = ($event) => settingsOpen.value = true)
3003
- }, [..._cache[15] || (_cache[15] = [createElementVNode("svg", {
3285
+ onClick: _cache[8] || (_cache[8] = ($event) => settingsOpen.value = true)
3286
+ }, [..._cache[16] || (_cache[16] = [createElementVNode("svg", {
3004
3287
  class: "mint-topbar__settings-icon",
3005
3288
  viewBox: "0 0 24 24",
3006
3289
  fill: "none",
@@ -3012,14 +3295,14 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
3012
3295
  cx: "12",
3013
3296
  cy: "12",
3014
3297
  r: "3"
3015
- })], -1)])])) : createCommentVNode("", true),
3298
+ })], -1)])]),
3016
3299
  renderSlot(_ctx.$slots, "account")
3017
- ])
3018
- ])], 2),
3019
- showSettings.value && settingsOpen.value ? (openBlock(), createBlock(unref(SettingsModal), {
3300
+ ])])
3301
+ ], 2)], 2),
3302
+ settingsOpen.value ? (openBlock(), createBlock(unref(SettingsModal), {
3020
3303
  key: 0,
3021
3304
  open: settingsOpen.value,
3022
- "onUpdate:open": _cache[8] || (_cache[8] = ($event) => settingsOpen.value = $event),
3305
+ "onUpdate:open": _cache[9] || (_cache[9] = ($event) => settingsOpen.value = $event),
3023
3306
  title: settingsConfig.value?.title,
3024
3307
  tabs: normalizedSettingsTabs.value,
3025
3308
  "show-appearance": settingsConfig.value?.showAppearance ?? true,
@@ -3029,7 +3312,7 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
3029
3312
  spec: settingsConfig.value?.spec,
3030
3313
  values: settingsConfig.value?.values,
3031
3314
  "user-type": settingsConfig.value?.userType,
3032
- "onUpdate:values": _cache[9] || (_cache[9] = ($event) => emit("settings-values-change", $event))
3315
+ "onUpdate:values": _cache[10] || (_cache[10] = ($event) => emit("settings-values-change", $event))
3033
3316
  }, createSlots({
3034
3317
  appearance: withCtx(() => [renderSlot(_ctx.$slots, "settings-appearance")]),
3035
3318
  _: 2
@@ -3050,7 +3333,7 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
3050
3333
  "values",
3051
3334
  "user-type"
3052
3335
  ])) : createCommentVNode("", true),
3053
- 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)
3336
+ 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)
3054
3337
  ], 64);
3055
3338
  };
3056
3339
  }
@@ -4333,10 +4616,10 @@ var AppSidebar_default = /* @__PURE__ */ defineComponent({
4333
4616
  };
4334
4617
  }
4335
4618
  function badgeToneClass(section) {
4336
- return `mint-sidebar__rail-badge--${section.badgeTone ?? "cta"}`;
4619
+ return `mint-sidebar__rail-badge--${section.badgeTone ?? "primary"}`;
4337
4620
  }
4338
4621
  function tagToneClass(section) {
4339
- return `mint-sidebar__tag--${section.badgeTone ?? "cta"}`;
4622
+ return `mint-sidebar__tag--${section.badgeTone ?? "primary"}`;
4340
4623
  }
4341
4624
  function actionClasses(action) {
4342
4625
  return ["mint-sidebar__group-action", action.tone ? `mint-sidebar__group-action--${action.tone}` : ""];
@@ -4519,6 +4802,6 @@ var AppSidebar_default = /* @__PURE__ */ defineComponent({
4519
4802
  }
4520
4803
  });
4521
4804
  //#endregion
4522
- 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 };
4805
+ 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 };
4523
4806
 
4524
- //# sourceMappingURL=AppSidebar-BDrd7Kwn.js.map
4807
+ //# sourceMappingURL=AppSidebar-C-Vq5x4I.js.map