@morscherlab/mint-sdk 1.2.0 → 1.2.1

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 (99) hide show
  1. package/dist/{ExperimentSelectorModal-DCXmwKNS.js → ExperimentSelectorModal-DHE9k8TP.js} +3 -3
  2. package/dist/{ExperimentSelectorModal-DCXmwKNS.js.map → ExperimentSelectorModal-DHE9k8TP.js.map} +1 -1
  3. package/dist/{SettingsModal-BYR20I4c.js → SettingsModal-DOcCf0Vo.js} +39 -16
  4. package/dist/SettingsModal-DOcCf0Vo.js.map +1 -0
  5. package/dist/{Skeleton-BAF3CKY7.js → Skeleton-jhF9wUkU.js} +17 -7
  6. package/dist/Skeleton-jhF9wUkU.js.map +1 -0
  7. package/dist/__tests__/components/FormField.test.d.ts +1 -0
  8. package/dist/__tests__/components/NumberInput.test.d.ts +1 -0
  9. package/dist/__tests__/composables/localFiles.test.d.ts +1 -0
  10. package/dist/__tests__/composables/usePickerSelection.test.d.ts +1 -0
  11. package/dist/__tests__/styles/tokenOnlyColors.test.d.ts +1 -0
  12. package/dist/components/AppSidebar.vue.d.ts +7 -7
  13. package/dist/components/BasePill.vue.d.ts +3 -0
  14. package/dist/components/BaseTabs.vue.d.ts +1 -4
  15. package/dist/components/FileUploader.vue.d.ts +3 -0
  16. package/dist/components/FormField.vue.d.ts +8 -1
  17. package/dist/components/PluginWorkspaceView.props.d.ts +3 -3
  18. package/dist/components/index.js +5 -5
  19. package/dist/{components-DIum5hkx.js → components-Cp8DcNrU.js} +472 -259
  20. package/dist/components-Cp8DcNrU.js.map +1 -0
  21. package/dist/composables/index.js +7 -7
  22. package/dist/composables/pluginWorkspaceModel.d.ts +0 -3
  23. package/dist/composables/useToast.d.ts +22 -1
  24. package/dist/{composables-mFXsTA4g.js → composables-D_4qqOlp.js} +6 -6
  25. package/dist/{composables-mFXsTA4g.js.map → composables-D_4qqOlp.js.map} +1 -1
  26. package/dist/index.js +10 -10
  27. package/dist/install.js +2 -2
  28. package/dist/styles.css +560 -303
  29. package/dist/templates/index.js +2 -2
  30. package/dist/{templates-CmGfmBRA.js → templates-Dd9bBSs6.js} +2 -2
  31. package/dist/{templates-CmGfmBRA.js.map → templates-Dd9bBSs6.js.map} +1 -1
  32. package/dist/types/components.d.ts +21 -0
  33. package/dist/types/form-builder.d.ts +2 -0
  34. package/dist/types/generated-ui.d.ts +2 -0
  35. package/dist/types/index.d.ts +1 -1
  36. package/dist/{useControlSchema-DldpxNOP.js → useControlSchema-BB2GRPhW.js} +151 -71
  37. package/dist/useControlSchema-BB2GRPhW.js.map +1 -0
  38. package/dist/{useExperimentSelector-CEcIaueJ.js → useExperimentSelector-G_CAOFTX.js} +2 -2
  39. package/dist/{useExperimentSelector-CEcIaueJ.js.map → useExperimentSelector-G_CAOFTX.js.map} +1 -1
  40. package/dist/{useFormBuilder-z5L_dUIy.js → useFormBuilder-BnGSdSRG.js} +2 -2
  41. package/dist/{useFormBuilder-z5L_dUIy.js.map → useFormBuilder-BnGSdSRG.js.map} +1 -1
  42. package/dist/{validation-uwoJGEb6.js → validation-CTxuzLIX.js} +21 -9
  43. package/dist/validation-CTxuzLIX.js.map +1 -0
  44. package/package.json +1 -1
  45. package/src/__tests__/components/AppSidebar.test.ts +84 -94
  46. package/src/__tests__/components/AppToastContainer.test.ts +55 -1
  47. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +0 -21
  48. package/src/__tests__/components/ControlWorkspaceView.test.ts +0 -2
  49. package/src/__tests__/components/DoseDesignWorkspaceView.test.ts +0 -2
  50. package/src/__tests__/components/FormBuilder.test.ts +26 -0
  51. package/src/__tests__/components/FormField.test.ts +26 -0
  52. package/src/__tests__/components/GeneratedPathInput.test.ts +18 -0
  53. package/src/__tests__/components/NumberInput.test.ts +105 -0
  54. package/src/__tests__/components/PluginWorkspaceView.internal.test.ts +1 -2
  55. package/src/__tests__/components/PluginWorkspaceView.test.ts +1 -2
  56. package/src/__tests__/composables/localFiles.test.ts +57 -0
  57. package/src/__tests__/composables/usePickerSelection.test.ts +98 -0
  58. package/src/__tests__/generatedUi.test.ts +111 -0
  59. package/src/__tests__/styles/tokenOnlyColors.test.ts +16 -0
  60. package/src/components/AppLayout.story.vue +1 -1
  61. package/src/components/AppSidebar.story.vue +7 -10
  62. package/src/components/AppSidebar.vue +178 -58
  63. package/src/components/AppToastContainer.vue +65 -23
  64. package/src/components/BasePill.story.vue +2 -0
  65. package/src/components/BasePill.vue +4 -0
  66. package/src/components/BaseTabs.story.vue +0 -42
  67. package/src/components/BaseTabs.vue +3 -6
  68. package/src/components/FileUploader.vue +10 -1
  69. package/src/components/FormField.vue +10 -3
  70. package/src/components/GeneratedPathInput.vue +11 -7
  71. package/src/components/NumberInput.story.vue +32 -13
  72. package/src/components/NumberInput.vue +116 -55
  73. package/src/components/PluginWorkspaceView.props.ts +3 -3
  74. package/src/components/internal/FormFieldRendererInternal.vue +17 -0
  75. package/src/components/internal/WorkspaceSidebarInternal.vue +1 -2
  76. package/src/composables/filePicker/localFiles.ts +21 -14
  77. package/src/composables/filePicker/usePickerSelection.ts +15 -4
  78. package/src/composables/pluginWorkspaceModel.ts +0 -3
  79. package/src/composables/usePluginWorkspace.ts +1 -2
  80. package/src/composables/useToast.ts +21 -5
  81. package/src/generated/schema.ts +58 -18
  82. package/src/styles/components/app-sidebar.css +282 -121
  83. package/src/styles/components/form-builder.css +1 -1
  84. package/src/styles/components/form-field.css +28 -0
  85. package/src/styles/components/number-input.css +73 -91
  86. package/src/styles/components/pill.css +49 -51
  87. package/src/styles/components/segmented-control.css +16 -11
  88. package/src/styles/components/tabs.css +18 -34
  89. package/src/styles/components/toast.css +136 -27
  90. package/src/styles/variables.css +25 -5
  91. package/src/types/components.ts +23 -0
  92. package/src/types/form-builder.ts +2 -0
  93. package/src/types/generated-ui.ts +2 -0
  94. package/src/types/index.ts +2 -0
  95. package/dist/SettingsModal-BYR20I4c.js.map +0 -1
  96. package/dist/Skeleton-BAF3CKY7.js.map +0 -1
  97. package/dist/components-DIum5hkx.js.map +0 -1
  98. package/dist/useControlSchema-DldpxNOP.js.map +0 -1
  99. package/dist/validation-uwoJGEb6.js.map +0 -1
@@ -1,16 +1,16 @@
1
1
  import { n as __exportAll, r as __toESM } from "./chunk-BoAXSpZd.js";
2
2
  import { i as useApi, l as tableDensityToSize, u as tryUseSettingsStore } from "./errors-BLuqMee5.js";
3
3
  import { f as BaseModal_default, h as BaseButton_default, m as useEventListener, p as useFocusTrap } from "./experiment-utils-CV2Wza3z.js";
4
- import { a as BaseSelect_default, i as BasePill_default, n as useRequestSyncState, o as normalizeOptionInput, r as EmptyState_default, s as BaseInput_default, t as Skeleton_default } from "./Skeleton-BAF3CKY7.js";
5
- import { A as useConcentrationUnits, Bt as MultiSelect_default, Gt as BaseToggle_default, I as useChemicalFormula, Jt as BaseTextarea_default, K as useGeneratedAnalysis, Kt as BaseCheckbox_default, L as GeneratedPathInput_default, M as SequenceInput_default, O as ConcentrationInput_default, Ot as formatDuration, P as FormulaInput_default, R as ArtifactSelectorModal_default, St as TimePicker_default, Tt as durationMinutes, U as resolveCurrentExperimentId, Ut as BaseSlider_default, V as getInjectedPlatformContext, Vt as useListSelection, Wt as BaseRadioGroup_default, X as jobStatusLabel, Z as normalizeJobPercent, _ as controlsToFormSchema, at as AlertBox_default, ct as SecretInput_default, f as resolveControlModel, g as mergeControlWorkspaceOptions, it as _plugin_vue_export_helper_default, j as MoleculeInput_default, k as UnitInput_default, kt as formatTime, o as defineDoseDesignControlModel, ot as FileUploader_default, qt as Tooltip_default, r as getControlDefaults, rt as isRecord, st as NumberInput_default, tt as DateTimePicker_default, u as useControlWorkspace, wt as compareTime, x as controlsToSidebarPanels, xt as TagsInput_default, y as controlsToSectionFormSchemas, zt as DatePicker_default } from "./useControlSchema-DldpxNOP.js";
6
- import { a as pickExistingRecordKeys, c as normalizeItemInput, i as formSchemaFieldNames, l as normalizeLabelItemInput, o as recordValuesEqualForKeys, r as FormFieldRendererInternal_default, s as FormField_default, t as SettingsModal_default } from "./SettingsModal-BYR20I4c.js";
7
- import { $ as getInjectedFrontendRevision, C as useExpansionSet, E as getSampleGroupParentPath, H as useListReorder, J as usePluginWorkspace, N as useAutoGroup, P as parseCSV, Q as useAppExperiment, R as DEFAULT_COLORS, S as useExperimentData, T as getSampleGroupMajorPrefix, U as useReorderAnnouncer, W as useDoseCalculator, X as useMobileSupportGate, Y as DEFAULT_MOBILE_VIEWPORT_QUERY, Z as APP_EXPERIMENT_KEY, a as DEFAULT_PRESETS, b as useScheduleDrag, c as useReagentSeries, d as useBioTemplatePresetWorkspace, dt as useRovingFocus, et as useRuntimeAlignment, f as useBioTemplatePackWorkspace, i as useProtocolTemplates, it as useToast, k as readFileAsText, l as useGroupAssignment, lt as useSortedItems, n as pickerFormat, nt as usePresenceHeartbeat, o as DEFAULT_UNITS, q as usePluginJobCenter, r as pickerReason, rt as useTheme, st as useTextSearch, t as pickerExclusion, u as useRackEditor, ut as useMenuKeyboard, w as useSampleGroups, x as useExperimentSamples, z as useWellPlateEditor } from "./validation-uwoJGEb6.js";
4
+ import { a as BaseSelect_default, i as BasePill_default, n as useRequestSyncState, o as normalizeOptionInput, r as EmptyState_default, s as BaseInput_default, t as Skeleton_default } from "./Skeleton-jhF9wUkU.js";
5
+ import { A as useConcentrationUnits, Bt as MultiSelect_default, Gt as BaseToggle_default, I as useChemicalFormula, Jt as BaseTextarea_default, K as useGeneratedAnalysis, Kt as BaseCheckbox_default, L as GeneratedPathInput_default, M as SequenceInput_default, O as ConcentrationInput_default, Ot as formatDuration, P as FormulaInput_default, R as ArtifactSelectorModal_default, St as TimePicker_default, Tt as durationMinutes, U as resolveCurrentExperimentId, Ut as BaseSlider_default, V as getInjectedPlatformContext, Vt as useListSelection, Wt as BaseRadioGroup_default, X as jobStatusLabel, Z as normalizeJobPercent, _ as controlsToFormSchema, at as AlertBox_default, ct as SecretInput_default, f as resolveControlModel, g as mergeControlWorkspaceOptions, it as _plugin_vue_export_helper_default, j as MoleculeInput_default, k as UnitInput_default, kt as formatTime, o as defineDoseDesignControlModel, ot as FileUploader_default, qt as Tooltip_default, r as getControlDefaults, rt as isRecord, st as NumberInput_default, tt as DateTimePicker_default, u as useControlWorkspace, wt as compareTime, x as controlsToSidebarPanels, xt as TagsInput_default, y as controlsToSectionFormSchemas, zt as DatePicker_default } from "./useControlSchema-BB2GRPhW.js";
6
+ import { a as pickExistingRecordKeys, c as normalizeItemInput, i as formSchemaFieldNames, l as normalizeLabelItemInput, o as recordValuesEqualForKeys, r as FormFieldRendererInternal_default, s as FormField_default, t as SettingsModal_default } from "./SettingsModal-DOcCf0Vo.js";
7
+ import { $ as getInjectedFrontendRevision, C as useExpansionSet, E as getSampleGroupParentPath, H as useListReorder, J as usePluginWorkspace, N as useAutoGroup, P as parseCSV, Q as useAppExperiment, R as DEFAULT_COLORS, S as useExperimentData, T as getSampleGroupMajorPrefix, U as useReorderAnnouncer, W as useDoseCalculator, X as useMobileSupportGate, Y as DEFAULT_MOBILE_VIEWPORT_QUERY, Z as APP_EXPERIMENT_KEY, a as DEFAULT_PRESETS, b as useScheduleDrag, c as useReagentSeries, d as useBioTemplatePresetWorkspace, dt as useRovingFocus, et as useRuntimeAlignment, f as useBioTemplatePackWorkspace, i as useProtocolTemplates, it as useToast, k as readFileAsText, l as useGroupAssignment, lt as useSortedItems, n as pickerFormat, nt as usePresenceHeartbeat, o as DEFAULT_UNITS, q as usePluginJobCenter, r as pickerReason, rt as useTheme, st as useTextSearch, t as pickerExclusion, u as useRackEditor, ut as useMenuKeyboard, w as useSampleGroups, x as useExperimentSamples, z as useWellPlateEditor } from "./validation-CTxuzLIX.js";
8
8
  import { t as useDropdownState } from "./useDropdownState-C7hRiVQf.js";
9
- import { i as usePlatformContext, t as useFormBuilder } from "./useFormBuilder-z5L_dUIy.js";
9
+ import { i as usePlatformContext, t as useFormBuilder } from "./useFormBuilder-BnGSdSRG.js";
10
10
  import { t as ANALYSIS_FILE_ARTIFACT_SCHEMA } from "./analysisArtifactTypes-DQ0MjwHZ.js";
11
- import { B as toBioTemplateComponentProps, Cn as SLOT_ORDER, F as getBioTemplateComponentProps, H as toBioTemplateComponentPropsById, L as toBioTemplateComponentBindings, R as toBioTemplateComponentBindingsById, Sn as SLOT_COLORS, V as toBioTemplateComponentPropsByComponent, _n as createWellGrid, dn as extractTemplateCollection, gn as createPlateRowLabels, hn as createPlateColumnLabels, mn as WELL_PLATE_SIZE_CONFIGS, pn as PLATE_CONFIGS, vn as getRectangleWellIds, xn as SAMPLE_COLOR_SCALE } from "./templates-CmGfmBRA.js";
11
+ import { B as toBioTemplateComponentProps, Cn as SLOT_ORDER, F as getBioTemplateComponentProps, H as toBioTemplateComponentPropsById, L as toBioTemplateComponentBindings, R as toBioTemplateComponentBindingsById, Sn as SLOT_COLORS, V as toBioTemplateComponentPropsByComponent, _n as createWellGrid, dn as extractTemplateCollection, gn as createPlateRowLabels, hn as createPlateColumnLabels, mn as WELL_PLATE_SIZE_CONFIGS, pn as PLATE_CONFIGS, vn as getRectangleWellIds, xn as SAMPLE_COLOR_SCALE } from "./templates-Dd9bBSs6.js";
12
12
  import { r as ConfirmDialog_default, t as ExperimentPopover_default } from "./ExperimentPopover-CJdNlCZb.js";
13
- import { r as ExperimentCodeBadge_default, t as ExperimentSelectorModal_default } from "./ExperimentSelectorModal-DCXmwKNS.js";
13
+ import { r as ExperimentCodeBadge_default, t as ExperimentSelectorModal_default } from "./ExperimentSelectorModal-DHE9k8TP.js";
14
14
  import { Fragment, Teleport, Transition, TransitionGroup, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createStaticVNode, createTextVNode, createVNode, defineAsyncComponent, defineComponent, effectScope, guardReactiveProps, h, inject, isRef, mergeModels, mergeProps, nextTick, normalizeClass, normalizeProps, normalizeStyle, onBeforeUnmount, onMounted, onScopeDispose, onUnmounted, openBlock, reactive, ref, renderList, renderSlot, resolveComponent, resolveDynamicComponent, shallowRef, toDisplayString, toHandlers, toRaw, toRef, unref, useId, useModel, useSlots, vModelCheckbox, vModelSelect, vModelText, vShow, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
15
15
  import { computePosition, flip, offset, shift } from "@floating-ui/dom";
16
16
  import { Ellipsis, RefreshCw } from "lucide-vue-next";
@@ -168,7 +168,11 @@ var ColorSlider_default = /* @__PURE__ */ defineComponent({
168
168
  });
169
169
  //#endregion
170
170
  //#region src/components/BaseTabs.vue?vue&type=script&setup=true&lang.ts
171
- var _hoisted_1$85 = [
171
+ var _hoisted_1$85 = {
172
+ class: "mint-tabs mint-tabs--underline",
173
+ role: "tablist"
174
+ };
175
+ var _hoisted_2$75 = [
172
176
  "id",
173
177
  "aria-selected",
174
178
  "aria-disabled",
@@ -176,8 +180,8 @@ var _hoisted_1$85 = [
176
180
  "tabindex",
177
181
  "onClick"
178
182
  ];
179
- var _hoisted_2$75 = { class: "mint-tab__content" };
180
- var _hoisted_3$68 = {
183
+ var _hoisted_3$68 = { class: "mint-tab__content" };
184
+ var _hoisted_4$64 = {
181
185
  key: 0,
182
186
  class: "mint-tab__icon mint-tab__icon--svg",
183
187
  viewBox: "0 0 24 24",
@@ -188,13 +192,13 @@ var _hoisted_3$68 = {
188
192
  "stroke-linejoin": "round",
189
193
  "aria-hidden": "true"
190
194
  };
191
- var _hoisted_4$63 = ["d"];
192
- var _hoisted_5$60 = ["d"];
193
- var _hoisted_6$56 = {
195
+ var _hoisted_5$61 = ["d"];
196
+ var _hoisted_6$57 = ["d"];
197
+ var _hoisted_7$51 = {
194
198
  key: 1,
195
199
  class: "mint-tab__icon"
196
200
  };
197
- var _hoisted_7$50 = {
201
+ var _hoisted_8$46 = {
198
202
  key: 2,
199
203
  class: "mint-tab__badge"
200
204
  };
@@ -204,12 +208,11 @@ var BaseTabs_default = /* @__PURE__ */ defineComponent({
204
208
  __name: "BaseTabs",
205
209
  props: {
206
210
  modelValue: {},
207
- tabs: {},
208
- variant: { default: "underline" }
211
+ tabs: {}
209
212
  },
210
213
  emits: ["update:modelValue"],
211
214
  setup(__props, { emit: __emit }) {
212
- /** Renders a tab bar with underline or pills variant, badges, icons, and disabled tab support. */
215
+ /** Renders an underline tab bar with mono count badges, icons, and disabled tab support. */
213
216
  const props = __props;
214
217
  const emit = __emit;
215
218
  const activeTab = computed(() => props.modelValue);
@@ -234,10 +237,7 @@ var BaseTabs_default = /* @__PURE__ */ defineComponent({
234
237
  getElement: (id) => tabButtonRefs.get(id)
235
238
  });
236
239
  return (_ctx, _cache) => {
237
- return openBlock(), createElementBlock("div", {
238
- class: normalizeClass(["mint-tabs", `mint-tabs--${__props.variant}`]),
239
- role: "tablist"
240
- }, [(openBlock(true), createElementBlock(Fragment, null, renderList(normalizedTabs.value, (tab) => {
240
+ return openBlock(), createElementBlock("div", _hoisted_1$85, [(openBlock(true), createElementBlock(Fragment, null, renderList(normalizedTabs.value, (tab) => {
241
241
  return openBlock(), createElementBlock("button", {
242
242
  id: `mint-tab-${tab.id}`,
243
243
  key: tab.id,
@@ -256,20 +256,20 @@ var BaseTabs_default = /* @__PURE__ */ defineComponent({
256
256
  ]),
257
257
  onClick: ($event) => selectTab(tab.id),
258
258
  onKeydown: _cache[0] || (_cache[0] = (...args) => unref(handleKeydown) && unref(handleKeydown)(...args))
259
- }, [createElementVNode("span", _hoisted_2$75, [
260
- isSvgIcon(tab.icon) ? (openBlock(), createElementBlock("svg", _hoisted_3$68, [Array.isArray(tab.icon) ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(tab.icon, (d, index) => {
259
+ }, [createElementVNode("span", _hoisted_3$68, [
260
+ isSvgIcon(tab.icon) ? (openBlock(), createElementBlock("svg", _hoisted_4$64, [Array.isArray(tab.icon) ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(tab.icon, (d, index) => {
261
261
  return openBlock(), createElementBlock("path", {
262
262
  key: index,
263
263
  d
264
- }, null, 8, _hoisted_4$63);
264
+ }, null, 8, _hoisted_5$61);
265
265
  }), 128)) : (openBlock(), createElementBlock("path", {
266
266
  key: 1,
267
267
  d: tab.icon
268
- }, null, 8, _hoisted_5$60))])) : tab.icon ? (openBlock(), createElementBlock("span", _hoisted_6$56, toDisplayString(tab.icon), 1)) : createCommentVNode("", true),
268
+ }, null, 8, _hoisted_6$57))])) : tab.icon ? (openBlock(), createElementBlock("span", _hoisted_7$51, toDisplayString(tab.icon), 1)) : createCommentVNode("", true),
269
269
  createTextVNode(" " + toDisplayString(tab.label) + " ", 1),
270
- tab.badge !== void 0 ? (openBlock(), createElementBlock("span", _hoisted_7$50, toDisplayString(tab.badge), 1)) : createCommentVNode("", true)
271
- ])], 42, _hoisted_1$85);
272
- }), 128))], 2);
270
+ tab.badge !== void 0 ? (openBlock(), createElementBlock("span", _hoisted_8$46, toDisplayString(tab.badge), 1)) : createCommentVNode("", true)
271
+ ])], 42, _hoisted_2$75);
272
+ }), 128))]);
273
273
  };
274
274
  }
275
275
  });
@@ -403,20 +403,20 @@ var _hoisted_2$73 = {
403
403
  "aria-hidden": "true"
404
404
  };
405
405
  var _hoisted_3$66 = { class: "mint-dropdown-button__label" };
406
- var _hoisted_4$62 = ["aria-activedescendant"];
407
- var _hoisted_5$59 = [
406
+ var _hoisted_4$63 = ["aria-activedescendant"];
407
+ var _hoisted_5$60 = [
408
408
  "id",
409
409
  "aria-selected",
410
410
  "aria-disabled",
411
411
  "onClick",
412
412
  "onKeydown"
413
413
  ];
414
- var _hoisted_6$55 = { class: "mint-dropdown-button__option-label" };
415
- var _hoisted_7$49 = {
414
+ var _hoisted_6$56 = { class: "mint-dropdown-button__option-label" };
415
+ var _hoisted_7$50 = {
416
416
  key: 0,
417
417
  class: "mint-dropdown-button__option-description"
418
418
  };
419
- var _hoisted_8$44 = {
419
+ var _hoisted_8$45 = {
420
420
  key: 1,
421
421
  class: "mint-dropdown-button__option-check",
422
422
  viewBox: "0 0 24 24",
@@ -552,11 +552,11 @@ var DropdownButton_default = /* @__PURE__ */ defineComponent({
552
552
  onClick: ($event) => selectOption(option),
553
553
  onKeydown: [withKeys(withModifiers(($event) => selectOption(option), ["prevent"]), ["enter"]), withKeys(withModifiers(($event) => selectOption(option), ["prevent"]), ["space"])]
554
554
  }, [
555
- createElementVNode("span", _hoisted_6$55, toDisplayString(option.label), 1),
556
- option.description ? (openBlock(), createElementBlock("span", _hoisted_7$49, toDisplayString(option.description), 1)) : createCommentVNode("", true),
557
- option.value === __props.modelValue ? (openBlock(), createElementBlock("svg", _hoisted_8$44, [..._cache[4] || (_cache[4] = [createElementVNode("path", { d: "M20 6 9 17l-5-5" }, null, -1)])])) : createCommentVNode("", true)
558
- ], 42, _hoisted_5$59);
559
- }), 128))], 40, _hoisted_4$62)) : createCommentVNode("", true)]),
555
+ createElementVNode("span", _hoisted_6$56, toDisplayString(option.label), 1),
556
+ option.description ? (openBlock(), createElementBlock("span", _hoisted_7$50, toDisplayString(option.description), 1)) : createCommentVNode("", true),
557
+ option.value === __props.modelValue ? (openBlock(), createElementBlock("svg", _hoisted_8$45, [..._cache[4] || (_cache[4] = [createElementVNode("path", { d: "M20 6 9 17l-5-5" }, null, -1)])])) : createCommentVNode("", true)
558
+ ], 42, _hoisted_5$60);
559
+ }), 128))], 40, _hoisted_4$63)) : createCommentVNode("", true)]),
560
560
  _: 1
561
561
  })], 512);
562
562
  };
@@ -570,19 +570,19 @@ var _hoisted_2$72 = {
570
570
  class: "mint-calendar__header"
571
571
  };
572
572
  var _hoisted_3$65 = { class: "mint-calendar__title" };
573
- var _hoisted_4$61 = { class: "mint-calendar__weekdays" };
574
- var _hoisted_5$58 = { class: "mint-calendar__grid" };
575
- var _hoisted_6$54 = [
573
+ var _hoisted_4$62 = { class: "mint-calendar__weekdays" };
574
+ var _hoisted_5$59 = { class: "mint-calendar__grid" };
575
+ var _hoisted_6$55 = [
576
576
  "disabled",
577
577
  "onClick",
578
578
  "onMouseenter"
579
579
  ];
580
- var _hoisted_7$48 = { class: "mint-calendar__day-number" };
581
- var _hoisted_8$43 = {
580
+ var _hoisted_7$49 = { class: "mint-calendar__day-number" };
581
+ var _hoisted_8$44 = {
582
582
  key: 0,
583
583
  class: "mint-calendar__markers"
584
584
  };
585
- var _hoisted_9$41 = ["title"];
585
+ var _hoisted_9$42 = ["title"];
586
586
  //#endregion
587
587
  //#region src/components/Calendar.vue
588
588
  var Calendar_default = /* @__PURE__ */ defineComponent({
@@ -833,7 +833,7 @@ var Calendar_default = /* @__PURE__ */ defineComponent({
833
833
  "stroke-linejoin": "round"
834
834
  }, [createElementVNode("path", { d: "m9 18 6-6-6-6" })], -1)])])
835
835
  ])) : createCommentVNode("", true),
836
- createElementVNode("div", _hoisted_4$61, [(openBlock(true), createElementBlock(Fragment, null, renderList(weekDayLabels.value, (label, i) => {
836
+ createElementVNode("div", _hoisted_4$62, [(openBlock(true), createElementBlock(Fragment, null, renderList(weekDayLabels.value, (label, i) => {
837
837
  return openBlock(), createElementBlock("span", {
838
838
  key: i,
839
839
  class: "mint-calendar__weekday"
@@ -842,7 +842,7 @@ var Calendar_default = /* @__PURE__ */ defineComponent({
842
842
  index: i
843
843
  }, () => [createTextVNode(toDisplayString(label), 1)])]);
844
844
  }), 128))]),
845
- createElementVNode("div", _hoisted_5$58, [(openBlock(true), createElementBlock(Fragment, null, renderList(calendarDays.value, (day, i) => {
845
+ createElementVNode("div", _hoisted_5$59, [(openBlock(true), createElementBlock(Fragment, null, renderList(calendarDays.value, (day, i) => {
846
846
  return openBlock(), createElementBlock("button", {
847
847
  key: i,
848
848
  type: "button",
@@ -857,14 +857,14 @@ var Calendar_default = /* @__PURE__ */ defineComponent({
857
857
  }]),
858
858
  onClick: ($event) => handleDayClick(day),
859
859
  onMouseenter: ($event) => handleDayHover(day)
860
- }, [renderSlot(_ctx.$slots, "day-content", { day }, () => [createElementVNode("span", _hoisted_7$48, toDisplayString(day.dayOfMonth), 1), day.markers.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_8$43, [(openBlock(true), createElementBlock(Fragment, null, renderList(day.markers.slice(0, 3), (marker, mi) => {
860
+ }, [renderSlot(_ctx.$slots, "day-content", { day }, () => [createElementVNode("span", _hoisted_7$49, toDisplayString(day.dayOfMonth), 1), day.markers.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_8$44, [(openBlock(true), createElementBlock(Fragment, null, renderList(day.markers.slice(0, 3), (marker, mi) => {
861
861
  return openBlock(), createElementBlock("span", {
862
862
  key: mi,
863
863
  class: normalizeClass(["mint-calendar__marker", `mint-calendar__marker--${marker.type ?? "dot"}`]),
864
864
  style: normalizeStyle(marker.color ? { "--marker-color": marker.color } : {}),
865
865
  title: marker.label
866
- }, null, 14, _hoisted_9$41);
867
- }), 128))])) : createCommentVNode("", true)])], 42, _hoisted_6$54);
866
+ }, null, 14, _hoisted_9$42);
867
+ }), 128))])) : createCommentVNode("", true)])], 42, _hoisted_6$55);
868
868
  }), 128))])
869
869
  ]);
870
870
  };
@@ -990,39 +990,39 @@ var _hoisted_1$79 = {
990
990
  };
991
991
  var _hoisted_2$70 = { class: "mint-dataframe__search-wrapper" };
992
992
  var _hoisted_3$64 = ["placeholder"];
993
- var _hoisted_4$60 = { class: "mint-dataframe__table" };
994
- var _hoisted_5$57 = {
993
+ var _hoisted_4$61 = { class: "mint-dataframe__table" };
994
+ var _hoisted_5$58 = {
995
995
  key: 0,
996
996
  class: "mint-dataframe__th mint-dataframe__th--checkbox"
997
997
  };
998
- var _hoisted_6$53 = ["checked", "indeterminate"];
999
- var _hoisted_7$47 = ["aria-sort"];
1000
- var _hoisted_8$42 = { class: "mint-dataframe__th-content" };
1001
- var _hoisted_9$40 = [
998
+ var _hoisted_6$54 = ["checked", "indeterminate"];
999
+ var _hoisted_7$48 = ["aria-sort"];
1000
+ var _hoisted_8$43 = { class: "mint-dataframe__th-content" };
1001
+ var _hoisted_9$41 = [
1002
1002
  "aria-label",
1003
1003
  "aria-valuemin",
1004
1004
  "aria-valuenow",
1005
1005
  "onMousedown",
1006
1006
  "onKeydown"
1007
1007
  ];
1008
- var _hoisted_10$36 = [
1008
+ var _hoisted_10$37 = [
1009
1009
  "tabindex",
1010
1010
  "role",
1011
1011
  "onClick",
1012
1012
  "onKeydown"
1013
1013
  ];
1014
- var _hoisted_11$34 = {
1014
+ var _hoisted_11$35 = {
1015
1015
  key: 0,
1016
1016
  class: "mint-dataframe__td mint-dataframe__td--checkbox"
1017
1017
  };
1018
- var _hoisted_12$30 = ["checked", "onChange"];
1019
- var _hoisted_13$30 = ["onClick"];
1020
- var _hoisted_14$28 = [
1018
+ var _hoisted_12$31 = ["checked", "onChange"];
1019
+ var _hoisted_13$31 = ["onClick"];
1020
+ var _hoisted_14$29 = [
1021
1021
  "aria-label",
1022
1022
  "title",
1023
1023
  "onClick"
1024
1024
  ];
1025
- var _hoisted_15$28 = {
1025
+ var _hoisted_15$29 = {
1026
1026
  key: 0,
1027
1027
  class: "mint-dataframe__state"
1028
1028
  };
@@ -1034,15 +1034,15 @@ var _hoisted_17$23 = {
1034
1034
  key: 2,
1035
1035
  class: "mint-dataframe__loading"
1036
1036
  };
1037
- var _hoisted_18$20 = {
1037
+ var _hoisted_18$21 = {
1038
1038
  key: 1,
1039
1039
  class: "mint-dataframe__footer"
1040
1040
  };
1041
- var _hoisted_19$17 = { class: "mint-dataframe__page-info" };
1042
- var _hoisted_20$16 = { class: "mint-dataframe__page-controls" };
1043
- var _hoisted_21$15 = ["disabled"];
1044
- var _hoisted_22$14 = { class: "mint-dataframe__page-number" };
1045
- var _hoisted_23$13 = ["disabled"];
1041
+ var _hoisted_19$18 = { class: "mint-dataframe__page-info" };
1042
+ var _hoisted_20$17 = { class: "mint-dataframe__page-controls" };
1043
+ var _hoisted_21$16 = ["disabled"];
1044
+ var _hoisted_22$15 = { class: "mint-dataframe__page-number" };
1045
+ var _hoisted_23$14 = ["disabled"];
1046
1046
  /** Inbox glyph kept from the pre-1.2 hand-rolled empty state. */
1047
1047
  var EMPTY_ICON_PATH$2 = "M22 12L16 12L14 15L10 15L8 12L2 12M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z";
1048
1048
  var MIN_COL_WIDTH = 48;
@@ -1347,14 +1347,14 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1347
1347
  class: "mint-dataframe__table-wrapper",
1348
1348
  style: normalizeStyle(wrapperStyle.value)
1349
1349
  }, [
1350
- createElementVNode("table", _hoisted_4$60, [createElementVNode("thead", { class: normalizeClass(["mint-dataframe__thead", { "mint-dataframe__thead--sticky": __props.stickyHeader }]) }, [createElementVNode("tr", null, [
1351
- __props.selectable ? (openBlock(), createElementBlock("th", _hoisted_5$57, [createElementVNode("input", {
1350
+ createElementVNode("table", _hoisted_4$61, [createElementVNode("thead", { class: normalizeClass(["mint-dataframe__thead", { "mint-dataframe__thead--sticky": __props.stickyHeader }]) }, [createElementVNode("tr", null, [
1351
+ __props.selectable ? (openBlock(), createElementBlock("th", _hoisted_5$58, [createElementVNode("input", {
1352
1352
  type: "checkbox",
1353
1353
  checked: allSelected.value,
1354
1354
  indeterminate: selectIndeterminate.value,
1355
1355
  class: "mint-dataframe__checkbox",
1356
1356
  onChange: toggleSelectAll
1357
- }, null, 40, _hoisted_6$53)])) : createCommentVNode("", true),
1357
+ }, null, 40, _hoisted_6$54)])) : createCommentVNode("", true),
1358
1358
  (openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (col) => {
1359
1359
  return openBlock(), createElementBlock("th", {
1360
1360
  key: col.key,
@@ -1376,7 +1376,7 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1376
1376
  onClick: ($event) => isColumnSortable(col) ? handleSort(col) : void 0,
1377
1377
  onKeydown: ($event) => isColumnSortable(col) ? handleSortKeydown($event, col) : void 0
1378
1378
  }, {
1379
- default: withCtx(() => [renderSlot(_ctx.$slots, `header-${col.key}`, { column: col }, () => [createElementVNode("div", _hoisted_8$42, [createElementVNode("span", null, toDisplayString(col.label), 1), isColumnSortable(col) ? (openBlock(), createElementBlock("svg", {
1379
+ default: withCtx(() => [renderSlot(_ctx.$slots, `header-${col.key}`, { column: col }, () => [createElementVNode("div", _hoisted_8$43, [createElementVNode("span", null, toDisplayString(col.label), 1), isColumnSortable(col) ? (openBlock(), createElementBlock("svg", {
1380
1380
  key: 0,
1381
1381
  class: normalizeClass(["mint-dataframe__sort-icon", {
1382
1382
  "mint-dataframe__sort-icon--asc": activeSort.value?.key === col.key && activeSort.value?.direction === "asc",
@@ -1411,7 +1411,7 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1411
1411
  onMousedown: ($event) => startResize(col, $event),
1412
1412
  onKeydown: ($event) => handleResizeKeydown($event, col),
1413
1413
  onClick: _cache[1] || (_cache[1] = withModifiers(() => {}, ["stop"]))
1414
- }, null, 40, _hoisted_9$40)) : createCommentVNode("", true)], 14, _hoisted_7$47);
1414
+ }, null, 40, _hoisted_9$41)) : createCommentVNode("", true)], 14, _hoisted_7$48);
1415
1415
  }), 128)),
1416
1416
  __props.deletable ? (openBlock(), createElementBlock("th", {
1417
1417
  key: 1,
@@ -1435,13 +1435,13 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1435
1435
  onClick: ($event) => handleRowClick(row, rowIndex),
1436
1436
  onKeydown: ($event) => handleRowKeydown($event, row, rowIndex)
1437
1437
  }, [
1438
- __props.selectable ? (openBlock(), createElementBlock("td", _hoisted_11$34, [createElementVNode("input", {
1438
+ __props.selectable ? (openBlock(), createElementBlock("td", _hoisted_11$35, [createElementVNode("input", {
1439
1439
  type: "checkbox",
1440
1440
  checked: unref(rowSelection).isSelected(getRowKey(row, rowIndex)),
1441
1441
  class: "mint-dataframe__checkbox",
1442
1442
  onClick: _cache[2] || (_cache[2] = withModifiers(() => {}, ["stop"])),
1443
1443
  onChange: ($event) => toggleRowSelect(getRowKey(row, rowIndex))
1444
- }, null, 40, _hoisted_12$30)])) : createCommentVNode("", true),
1444
+ }, null, 40, _hoisted_12$31)])) : createCommentVNode("", true),
1445
1445
  (openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (col) => {
1446
1446
  return openBlock(), createElementBlock("td", {
1447
1447
  key: col.key,
@@ -1457,7 +1457,7 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1457
1457
  row,
1458
1458
  column: col,
1459
1459
  index: rowIndex
1460
- }, () => [createTextVNode(toDisplayString(formatCell(col, row, rowIndex)), 1)])], 10, _hoisted_13$30);
1460
+ }, () => [createTextVNode(toDisplayString(formatCell(col, row, rowIndex)), 1)])], 10, _hoisted_13$31);
1461
1461
  }), 128)),
1462
1462
  __props.deletable ? (openBlock(), createElementBlock("td", {
1463
1463
  key: 1,
@@ -1472,10 +1472,10 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1472
1472
  "aria-label": __props.deleteLabel,
1473
1473
  title: __props.deleteLabel,
1474
1474
  onClick: withModifiers(($event) => handleDeleteRow(row, rowIndex), ["stop"])
1475
- }, [..._cache[7] || (_cache[7] = [createStaticVNode("<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 6h18\"></path><path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"></path><path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\"></path><path d=\"M10 11v6\"></path><path d=\"M14 11v6\"></path></svg>", 1)])], 8, _hoisted_14$28)], 2)) : createCommentVNode("", true)
1476
- ], 42, _hoisted_10$36);
1475
+ }, [..._cache[7] || (_cache[7] = [createStaticVNode("<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 6h18\"></path><path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"></path><path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\"></path><path d=\"M10 11v6\"></path><path d=\"M14 11v6\"></path></svg>", 1)])], 8, _hoisted_14$29)], 2)) : createCommentVNode("", true)
1476
+ ], 42, _hoisted_10$37);
1477
1477
  }), 128))])]),
1478
- __props.error ? (openBlock(), createElementBlock("div", _hoisted_15$28, [renderSlot(_ctx.$slots, "error", { error: __props.error }, () => [createVNode(DataStateInternal_default, {
1478
+ __props.error ? (openBlock(), createElementBlock("div", _hoisted_15$29, [renderSlot(_ctx.$slots, "error", { error: __props.error }, () => [createVNode(DataStateInternal_default, {
1479
1479
  state: "error",
1480
1480
  title: __props.error
1481
1481
  }, null, 8, ["title"])])])) : paginatedData.value.length === 0 && !__props.loading ? (openBlock(), createElementBlock("div", _hoisted_16$25, [renderSlot(_ctx.$slots, "empty", {}, () => [createVNode(DataStateInternal_default, {
@@ -1485,7 +1485,7 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1485
1485
  }, null, 8, ["title"])])])) : createCommentVNode("", true),
1486
1486
  __props.loading ? (openBlock(), createElementBlock("div", _hoisted_17$23, [renderSlot(_ctx.$slots, "loading", {}, () => [createVNode(LoadingSpinner_default, { size: "lg" })])])) : createCommentVNode("", true)
1487
1487
  ], 4),
1488
- __props.pagination ? (openBlock(), createElementBlock("div", _hoisted_18$20, [renderSlot(_ctx.$slots, "footer", {}, () => [createElementVNode("span", _hoisted_19$17, toDisplayString((__props.pagination.page - 1) * __props.pagination.pageSize + 1) + "–" + toDisplayString(Math.min(__props.pagination.page * __props.pagination.pageSize, unref(sortedData).length)) + " of " + toDisplayString(unref(sortedData).length), 1), createElementVNode("div", _hoisted_20$16, [
1488
+ __props.pagination ? (openBlock(), createElementBlock("div", _hoisted_18$21, [renderSlot(_ctx.$slots, "footer", {}, () => [createElementVNode("span", _hoisted_19$18, toDisplayString((__props.pagination.page - 1) * __props.pagination.pageSize + 1) + "–" + toDisplayString(Math.min(__props.pagination.page * __props.pagination.pageSize, unref(sortedData).length)) + " of " + toDisplayString(unref(sortedData).length), 1), createElementVNode("div", _hoisted_20$17, [
1489
1489
  createElementVNode("button", {
1490
1490
  type: "button",
1491
1491
  class: "mint-dataframe__page-btn",
@@ -1498,8 +1498,8 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1498
1498
  "stroke-width": "2",
1499
1499
  "stroke-linecap": "round",
1500
1500
  "stroke-linejoin": "round"
1501
- }, [createElementVNode("path", { d: "m15 18-6-6 6-6" })], -1)])], 8, _hoisted_21$15),
1502
- createElementVNode("span", _hoisted_22$14, toDisplayString(__props.pagination.page) + " / " + toDisplayString(totalPages.value), 1),
1501
+ }, [createElementVNode("path", { d: "m15 18-6-6 6-6" })], -1)])], 8, _hoisted_21$16),
1502
+ createElementVNode("span", _hoisted_22$15, toDisplayString(__props.pagination.page) + " / " + toDisplayString(totalPages.value), 1),
1503
1503
  createElementVNode("button", {
1504
1504
  type: "button",
1505
1505
  class: "mint-dataframe__page-btn",
@@ -1512,7 +1512,7 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1512
1512
  "stroke-width": "2",
1513
1513
  "stroke-linecap": "round",
1514
1514
  "stroke-linejoin": "round"
1515
- }, [createElementVNode("path", { d: "m9 18 6-6-6-6" })], -1)])], 8, _hoisted_23$13)
1515
+ }, [createElementVNode("path", { d: "m9 18 6-6-6-6" })], -1)])], 8, _hoisted_23$14)
1516
1516
  ])])])) : createCommentVNode("", true)
1517
1517
  ], 2);
1518
1518
  };
@@ -1521,56 +1521,110 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1521
1521
  //#endregion
1522
1522
  //#region src/components/AppToastContainer.vue?vue&type=script&setup=true&lang.ts
1523
1523
  var _hoisted_1$78 = { class: "mint-toast__container" };
1524
- var _hoisted_2$69 = ["onClick"];
1525
- var _hoisted_3$63 = { class: "mint-toast__message" };
1524
+ var _hoisted_2$69 = ["role", "onClick"];
1525
+ var _hoisted_3$63 = {
1526
+ key: 0,
1527
+ class: "mint-toast__icon",
1528
+ viewBox: "0 0 24 24",
1529
+ fill: "none",
1530
+ stroke: "currentColor",
1531
+ "stroke-width": "2",
1532
+ "stroke-linecap": "round",
1533
+ "stroke-linejoin": "round",
1534
+ "aria-hidden": "true"
1535
+ };
1536
+ var _hoisted_4$60 = {
1537
+ key: 1,
1538
+ class: "mint-toast__icon",
1539
+ viewBox: "0 0 24 24",
1540
+ fill: "none",
1541
+ stroke: "currentColor",
1542
+ "stroke-width": "2",
1543
+ "stroke-linecap": "round",
1544
+ "stroke-linejoin": "round",
1545
+ "aria-hidden": "true"
1546
+ };
1547
+ var _hoisted_5$57 = {
1548
+ key: 2,
1549
+ class: "mint-toast__icon",
1550
+ viewBox: "0 0 24 24",
1551
+ fill: "none",
1552
+ stroke: "currentColor",
1553
+ "stroke-width": "2",
1554
+ "stroke-linecap": "round",
1555
+ "stroke-linejoin": "round",
1556
+ "aria-hidden": "true"
1557
+ };
1558
+ var _hoisted_6$53 = {
1559
+ key: 3,
1560
+ class: "mint-toast__icon",
1561
+ viewBox: "0 0 24 24",
1562
+ fill: "none",
1563
+ stroke: "currentColor",
1564
+ "stroke-width": "2",
1565
+ "stroke-linecap": "round",
1566
+ "stroke-linejoin": "round",
1567
+ "aria-hidden": "true"
1568
+ };
1569
+ var _hoisted_7$47 = { class: "mint-toast__body" };
1570
+ var _hoisted_8$42 = { class: "mint-toast__title" };
1571
+ var _hoisted_9$40 = { class: "mint-toast__message" };
1572
+ var _hoisted_10$36 = {
1573
+ key: 0,
1574
+ class: "mint-toast__count"
1575
+ };
1576
+ var _hoisted_11$34 = {
1577
+ key: 0,
1578
+ class: "mint-toast__detail"
1579
+ };
1580
+ var _hoisted_12$30 = {
1581
+ key: 1,
1582
+ class: "mint-toast__actions"
1583
+ };
1584
+ var _hoisted_13$30 = ["onClick"];
1585
+ var _hoisted_14$28 = ["onClick"];
1586
+ var _hoisted_15$28 = {
1587
+ key: 6,
1588
+ class: "mint-toast__progress mint-toast__progress--indeterminate"
1589
+ };
1526
1590
  //#endregion
1527
1591
  //#region src/components/AppToastContainer.vue
1528
1592
  var AppToastContainer_default = /* @__PURE__ */ defineComponent({
1529
1593
  __name: "AppToastContainer",
1530
1594
  setup(__props) {
1531
- /** Preferred toast container driven by useToast, with auto-dismiss progress bar and click-to-close on each notification. */
1595
+ /** Preferred toast container driven by useToast: title/detail, up to two actions, TTL or indeterminate bar, click-to-close. */
1532
1596
  const { toasts, dismiss } = useToast();
1533
- const accentColors = {
1534
- success: "var(--mint-success)",
1535
- error: "var(--mint-error)",
1536
- warning: "var(--mint-warning)",
1537
- info: "var(--mint-info)"
1538
- };
1597
+ function title(toast) {
1598
+ return toast.title ?? toast.message;
1599
+ }
1600
+ function actions(toast) {
1601
+ return (toast.actions ?? []).slice(0, 2);
1602
+ }
1603
+ function progress(toast) {
1604
+ return toast.progress ?? "ttl";
1605
+ }
1606
+ function runAction(toast, action) {
1607
+ action.onClick();
1608
+ dismiss(toast.id);
1609
+ }
1539
1610
  return (_ctx, _cache) => {
1540
1611
  return openBlock(), createBlock(Teleport, { to: "body" }, [createElementVNode("div", _hoisted_1$78, [createVNode(TransitionGroup, { name: "toast" }, {
1541
1612
  default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(toasts), (toast) => {
1542
1613
  return openBlock(), createElementBlock("div", {
1543
1614
  key: toast.id,
1544
- class: normalizeClass(["mint-toast__item", `mint-toast__item--${toast.type}`]),
1545
- style: normalizeStyle({ borderLeftColor: accentColors[toast.type] }),
1546
- role: "alert",
1615
+ class: normalizeClass([
1616
+ "mint-toast__item",
1617
+ `mint-toast__item--${toast.type}`,
1618
+ (toast.count ?? 1) > 1 ? "mint-toast__item--stacked" : ""
1619
+ ]),
1620
+ role: toast.type === "error" || toast.type === "warning" ? "alert" : "status",
1547
1621
  onClick: ($event) => unref(dismiss)(toast.id)
1548
1622
  }, [
1549
- toast.type === "success" ? (openBlock(), createElementBlock("svg", {
1550
- key: 0,
1551
- class: "mint-toast__icon",
1552
- viewBox: "0 0 24 24",
1553
- fill: "none",
1554
- stroke: "currentColor",
1555
- "stroke-width": "2",
1556
- "stroke-linecap": "round",
1557
- "stroke-linejoin": "round",
1558
- style: normalizeStyle({ color: accentColors[toast.type] })
1559
- }, [..._cache[0] || (_cache[0] = [createElementVNode("circle", {
1623
+ toast.type === "success" ? (openBlock(), createElementBlock("svg", _hoisted_3$63, [..._cache[0] || (_cache[0] = [createElementVNode("circle", {
1560
1624
  cx: "12",
1561
1625
  cy: "12",
1562
1626
  r: "10"
1563
- }, null, -1), createElementVNode("path", { d: "m9 12 2 2 4-4" }, null, -1)])], 4)) : toast.type === "error" ? (openBlock(), createElementBlock("svg", {
1564
- key: 1,
1565
- class: "mint-toast__icon",
1566
- viewBox: "0 0 24 24",
1567
- fill: "none",
1568
- stroke: "currentColor",
1569
- "stroke-width": "2",
1570
- "stroke-linecap": "round",
1571
- "stroke-linejoin": "round",
1572
- style: normalizeStyle({ color: accentColors[toast.type] })
1573
- }, [..._cache[1] || (_cache[1] = [
1627
+ }, null, -1), createElementVNode("path", { d: "m9 12 2 2 4-4" }, null, -1)])])) : toast.type === "error" ? (openBlock(), createElementBlock("svg", _hoisted_4$60, [..._cache[1] || (_cache[1] = [
1574
1628
  createElementVNode("circle", {
1575
1629
  cx: "12",
1576
1630
  cy: "12",
@@ -1578,31 +1632,11 @@ var AppToastContainer_default = /* @__PURE__ */ defineComponent({
1578
1632
  }, null, -1),
1579
1633
  createElementVNode("path", { d: "m15 9-6 6" }, null, -1),
1580
1634
  createElementVNode("path", { d: "m9 9 6 6" }, null, -1)
1581
- ])], 4)) : toast.type === "warning" ? (openBlock(), createElementBlock("svg", {
1582
- key: 2,
1583
- class: "mint-toast__icon",
1584
- viewBox: "0 0 24 24",
1585
- fill: "none",
1586
- stroke: "currentColor",
1587
- "stroke-width": "2",
1588
- "stroke-linecap": "round",
1589
- "stroke-linejoin": "round",
1590
- style: normalizeStyle({ color: accentColors[toast.type] })
1591
- }, [..._cache[2] || (_cache[2] = [
1635
+ ])])) : toast.type === "warning" ? (openBlock(), createElementBlock("svg", _hoisted_5$57, [..._cache[2] || (_cache[2] = [
1592
1636
  createElementVNode("path", { d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3" }, null, -1),
1593
1637
  createElementVNode("path", { d: "M12 9v4" }, null, -1),
1594
1638
  createElementVNode("path", { d: "M12 17h.01" }, null, -1)
1595
- ])], 4)) : (openBlock(), createElementBlock("svg", {
1596
- key: 3,
1597
- class: "mint-toast__icon",
1598
- viewBox: "0 0 24 24",
1599
- fill: "none",
1600
- stroke: "currentColor",
1601
- "stroke-width": "2",
1602
- "stroke-linecap": "round",
1603
- "stroke-linejoin": "round",
1604
- style: normalizeStyle({ color: accentColors[toast.type] })
1605
- }, [..._cache[3] || (_cache[3] = [
1639
+ ])])) : (openBlock(), createElementBlock("svg", _hoisted_6$53, [..._cache[3] || (_cache[3] = [
1606
1640
  createElementVNode("circle", {
1607
1641
  cx: "12",
1608
1642
  cy: "12",
@@ -1610,16 +1644,39 @@ var AppToastContainer_default = /* @__PURE__ */ defineComponent({
1610
1644
  }, null, -1),
1611
1645
  createElementVNode("path", { d: "M12 16v-4" }, null, -1),
1612
1646
  createElementVNode("path", { d: "M12 8h.01" }, null, -1)
1613
- ])], 4)),
1614
- createElementVNode("span", _hoisted_3$63, toDisplayString(toast.message), 1),
1615
- createElementVNode("span", {
1647
+ ])])),
1648
+ createElementVNode("div", _hoisted_7$47, [
1649
+ createElementVNode("div", _hoisted_8$42, [createElementVNode("span", _hoisted_9$40, toDisplayString(title(toast)), 1), (toast.count ?? 1) > 1 ? (openBlock(), createElementBlock("span", _hoisted_10$36, "×" + toDisplayString(toast.count), 1)) : createCommentVNode("", true)]),
1650
+ toast.detail ? (openBlock(), createElementBlock("div", _hoisted_11$34, toDisplayString(toast.detail), 1)) : createCommentVNode("", true),
1651
+ actions(toast).length ? (openBlock(), createElementBlock("div", _hoisted_12$30, [(openBlock(true), createElementBlock(Fragment, null, renderList(actions(toast), (action) => {
1652
+ return openBlock(), createElementBlock("button", {
1653
+ key: action.label,
1654
+ type: "button",
1655
+ class: normalizeClass(["mint-toast__action", action.primary ? "mint-toast__action--primary" : ""]),
1656
+ onClick: withModifiers(($event) => runAction(toast, action), ["stop"])
1657
+ }, toDisplayString(action.label), 11, _hoisted_13$30);
1658
+ }), 128))])) : createCommentVNode("", true)
1659
+ ]),
1660
+ toast.dismissible !== false ? (openBlock(), createElementBlock("button", {
1661
+ key: 4,
1662
+ type: "button",
1663
+ class: "mint-toast__close",
1664
+ "aria-label": "Dismiss",
1665
+ onClick: withModifiers(($event) => unref(dismiss)(toast.id), ["stop"])
1666
+ }, [..._cache[4] || (_cache[4] = [createElementVNode("svg", {
1667
+ viewBox: "0 0 24 24",
1668
+ fill: "none",
1669
+ stroke: "currentColor",
1670
+ "stroke-width": "2.2",
1671
+ "stroke-linecap": "round",
1672
+ "aria-hidden": "true"
1673
+ }, [createElementVNode("path", { d: "M18 6 6 18" }), createElementVNode("path", { d: "m6 6 12 12" })], -1)])], 8, _hoisted_14$28)) : createCommentVNode("", true),
1674
+ progress(toast) === "ttl" ? (openBlock(), createElementBlock("span", {
1675
+ key: 5,
1616
1676
  class: "mint-toast__progress",
1617
- style: normalizeStyle({
1618
- backgroundColor: accentColors[toast.type],
1619
- animationDuration: `${toast.duration ?? 3500}ms`
1620
- })
1621
- }, null, 4)
1622
- ], 14, _hoisted_2$69);
1677
+ style: normalizeStyle({ animationDuration: `${toast.duration ?? 3500}ms` })
1678
+ }, null, 4)) : progress(toast) === "indeterminate" ? (openBlock(), createElementBlock("span", _hoisted_15$28)) : createCommentVNode("", true)
1679
+ ], 10, _hoisted_2$69);
1623
1680
  }), 128))]),
1624
1681
  _: 1
1625
1682
  })])]);
@@ -1980,7 +2037,7 @@ var _hoisted_16$24 = [
1980
2037
  "aria-expanded"
1981
2038
  ];
1982
2039
  var _hoisted_17$22 = { class: "mint-collapsible-card__body" };
1983
- var _hoisted_18$19 = { class: "mint-collapsible-card__content" };
2040
+ var _hoisted_18$20 = { class: "mint-collapsible-card__content" };
1984
2041
  //#endregion
1985
2042
  //#region src/components/CollapsibleCard.vue
1986
2043
  var CollapsibleCard_default = /* @__PURE__ */ defineComponent({
@@ -2147,7 +2204,7 @@ var CollapsibleCard_default = /* @__PURE__ */ defineComponent({
2147
2204
  "aria-hidden": "true"
2148
2205
  }, [..._cache[0] || (_cache[0] = [createElementVNode("path", { d: "m6 9 6 6 6-6" }, null, -1)])], 2))], 8, _hoisted_16$24)
2149
2206
  ])]), createVNode(Transition, { name: "collapse" }, {
2150
- default: withCtx(() => [withDirectives(createElementVNode("div", _hoisted_17$22, [createElementVNode("div", _hoisted_18$19, [renderSlot(_ctx.$slots, "default")])], 512), [[vShow, isOpen.value]])]),
2207
+ default: withCtx(() => [withDirectives(createElementVNode("div", _hoisted_17$22, [createElementVNode("div", _hoisted_18$20, [renderSlot(_ctx.$slots, "default")])], 512), [[vShow, isOpen.value]])]),
2151
2208
  _: 3
2152
2209
  })], 2);
2153
2210
  };
@@ -3239,7 +3296,7 @@ var _hoisted_17$21 = {
3239
3296
  key: 2,
3240
3297
  class: "mint-topbar__standalone-badge"
3241
3298
  };
3242
- var _hoisted_18$18 = {
3299
+ var _hoisted_18$19 = {
3243
3300
  key: 0,
3244
3301
  class: "mint-topbar__icon-btn-dot",
3245
3302
  "aria-hidden": "true"
@@ -3309,9 +3366,9 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
3309
3366
  setup(__props, { emit: __emit }) {
3310
3367
  /** Full application top bar with brand logo, page selector or plugin switcher, centered pill nav, experiment popover, and avatar menu. */
3311
3368
  const props = __props;
3312
- const SettingsModal = defineAsyncComponent(() => import("./SettingsModal-BYR20I4c.js").then((n) => n.n));
3369
+ const SettingsModal = defineAsyncComponent(() => import("./SettingsModal-DOcCf0Vo.js").then((n) => n.n));
3313
3370
  const ExperimentPopover = defineAsyncComponent(() => import("./ExperimentPopover-CJdNlCZb.js").then((n) => n.n));
3314
- const ExperimentSelectorModal = defineAsyncComponent(() => import("./ExperimentSelectorModal-DCXmwKNS.js").then((n) => n.n));
3371
+ const ExperimentSelectorModal = defineAsyncComponent(() => import("./ExperimentSelectorModal-DHE9k8TP.js").then((n) => n.n));
3315
3372
  const emit = __emit;
3316
3373
  const settingsOpen = ref(false);
3317
3374
  const { isIntegrated, plugin } = usePlatformContext();
@@ -3461,7 +3518,7 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
3461
3518
  "stroke-width": "2",
3462
3519
  "stroke-linecap": "round",
3463
3520
  "stroke-linejoin": "round"
3464
- }, [createElementVNode("path", { d: "M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9" }), createElementVNode("path", { d: "M10.3 21a1.94 1.94 0 0 0 3.4 0" })], -1)), __props.hasNotificationDot ? (openBlock(), createElementBlock("span", _hoisted_18$18)) : createCommentVNode("", true)])) : createCommentVNode("", true),
3521
+ }, [createElementVNode("path", { d: "M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9" }), createElementVNode("path", { d: "M10.3 21a1.94 1.94 0 0 0 3.4 0" })], -1)), __props.hasNotificationDot ? (openBlock(), createElementBlock("span", _hoisted_18$19)) : createCommentVNode("", true)])) : createCommentVNode("", true),
3465
3522
  __props.showThemeToggle ? (openBlock(), createBlock(ThemeToggle_default, {
3466
3523
  key: 4,
3467
3524
  size: "sm"
@@ -4212,16 +4269,73 @@ var _hoisted_6$44 = {
4212
4269
  };
4213
4270
  var _hoisted_7$38 = ["aria-label", "aria-expanded"];
4214
4271
  var _hoisted_8$34 = ["id"];
4215
- var _hoisted_9$32 = {
4272
+ var _hoisted_9$32 = { class: "mint-sidebar__group-head" };
4273
+ var _hoisted_10$30 = ["aria-expanded", "onClick"];
4274
+ var _hoisted_11$28 = {
4275
+ key: 0,
4276
+ class: "mint-sidebar__group-svg",
4277
+ viewBox: "0 0 24 24",
4278
+ fill: "none",
4279
+ stroke: "currentColor",
4280
+ "stroke-width": "2",
4281
+ "stroke-linecap": "round",
4282
+ "stroke-linejoin": "round",
4283
+ "aria-hidden": "true"
4284
+ };
4285
+ var _hoisted_12$27 = ["d"];
4286
+ var _hoisted_13$27 = ["d"];
4287
+ var _hoisted_14$25 = {
4288
+ key: 1,
4289
+ class: "mint-sidebar__group-text-icon"
4290
+ };
4291
+ var _hoisted_15$25 = { class: "mint-sidebar__group-copy" };
4292
+ var _hoisted_16$22 = { class: "mint-sidebar__group-label" };
4293
+ var _hoisted_17$20 = {
4294
+ key: 0,
4295
+ class: "mint-sidebar__group-subtitle"
4296
+ };
4297
+ var _hoisted_18$18 = { class: "mint-sidebar__group-tail" };
4298
+ var _hoisted_19$17 = [
4299
+ "disabled",
4300
+ "aria-label",
4301
+ "title",
4302
+ "onClick"
4303
+ ];
4304
+ var _hoisted_20$16 = {
4305
+ key: 0,
4306
+ class: "mint-sidebar__group-action-icon",
4307
+ viewBox: "0 0 24 24",
4308
+ fill: "none",
4309
+ stroke: "currentColor",
4310
+ "stroke-width": "2",
4311
+ "stroke-linecap": "round",
4312
+ "stroke-linejoin": "round",
4313
+ "aria-hidden": "true"
4314
+ };
4315
+ var _hoisted_21$15 = ["d"];
4316
+ var _hoisted_22$14 = ["d"];
4317
+ var _hoisted_23$13 = { key: 1 };
4318
+ var _hoisted_24$13 = [
4319
+ "aria-checked",
4320
+ "aria-label",
4321
+ "onClick"
4322
+ ];
4323
+ var _hoisted_25$11 = [
4324
+ "aria-label",
4325
+ "aria-expanded",
4326
+ "onClick"
4327
+ ];
4328
+ var _hoisted_26$10 = { class: "mint-sidebar__group-body" };
4329
+ var _hoisted_27$10 = {
4216
4330
  key: 2,
4217
4331
  class: "mint-sidebar__collapsed"
4218
4332
  };
4219
- var _hoisted_10$30 = {
4333
+ var _hoisted_28$9 = {
4220
4334
  key: 3,
4221
4335
  class: "mint-sidebar__collapsed mint-sidebar__collapsed--default"
4222
4336
  };
4223
- var _hoisted_11$28 = ["aria-label", "title"];
4224
- var _hoisted_12$27 = {
4337
+ var _hoisted_29$7 = ["aria-label", "title"];
4338
+ var _hoisted_30$6 = {
4225
4339
  key: 0,
4226
4340
  class: "mint-sidebar__rail-svg",
4227
4341
  viewBox: "0 0 24 24",
@@ -4232,17 +4346,17 @@ var _hoisted_12$27 = {
4232
4346
  "stroke-linejoin": "round",
4233
4347
  "aria-hidden": "true"
4234
4348
  };
4235
- var _hoisted_13$27 = ["d"];
4236
- var _hoisted_14$25 = ["d"];
4237
- var _hoisted_15$25 = {
4349
+ var _hoisted_31$6 = ["d"];
4350
+ var _hoisted_32$6 = ["d"];
4351
+ var _hoisted_33$6 = {
4238
4352
  key: 1,
4239
4353
  class: "mint-sidebar__rail-text-icon"
4240
4354
  };
4241
- var _hoisted_16$22 = {
4355
+ var _hoisted_34$6 = {
4242
4356
  key: 4,
4243
4357
  class: "mint-sidebar__footer"
4244
4358
  };
4245
- var _hoisted_17$20 = {
4359
+ var _hoisted_35$5 = {
4246
4360
  key: 5,
4247
4361
  class: "mint-sidebar__footer mint-sidebar__footer--collapsed"
4248
4362
  };
@@ -4254,18 +4368,18 @@ var AppSidebar_default = /* @__PURE__ */ defineComponent({
4254
4368
  title: { default: void 0 },
4255
4369
  subtitle: { default: void 0 },
4256
4370
  badge: { default: void 0 },
4257
- variant: { default: "default" },
4258
4371
  panels: { default: () => ({}) },
4259
4372
  activeView: { default: "" },
4260
4373
  floating: {
4261
4374
  type: Boolean,
4262
- default: void 0
4375
+ default: true
4263
4376
  },
4377
+ density: { default: void 0 },
4264
4378
  dense: {
4265
4379
  type: Boolean,
4266
- default: false
4380
+ default: void 0
4267
4381
  },
4268
- width: { default: void 0 },
4382
+ width: { default: "280px" },
4269
4383
  side: { default: "left" },
4270
4384
  toggleState: { default: () => ({}) },
4271
4385
  forms: { default: () => ({}) },
@@ -4302,7 +4416,7 @@ var AppSidebar_default = /* @__PURE__ */ defineComponent({
4302
4416
  formSize: { default: "sm" },
4303
4417
  collapsible: {
4304
4418
  type: Boolean,
4305
- default: void 0
4419
+ default: false
4306
4420
  },
4307
4421
  collapsed: {
4308
4422
  type: Boolean,
@@ -4330,8 +4444,9 @@ var AppSidebar_default = /* @__PURE__ */ defineComponent({
4330
4444
  * AppSidebar - Context-sensitive toolkit panel
4331
4445
  *
4332
4446
  * Shows tool sections relevant to the active view. Sections are defined via
4333
- * the `panels` config and rendered as CollapsibleCards. Controls can be
4334
- * provided through named slots or auto-rendered from FormBuilder schemas.
4447
+ * the `panels` config and rendered as flat groups (header row + hairline,
4448
+ * no nested card). Controls can be provided through named slots or
4449
+ * auto-rendered from FormBuilder schemas.
4335
4450
  *
4336
4451
  * When activeView is omitted, the first non-empty panel view is selected.
4337
4452
  * When no view has matching panels, the sidebar hides entirely.
@@ -4352,10 +4467,14 @@ var AppSidebar_default = /* @__PURE__ */ defineComponent({
4352
4467
  emit("update:collapsed", value);
4353
4468
  }
4354
4469
  });
4355
- const isAnalysisVariant = computed(() => props.variant === "analysis");
4356
- const resolvedFloating = computed(() => props.floating ?? !isAnalysisVariant.value);
4357
- const resolvedWidth = computed(() => props.width ?? (isAnalysisVariant.value ? "20rem" : "280px"));
4358
- const resolvedCollapsible = computed(() => props.collapsible ?? isAnalysisVariant.value);
4470
+ const resolvedDensity = computed(() => props.density ?? (props.dense === false ? "comfortable" : "compact"));
4471
+ const openState = ref({});
4472
+ function isSectionOpen(section) {
4473
+ return openState.value[section.id] ?? section.defaultOpen !== false;
4474
+ }
4475
+ function toggleSection(section) {
4476
+ openState.value[section.id] = !isSectionOpen(section);
4477
+ }
4359
4478
  const resolvedModel = computed(() => {
4360
4479
  return resolveControlModel(props.model);
4361
4480
  });
@@ -4398,14 +4517,13 @@ var AppSidebar_default = /* @__PURE__ */ defineComponent({
4398
4517
  const sidebarClasses = computed(() => [
4399
4518
  "mint-sidebar",
4400
4519
  `mint-sidebar--${props.side}`,
4401
- `mint-sidebar--${props.variant}`,
4402
- resolvedFloating.value ? "mint-sidebar--floating" : "mint-sidebar--static",
4403
- props.dense ? "mint-sidebar--dense" : "",
4404
- resolvedCollapsible.value ? "mint-sidebar--collapsible" : "",
4520
+ props.floating ? "mint-sidebar--floating" : "mint-sidebar--static",
4521
+ resolvedDensity.value === "comfortable" ? "mint-sidebar--comfortable" : "",
4522
+ props.collapsible ? "mint-sidebar--collapsible" : "",
4405
4523
  collapsedModel.value ? "mint-sidebar--collapsed" : "",
4406
4524
  !isVisible.value ? "mint-sidebar--hidden" : ""
4407
4525
  ]);
4408
- const sidebarStyle = computed(() => ({ width: collapsedModel.value ? props.collapsedWidth : resolvedWidth.value }));
4526
+ const sidebarStyle = computed(() => ({ width: collapsedModel.value ? props.collapsedWidth : props.width }));
4409
4527
  function handleFormUpdate(values) {
4410
4528
  const nextValues = {
4411
4529
  ...resolvedValues.value,
@@ -4445,6 +4563,12 @@ var AppSidebar_default = /* @__PURE__ */ defineComponent({
4445
4563
  function badgeToneClass(section) {
4446
4564
  return `mint-sidebar__rail-badge--${section.badgeTone ?? "cta"}`;
4447
4565
  }
4566
+ function tagToneClass(section) {
4567
+ return `mint-sidebar__tag--${section.badgeTone ?? "cta"}`;
4568
+ }
4569
+ function actionClasses(action) {
4570
+ return ["mint-sidebar__group-action", action.tone ? `mint-sidebar__group-action--${action.tone}` : ""];
4571
+ }
4448
4572
  function mergeSidebarPanels(generated, explicit) {
4449
4573
  const merged = {};
4450
4574
  const viewIds = new Set([...Object.keys(generated), ...Object.keys(explicit)]);
@@ -4465,10 +4589,10 @@ var AppSidebar_default = /* @__PURE__ */ defineComponent({
4465
4589
  class: normalizeClass(sidebarClasses.value),
4466
4590
  style: normalizeStyle(sidebarStyle.value)
4467
4591
  }, [
4468
- _ctx.$slots.header || __props.title || __props.subtitle || __props.badge !== void 0 || resolvedCollapsible.value ? (openBlock(), createElementBlock("div", _hoisted_1$61, [renderSlot(_ctx.$slots, "header", {
4592
+ _ctx.$slots.header || __props.title || __props.subtitle || __props.badge !== void 0 || __props.collapsible ? (openBlock(), createElementBlock("div", _hoisted_1$61, [renderSlot(_ctx.$slots, "header", {
4469
4593
  collapsed: collapsedModel.value,
4470
4594
  toggleCollapsed
4471
- }, () => [!collapsedModel.value ? (openBlock(), createElementBlock("div", _hoisted_2$56, [createElementVNode("div", _hoisted_3$52, [__props.title ? (openBlock(), createElementBlock("h2", _hoisted_4$50, toDisplayString(__props.title), 1)) : createCommentVNode("", true), __props.subtitle ? (openBlock(), createElementBlock("p", _hoisted_5$47, toDisplayString(__props.subtitle), 1)) : createCommentVNode("", true)]), __props.badge !== void 0 ? (openBlock(), createElementBlock("span", _hoisted_6$44, toDisplayString(__props.badge), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true), resolvedCollapsible.value ? (openBlock(), createElementBlock("button", {
4595
+ }, () => [!collapsedModel.value ? (openBlock(), createElementBlock("div", _hoisted_2$56, [createElementVNode("div", _hoisted_3$52, [__props.title ? (openBlock(), createElementBlock("h2", _hoisted_4$50, toDisplayString(__props.title), 1)) : createCommentVNode("", true), __props.subtitle ? (openBlock(), createElementBlock("p", _hoisted_5$47, toDisplayString(__props.subtitle), 1)) : createCommentVNode("", true)]), __props.badge !== void 0 ? (openBlock(), createElementBlock("span", _hoisted_6$44, toDisplayString(__props.badge), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true), __props.collapsible ? (openBlock(), createElementBlock("button", {
4472
4596
  key: 1,
4473
4597
  type: "button",
4474
4598
  class: "mint-sidebar__collapse-button",
@@ -4490,24 +4614,78 @@ var AppSidebar_default = /* @__PURE__ */ defineComponent({
4490
4614
  id: __props.contentId,
4491
4615
  class: "mint-sidebar__sections"
4492
4616
  }, [(openBlock(true), createElementBlock(Fragment, null, renderList(activeSections.value, (section) => {
4493
- return openBlock(), createBlock(CollapsibleCard_default, {
4617
+ return openBlock(), createElementBlock("div", {
4494
4618
  key: section.id,
4495
- title: section.label,
4496
- subtitle: section.subtitle,
4497
- icon: section.icon,
4498
- "icon-color": section.iconColor,
4499
- "icon-bg": section.iconBg,
4500
- badge: section.badge,
4501
- "badge-tone": section.badgeTone,
4502
- actions: section.actions,
4503
- dense: __props.dense,
4504
- "default-open": section.defaultOpen !== false,
4505
- "show-toggle": section.showToggle,
4506
- "toggle-value": __props.toggleState[section.id] ?? false,
4507
- onAction: ($event) => handleSectionAction(section.id, $event),
4508
- "onUpdate:toggleValue": ($event) => emit("update:toggle", section.id, $event)
4509
- }, {
4510
- default: withCtx(() => [renderSlot(_ctx.$slots, `section-${section.id}`, {}, () => [resolvedForms.value[section.id] ? (openBlock(), createBlock(FormBuilder_default, {
4619
+ class: normalizeClass(["mint-sidebar__group", isSectionOpen(section) ? "mint-sidebar__group--open" : "mint-sidebar__group--closed"])
4620
+ }, [createElementVNode("div", _hoisted_9$32, [createElementVNode("button", {
4621
+ type: "button",
4622
+ class: "mint-sidebar__group-toggle",
4623
+ "aria-expanded": isSectionOpen(section),
4624
+ onClick: ($event) => toggleSection(section)
4625
+ }, [section.icon ? (openBlock(), createElementBlock("span", {
4626
+ key: 0,
4627
+ class: "mint-sidebar__group-icon",
4628
+ style: normalizeStyle(railIconStyle(section))
4629
+ }, [isSvgIcon(section.icon) ? (openBlock(), createElementBlock("svg", _hoisted_11$28, [Array.isArray(section.icon) ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(section.icon, (d, i) => {
4630
+ return openBlock(), createElementBlock("path", {
4631
+ key: i,
4632
+ d
4633
+ }, null, 8, _hoisted_12$27);
4634
+ }), 128)) : (openBlock(), createElementBlock("path", {
4635
+ key: 1,
4636
+ d: section.icon
4637
+ }, null, 8, _hoisted_13$27))])) : (openBlock(), createElementBlock("span", _hoisted_14$25, toDisplayString(section.icon), 1))], 4)) : createCommentVNode("", true), createElementVNode("span", _hoisted_15$25, [createElementVNode("span", _hoisted_16$22, toDisplayString(section.label), 1), section.subtitle ? (openBlock(), createElementBlock("span", _hoisted_17$20, toDisplayString(section.subtitle), 1)) : createCommentVNode("", true)])], 8, _hoisted_10$30), createElementVNode("div", _hoisted_18$18, [
4638
+ section.badge !== void 0 ? (openBlock(), createElementBlock("span", {
4639
+ key: 0,
4640
+ class: normalizeClass(["mint-sidebar__tag", tagToneClass(section)])
4641
+ }, toDisplayString(section.badge), 3)) : createCommentVNode("", true),
4642
+ (openBlock(true), createElementBlock(Fragment, null, renderList(section.actions ?? [], (action) => {
4643
+ return openBlock(), createElementBlock("button", {
4644
+ key: action.id,
4645
+ type: "button",
4646
+ class: normalizeClass(actionClasses(action)),
4647
+ style: normalizeStyle(action.iconColor ? { color: action.iconColor } : void 0),
4648
+ disabled: action.disabled,
4649
+ "aria-label": action.label,
4650
+ title: action.label,
4651
+ onClick: ($event) => handleSectionAction(section.id, action.id)
4652
+ }, [action.icon && isSvgIcon(action.icon) ? (openBlock(), createElementBlock("svg", _hoisted_20$16, [Array.isArray(action.icon) ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(action.icon, (d, i) => {
4653
+ return openBlock(), createElementBlock("path", {
4654
+ key: i,
4655
+ d
4656
+ }, null, 8, _hoisted_21$15);
4657
+ }), 128)) : (openBlock(), createElementBlock("path", {
4658
+ key: 1,
4659
+ d: action.icon
4660
+ }, null, 8, _hoisted_22$14))])) : action.icon ? (openBlock(), createElementBlock("span", _hoisted_23$13, toDisplayString(action.icon), 1)) : createCommentVNode("", true)], 14, _hoisted_19$17);
4661
+ }), 128)),
4662
+ section.showToggle ? (openBlock(), createElementBlock("button", {
4663
+ key: 1,
4664
+ type: "button",
4665
+ role: "switch",
4666
+ "aria-checked": __props.toggleState[section.id] ?? false,
4667
+ "aria-label": `Enable ${section.label}`,
4668
+ class: normalizeClass(["mint-sidebar__switch", __props.toggleState[section.id] ?? false ? "mint-sidebar__switch--on" : ""]),
4669
+ onClick: ($event) => emit("update:toggle", section.id, !(__props.toggleState[section.id] ?? false))
4670
+ }, [..._cache[1] || (_cache[1] = [createElementVNode("span", { class: "mint-sidebar__switch-knob" }, null, -1)])], 10, _hoisted_24$13)) : createCommentVNode("", true),
4671
+ createElementVNode("button", {
4672
+ type: "button",
4673
+ class: "mint-sidebar__chevron-button",
4674
+ "aria-label": isSectionOpen(section) ? "Collapse section" : "Expand section",
4675
+ "aria-expanded": isSectionOpen(section),
4676
+ onClick: ($event) => toggleSection(section)
4677
+ }, [(openBlock(), createElementBlock("svg", {
4678
+ class: normalizeClass(["mint-sidebar__chevron", isSectionOpen(section) ? "mint-sidebar__chevron--open" : ""]),
4679
+ viewBox: "0 0 24 24",
4680
+ fill: "none",
4681
+ stroke: "currentColor",
4682
+ "stroke-width": "2",
4683
+ "stroke-linecap": "round",
4684
+ "stroke-linejoin": "round",
4685
+ "aria-hidden": "true"
4686
+ }, [..._cache[2] || (_cache[2] = [createElementVNode("path", { d: "m6 9 6 6 6-6" }, null, -1)])], 2))], 8, _hoisted_25$11)
4687
+ ])]), createVNode(Transition, { name: "collapse" }, {
4688
+ default: withCtx(() => [withDirectives(createElementVNode("div", _hoisted_26$10, [renderSlot(_ctx.$slots, `section-${section.id}`, {}, () => [resolvedForms.value[section.id] ? (openBlock(), createBlock(FormBuilder_default, {
4511
4689
  key: 0,
4512
4690
  "model-value": resolvedValues.value,
4513
4691
  schema: resolvedForms.value[section.id],
@@ -4531,32 +4709,17 @@ var AppSidebar_default = /* @__PURE__ */ defineComponent({
4531
4709
  "show-actions",
4532
4710
  "onSubmit",
4533
4711
  "onCancel"
4534
- ])) : createCommentVNode("", true)])]),
4712
+ ])) : createCommentVNode("", true)])], 512), [[vShow, isSectionOpen(section)]])]),
4535
4713
  _: 2
4536
- }, 1032, [
4537
- "title",
4538
- "subtitle",
4539
- "icon",
4540
- "icon-color",
4541
- "icon-bg",
4542
- "badge",
4543
- "badge-tone",
4544
- "actions",
4545
- "dense",
4546
- "default-open",
4547
- "show-toggle",
4548
- "toggle-value",
4549
- "onAction",
4550
- "onUpdate:toggleValue"
4551
- ]);
4714
+ }, 1024)], 2);
4552
4715
  }), 128)), renderSlot(_ctx.$slots, "default", {
4553
4716
  sections: activeSections.value,
4554
4717
  activeView: resolvedActiveView.value,
4555
4718
  values: resolvedValues.value
4556
- })], 8, _hoisted_8$34)) : _ctx.$slots.collapsed ? (openBlock(), createElementBlock("div", _hoisted_9$32, [renderSlot(_ctx.$slots, "collapsed", {
4719
+ })], 8, _hoisted_8$34)) : _ctx.$slots.collapsed ? (openBlock(), createElementBlock("div", _hoisted_27$10, [renderSlot(_ctx.$slots, "collapsed", {
4557
4720
  sections: activeSections.value,
4558
4721
  expand: expandCollapsed
4559
- })])) : (openBlock(), createElementBlock("div", _hoisted_10$30, [(openBlock(true), createElementBlock(Fragment, null, renderList(activeSections.value, (section) => {
4722
+ })])) : (openBlock(), createElementBlock("div", _hoisted_28$9, [(openBlock(true), createElementBlock(Fragment, null, renderList(activeSections.value, (section) => {
4560
4723
  return openBlock(), createElementBlock("button", {
4561
4724
  key: section.id,
4562
4725
  type: "button",
@@ -4567,20 +4730,20 @@ var AppSidebar_default = /* @__PURE__ */ defineComponent({
4567
4730
  }, [createElementVNode("span", {
4568
4731
  class: "mint-sidebar__rail-icon",
4569
4732
  style: normalizeStyle(railIconStyle(section))
4570
- }, [section.icon && isSvgIcon(section.icon) ? (openBlock(), createElementBlock("svg", _hoisted_12$27, [Array.isArray(section.icon) ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(section.icon, (d, i) => {
4733
+ }, [section.icon && isSvgIcon(section.icon) ? (openBlock(), createElementBlock("svg", _hoisted_30$6, [Array.isArray(section.icon) ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(section.icon, (d, i) => {
4571
4734
  return openBlock(), createElementBlock("path", {
4572
4735
  key: i,
4573
4736
  d
4574
- }, null, 8, _hoisted_13$27);
4737
+ }, null, 8, _hoisted_31$6);
4575
4738
  }), 128)) : (openBlock(), createElementBlock("path", {
4576
4739
  key: 1,
4577
4740
  d: section.icon
4578
- }, null, 8, _hoisted_14$25))])) : (openBlock(), createElementBlock("span", _hoisted_15$25, toDisplayString(section.icon || sectionInitial(section)), 1))], 4), section.badge !== void 0 ? (openBlock(), createElementBlock("span", {
4741
+ }, null, 8, _hoisted_32$6))])) : (openBlock(), createElementBlock("span", _hoisted_33$6, toDisplayString(section.icon || sectionInitial(section)), 1))], 4), section.badge !== void 0 ? (openBlock(), createElementBlock("span", {
4579
4742
  key: 0,
4580
4743
  class: normalizeClass(["mint-sidebar__rail-badge", badgeToneClass(section)])
4581
- }, toDisplayString(section.badge), 3)) : createCommentVNode("", true)], 8, _hoisted_11$28);
4744
+ }, toDisplayString(section.badge), 3)) : createCommentVNode("", true)], 8, _hoisted_29$7);
4582
4745
  }), 128))])),
4583
- !collapsedModel.value && _ctx.$slots.footer ? (openBlock(), createElementBlock("div", _hoisted_16$22, [renderSlot(_ctx.$slots, "footer")])) : collapsedModel.value && _ctx.$slots["collapsed-footer"] ? (openBlock(), createElementBlock("div", _hoisted_17$20, [renderSlot(_ctx.$slots, "collapsed-footer")])) : createCommentVNode("", true)
4746
+ !collapsedModel.value && _ctx.$slots.footer ? (openBlock(), createElementBlock("div", _hoisted_34$6, [renderSlot(_ctx.$slots, "footer")])) : collapsedModel.value && _ctx.$slots["collapsed-footer"] ? (openBlock(), createElementBlock("div", _hoisted_35$5, [renderSlot(_ctx.$slots, "collapsed-footer")])) : createCommentVNode("", true)
4584
4747
  ], 6);
4585
4748
  };
4586
4749
  }
@@ -4945,11 +5108,10 @@ var WorkspaceSidebarInternal_default = /* @__PURE__ */ defineComponent({
4945
5108
  title: __props.sidebar.title,
4946
5109
  subtitle: __props.sidebar.subtitle,
4947
5110
  badge: __props.sidebar.badge,
4948
- variant: __props.sidebar.variant,
4949
5111
  panels: __props.sidebar.panels,
4950
5112
  "active-view": __props.sidebar.activeView,
4951
5113
  floating: __props.sidebar.floating,
4952
- dense: __props.sidebar.dense,
5114
+ density: __props.sidebar.dense ? "compact" : "comfortable",
4953
5115
  width: __props.sidebar.width,
4954
5116
  side: __props.sidebar.side,
4955
5117
  forms: __props.sidebar.forms,
@@ -4986,11 +5148,10 @@ var WorkspaceSidebarInternal_default = /* @__PURE__ */ defineComponent({
4986
5148
  "title",
4987
5149
  "subtitle",
4988
5150
  "badge",
4989
- "variant",
4990
5151
  "panels",
4991
5152
  "active-view",
4992
5153
  "floating",
4993
- "dense",
5154
+ "density",
4994
5155
  "width",
4995
5156
  "side",
4996
5157
  "forms",
@@ -5285,60 +5446,89 @@ function generatedJobFormSchema(definition) {
5285
5446
  };
5286
5447
  }
5287
5448
  function generatedJobDefaults(definition) {
5288
- return Object.fromEntries(Object.entries(definition.input_schema.properties ?? {}).filter(([, schema]) => hasOwnDefault(schema)).map(([name, schema]) => [name, structuredClone(schema.default)]));
5449
+ return Object.fromEntries(Object.entries(definition.input_schema.properties ?? {}).map(([name, schema]) => [name, resolveGeneratedField(definition.input_schema, schema)]).filter(([, field]) => field.hasDefault).map(([name, field]) => [name, structuredClone(field.defaultValue)]));
5289
5450
  }
5290
5451
  function normalizeGeneratedJobInput(definition, values) {
5291
5452
  const normalized = {};
5292
5453
  for (const [name, value] of Object.entries(values)) {
5293
- if (!definition.input_schema.properties?.[name]) continue;
5294
- normalized[name] = value;
5454
+ const field = definition.input_schema.properties?.[name];
5455
+ if (!field) continue;
5456
+ const { schema, reference } = resolveGeneratedField(definition.input_schema, field);
5457
+ if (reference !== "path" && Array.isArray(value) && ["integer", "number"].includes(String(schema.items?.type))) normalized[name] = value.map((item) => {
5458
+ const numeric = typeof item === "string" && item.trim() !== "" ? Number(item) : item;
5459
+ return typeof numeric === "number" && Number.isFinite(numeric) ? numeric : item;
5460
+ });
5461
+ else if (reference !== "path" && Array.isArray(value) && schema.items?.type === "boolean") normalized[name] = value.map((item) => item === "true" ? true : item === "false" ? false : item);
5462
+ else normalized[name] = value === void 0 && allowsNull(schema) ? null : value;
5295
5463
  }
5296
5464
  return normalized;
5297
5465
  }
5298
5466
  function toFormField(name, resolved, required) {
5299
5467
  const { schema, reference } = resolved;
5300
5468
  const validation = {};
5301
- if (required) validation.required = true;
5469
+ const allowsEmpty = schema.type === "array" || schema.type === "string" && reference !== "path" && !(schema.minLength && schema.minLength > 0) && (!schema.enum || schema.enum.includes(""));
5470
+ if (required && !allowsNull(schema) && !allowsEmpty) validation.required = true;
5302
5471
  if (schema.minimum !== void 0) validation.min = schema.minimum;
5303
5472
  if (schema.maximum !== void 0) validation.max = schema.maximum;
5304
5473
  if (schema.minLength !== void 0) validation.minLength = schema.minLength;
5305
5474
  if (schema.maxLength !== void 0) validation.maxLength = schema.maxLength;
5306
5475
  const props = {};
5307
5476
  if (schema.enum) props.options = [...schema.enum];
5477
+ if (schema.type === "integer") {
5478
+ if (schema.exclusiveMinimum !== void 0) validation.min = Math.max(Number(validation.min ?? -Infinity), Math.floor(schema.exclusiveMinimum) + 1);
5479
+ if (schema.exclusiveMaximum !== void 0) validation.max = Math.min(Number(validation.max ?? Infinity), Math.ceil(schema.exclusiveMaximum) - 1);
5480
+ if (validation.min !== void 0) validation.min = Math.ceil(Number(validation.min));
5481
+ if (validation.max !== void 0) validation.max = Math.floor(Number(validation.max));
5482
+ if (schema.multipleOf && Number.isInteger(schema.multipleOf)) {
5483
+ if (validation.min !== void 0) validation.min = Math.ceil(Number(validation.min) / schema.multipleOf) * schema.multipleOf;
5484
+ if (validation.max !== void 0) validation.max = Math.floor(Number(validation.max) / schema.multipleOf) * schema.multipleOf;
5485
+ }
5486
+ props.step = 1;
5487
+ }
5488
+ if (schema.type === "integer" || schema.type === "number") {
5489
+ if (validation.min !== void 0) props.min = validation.min;
5490
+ if (validation.max !== void 0) props.max = validation.max;
5491
+ if (schema.multipleOf !== void 0) props.step = schema.multipleOf;
5492
+ }
5493
+ if (schema.type === "array" && reference !== "path") if (schema.items?.enum) props.options = [...schema.items.enum];
5494
+ else props.allowDuplicates = true;
5308
5495
  if (reference === "path" && schema.type === "array") props.multiple = true;
5309
5496
  return {
5310
5497
  name,
5311
5498
  label: schema.title || humanize(name),
5312
5499
  type: fieldType(schema, reference),
5313
5500
  defaultValue: resolved.hasDefault ? structuredClone(resolved.defaultValue) : void 0,
5501
+ disabled: Object.prototype.hasOwnProperty.call(schema, "const") || void 0,
5314
5502
  hint: schema.description,
5315
5503
  validation,
5316
- props
5504
+ props,
5505
+ itemType: schema.items?.type === "number" || schema.items?.type === "integer" ? "number" : void 0
5317
5506
  };
5318
5507
  }
5319
5508
  function resolveGeneratedField(root, field) {
5320
- const hasDefault = hasOwnDefault(field);
5321
5509
  const candidate = field.anyOf?.find((item) => item.type !== "null") ?? field.allOf?.[0] ?? field;
5510
+ let schema = {
5511
+ ...candidate,
5512
+ ...field
5513
+ };
5322
5514
  if (candidate.$ref) {
5323
5515
  const referenceParts = candidate.$ref.split("/");
5324
5516
  const key = referenceParts[referenceParts.length - 1];
5325
- const schema = key ? root.$defs?.[key] : void 0;
5326
- if (!schema) throw new Error(`Generated field reference is missing: ${candidate.$ref}`);
5327
- return {
5328
- schema: {
5329
- ...schema,
5330
- title: field.title ?? schema.title
5331
- },
5332
- reference: field["x-mint-component"] ?? schema["x-mint-component"],
5333
- hasDefault,
5334
- defaultValue: field.default
5517
+ const referenced = key ? root.$defs?.[key] : void 0;
5518
+ if (!referenced) throw new Error(`Generated field reference is missing: ${candidate.$ref}`);
5519
+ schema = {
5520
+ ...referenced,
5521
+ ...candidate,
5522
+ ...field
5335
5523
  };
5336
5524
  }
5525
+ if (schema.items) schema.items = resolveGeneratedField(root, schema.items).schema;
5526
+ const constant = Object.prototype.hasOwnProperty.call(schema, "const");
5337
5527
  return {
5338
- schema: candidate,
5339
- reference: field["x-mint-component"] ?? candidate["x-mint-component"],
5340
- hasDefault,
5341
- defaultValue: field.default
5528
+ schema,
5529
+ reference: schema["x-mint-component"],
5530
+ hasDefault: constant || hasOwnDefault(field) || allowsNull(schema),
5531
+ defaultValue: constant ? schema.const : hasOwnDefault(field) ? field.default : null
5342
5532
  };
5343
5533
  }
5344
5534
  function fieldType(schema, reference) {
@@ -5347,12 +5537,15 @@ function fieldType(schema, reference) {
5347
5537
  const type = Array.isArray(schema.type) ? schema.type.find((value) => value !== "null") : schema.type;
5348
5538
  if (type === "boolean") return "toggle";
5349
5539
  if (type === "number" || type === "integer") return "number";
5350
- if (type === "array") return "tags";
5540
+ if (type === "array") return schema.items?.enum ? "multiselect" : "tags";
5351
5541
  return "text";
5352
5542
  }
5353
5543
  function hasOwnDefault(schema) {
5354
5544
  return Object.prototype.hasOwnProperty.call(schema, "default");
5355
5545
  }
5546
+ function allowsNull(schema) {
5547
+ return schema.type === "null" || Array.isArray(schema.type) && schema.type.includes("null") || !!schema.anyOf?.some((item) => item.type === "null");
5548
+ }
5356
5549
  function humanize(value) {
5357
5550
  return value.replace(/[_-]+/g, " ").replace(/^\w/, (character) => character.toUpperCase());
5358
5551
  }
@@ -20234,10 +20427,22 @@ function usePickerSelection(nav, mode, capability, skipBlanks) {
20234
20427
  watch(() => new Map([...nav.nodes.value].map(([path, node]) => [path, nav.isAllowed(node)])), (allowed, previous) => {
20235
20428
  if (keys.value.size && [...allowed].some(([path, value]) => previous.has(path) && value !== previous.get(path))) resolve();
20236
20429
  });
20430
+ const selectedFileCounts = computed(() => {
20431
+ const counts = /* @__PURE__ */ new Map();
20432
+ for (const file of chosen.value.files) {
20433
+ const seen = /* @__PURE__ */ new Set();
20434
+ let parent = file.parentPath;
20435
+ while (parent && !seen.has(parent)) {
20436
+ seen.add(parent);
20437
+ counts.set(parent, (counts.get(parent) ?? 0) + 1);
20438
+ parent = nav.nodes.value.get(parent)?.parentPath;
20439
+ }
20440
+ }
20441
+ return counts;
20442
+ });
20237
20443
  function folderProgress(node) {
20238
20444
  if (node.kind !== "folder" || node.fileCount == null) return "";
20239
- const allowed = chosen.value.files.filter((file) => ancestorSelected(file, new Set([node.path]))).length;
20240
- return `${selected(node) ? allowed : 0} / ${node.fileCount}`;
20445
+ return `${selected(node) ? selectedFileCounts.value.get(node.path) ?? 0 : 0} / ${node.fileCount}`;
20241
20446
  }
20242
20447
  return {
20243
20448
  keys,
@@ -20273,7 +20478,10 @@ function localFilesAdapter(files, relativePaths) {
20273
20478
  kind: "folder",
20274
20479
  name: parts[i],
20275
20480
  path,
20276
- parentPath: parent
20481
+ parentPath: parent,
20482
+ fileCount: 0,
20483
+ bytes: 0,
20484
+ formats: {}
20277
20485
  });
20278
20486
  parent = path;
20279
20487
  }
@@ -20289,17 +20497,22 @@ function localFilesAdapter(files, relativePaths) {
20289
20497
  file
20290
20498
  });
20291
20499
  }
20500
+ const children = /* @__PURE__ */ new Map();
20292
20501
  for (const node of nodes.values()) {
20293
- if (node.kind !== "folder") continue;
20294
- const descendants = [...nodes.values()].filter((item) => item.kind === "file" && item.path.startsWith(`${node.path}/`));
20295
- node.fileCount = descendants.length;
20296
- node.bytes = descendants.reduce((sum, file) => sum + (file.bytes ?? 0), 0);
20297
- node.formats = {};
20298
- descendants.forEach((file) => {
20299
- node.formats[file.format] = (node.formats[file.format] ?? 0) + 1;
20300
- });
20502
+ const parent = node.parentPath ?? "";
20503
+ const siblings = children.get(parent);
20504
+ if (siblings) siblings.push(node);
20505
+ else children.set(parent, [node]);
20506
+ if (node.kind !== "file") continue;
20507
+ for (let slash = node.path.indexOf("/"); slash >= 0; slash = node.path.indexOf("/", slash + 1)) {
20508
+ const folder = nodes.get(node.path.slice(0, slash));
20509
+ if (folder?.kind !== "folder") continue;
20510
+ folder.fileCount = (folder.fileCount ?? 0) + 1;
20511
+ folder.bytes = (folder.bytes ?? 0) + (node.bytes ?? 0);
20512
+ folder.formats[node.format] = (folder.formats[node.format] ?? 0) + 1;
20513
+ }
20301
20514
  }
20302
- const list = (path) => [...nodes.values()].filter((node) => (node.parentPath ?? "") === path);
20515
+ const list = (path) => [...children.get(path) ?? []];
20303
20516
  return {
20304
20517
  listRoot: async () => list(""),
20305
20518
  listChildren: async (path) => list(path),
@@ -21018,4 +21231,4 @@ var components_exports = /* @__PURE__ */ __exportAll({
21018
21231
  //#endregion
21019
21232
  export { AutoGroupModal_default as $, ChemicalFormula_default as A, ActionMenu_default as At, BioTemplateExperimentWorkspaceView_default as B, ColorSlider_default as Bt, SequenceProgressBar_default as C, StepWizard_default as Ct, formatSequenceRemaining as D, PluginIcon_default as Dt, formatSequenceEta as E, AppAvatarMenu_default as Et, SmartGroupModal_default as F, LoadingSpinner_default as Ft, StatusIndicator_default as G, Breadcrumb_default as H, GroupAssigner_default as I, Calendar_default as It, DoseDesignWorkspaceView_default as J, Divider_default as K, RackEditor_default as L, DropdownButton_default as Lt, ProtocolStepEditor_default as M, RuntimeUpdateNotice_default as Mt, SampleHierarchyTree_default as N, AppToastContainer_default as Nt, sequenceProgressPercent as O, CollapsibleCard_default as Ot, ReagentEditor_default as P, DataFrame_default as Pt, SampleSelector_default as Q, BioTemplatePresetWorkspaceView_default as R, SegmentedControl_default as Rt, InstrumentAlertLog_default as S, FormActions_default as St, estimateSequenceRemainingSeconds as T, AppPluginSwitcher_default as Tt, Avatar_default as U, BioTemplateRenderer_default as V, ProgressBar_default as W, ComponentBindingRenderer_default as X, ControlWorkspaceView_default as Y, ScheduleCalendar_default as Z, inferLcmsPlateTypeFromWellIds as _, PluginWorkspaceView_default as _t, FileBrowserModal_default as a, WellPlate_default as at, InstrumentStatusCard_default as b, AppSidebar_default as bt, TimeRangeInput_default as c, GeneratedPluginView_default as ct, AuditTrail_default as d, GeneratedPlotlyResult_default as dt, SmartGroupManual_default as et, LcmsSequenceTable_default as f, PlotlyChart_default as ft, extractLcmsSampleName as g, normalizeGeneratedJobInput as gt, extractLcmsCommonPrefix as h, generatedJobFormSchema as ht, ArtifactSaveDialog_default as i, SampleLegend_default as it, ScientificNumber_default as j, IconButton_default as jt, sequenceSamplesRemaining as k, ThemeToggle_default as kt, ExperimentDataViewer_default as l, JobsStatusTray_default as lt, basenameFromWindowsPath as m, generatedJobDefaults as mt, FilePicker_default as n, ReagentList_default as nt, SectionCard_default as o, ExperimentTimeline_default as ot, DEFAULT_LCMS_SEQUENCE_COLUMNS as p, ChartContainer_default as pt, AppContainer_default as q, FitPanel_default as r, PlateMapEditor_default as rt, ResourceCard_default as s, DoseCalculator_default as st, components_exports as t, SmartGroupFieldRecipe_default as tt, BatchProgressList_default as u, GeneratedResultRenderer_default as ut, lcmsWellIdFromPosition as v, MobileSupportGate_default as vt, estimateSequenceFinishDate as w, AppTopBar_default as wt, InstrumentStateBadge_default as x, FormBuilder_default as xt, reconstructLcmsPlateCellsFromSequenceItems as y, AppLayout_default as yt, BioTemplatePackWorkspaceView_default as z, BaseTabs_default as zt };
21020
21233
 
21021
- //# sourceMappingURL=components-DIum5hkx.js.map
21234
+ //# sourceMappingURL=components-Cp8DcNrU.js.map