@morscherlab/mint-sdk 1.0.0 → 1.0.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 (68) hide show
  1. package/dist/BaseModal-B9UA8Y_I.js +165 -0
  2. package/dist/BaseModal-B9UA8Y_I.js.map +1 -0
  3. package/dist/BaseSelect-DksaKYq_.js +176 -0
  4. package/dist/BaseSelect-DksaKYq_.js.map +1 -0
  5. package/dist/ExperimentPopover-CCYB1oWp.js +361 -0
  6. package/dist/ExperimentPopover-CCYB1oWp.js.map +1 -0
  7. package/dist/ExperimentPopover-D0bg_fqM.js +3 -0
  8. package/dist/ExperimentSelectorModal-B_kPbXcg.js +4 -0
  9. package/dist/ExperimentSelectorModal-wm7yUdAr.js +720 -0
  10. package/dist/ExperimentSelectorModal-wm7yUdAr.js.map +1 -0
  11. package/dist/SettingsModal-L7Ejny45.js +5 -0
  12. package/dist/SettingsModal-LEKI6Ebl.js +521 -0
  13. package/dist/SettingsModal-LEKI6Ebl.js.map +1 -0
  14. package/dist/{auth-BulIv_km.js → auth-D9q2GIcv.js} +3 -80
  15. package/dist/auth-D9q2GIcv.js.map +1 -0
  16. package/dist/components/DataFrame.vue.d.ts +3 -0
  17. package/dist/components/ExperimentDataViewer.vue.d.ts +2 -0
  18. package/dist/components/PluginWorkspaceView.vue.d.ts +2 -2
  19. package/dist/components/index.js +7 -2
  20. package/dist/{components-DtX3LDLq.js → components-CdjRzHI2.js} +533 -2025
  21. package/dist/components-CdjRzHI2.js.map +1 -0
  22. package/dist/composables/index.js +9 -3
  23. package/dist/composables/usePluginClient.d.ts +2 -1
  24. package/dist/{composables-wNt7VtkF.js → composables-DJgqPrlR.js} +7 -12
  25. package/dist/{composables-wNt7VtkF.js.map → composables-DJgqPrlR.js.map} +1 -1
  26. package/dist/experiment-utils-hGXMHlAc.js +109 -0
  27. package/dist/experiment-utils-hGXMHlAc.js.map +1 -0
  28. package/dist/index.js +16 -5
  29. package/dist/index.js.map +1 -1
  30. package/dist/install.js +7 -2
  31. package/dist/install.js.map +1 -1
  32. package/dist/permissions.js +81 -0
  33. package/dist/permissions.js.map +1 -0
  34. package/dist/stores/index.js +1 -1
  35. package/dist/styles.css +3233 -3185
  36. package/dist/templates/index.js +3 -1
  37. package/dist/templates-Do43ZIMb.js +5065 -0
  38. package/dist/templates-Do43ZIMb.js.map +1 -0
  39. package/dist/{templates-DSbHJC4v.js → useControlSchema-0n8Bcftq.js} +10 -5335
  40. package/dist/useControlSchema-0n8Bcftq.js.map +1 -0
  41. package/dist/useDropdownState-Ben4DnjJ.js +47 -0
  42. package/dist/useDropdownState-Ben4DnjJ.js.map +1 -0
  43. package/dist/useEventListener-CfVkP9Xz.js +57 -0
  44. package/dist/useEventListener-CfVkP9Xz.js.map +1 -0
  45. package/dist/useExperimentSelector-BpZklTbV.js +469 -0
  46. package/dist/useExperimentSelector-BpZklTbV.js.map +1 -0
  47. package/dist/useFormBuilder-COfYWDuC.js +729 -0
  48. package/dist/useFormBuilder-COfYWDuC.js.map +1 -0
  49. package/dist/{useProtocolTemplates-DwBhEPPU.js → useProtocolTemplates-TUQO_F3n.js} +8 -1298
  50. package/dist/useProtocolTemplates-TUQO_F3n.js.map +1 -0
  51. package/dist/utils/pluginIcon.d.ts +29 -2
  52. package/package.json +5 -1
  53. package/src/__tests__/components/DataFrame.test.ts +37 -0
  54. package/src/__tests__/components/PluginIcon.test.ts +77 -0
  55. package/src/__tests__/composables/usePluginClient.test.ts +11 -10
  56. package/src/components/AppTopBar.vue +7 -6
  57. package/src/components/DataFrame.vue +27 -2
  58. package/src/components/ExperimentDataViewer.vue +5 -1
  59. package/src/components/PluginIcon.story.vue +31 -1
  60. package/src/components/PluginIcon.vue +94 -4
  61. package/src/composables/usePluginClient.ts +3 -12
  62. package/src/styles/components/dataframe.css +26 -0
  63. package/src/styles/components/plugin-icon.css +5 -0
  64. package/src/utils/pluginIcon.ts +159 -2
  65. package/dist/auth-BulIv_km.js.map +0 -1
  66. package/dist/components-DtX3LDLq.js.map +0 -1
  67. package/dist/templates-DSbHJC4v.js.map +0 -1
  68. package/dist/useProtocolTemplates-DwBhEPPU.js.map +0 -1
@@ -1,7 +1,16 @@
1
- import { $n as TimePicker_default, Ar as BaseInput_default, B as toBioTemplateComponentProps, Bn as ConcentrationInput_default, Cr as BaseToggle_default, Dn as controlValuesToComponentProps, Dr as BaseSelect_default, En as controlValuesToComponentBindingsById, Er as useEventListener, F as getBioTemplateComponentProps, H as toBioTemplateComponentPropsById, Hn as useConcentrationUnits, In as controlsToViewItems, Jn as useChemicalFormula, Kn as FormulaInput_default, L as toBioTemplateComponentBindings, Ln as getDefaultControlView, Mn as controlsToSettingsSchema, Nn as controlsToSidebarPanels, On as mergeControlWorkspaceOptions, Or as normalizeOptionInput, Qn as TagsInput_default, R as toBioTemplateComponentBindingsById, Rn as getFieldRegistryEntry, Sn as useControlWorkspace, Sr as BaseRadioGroup_default, Tn as controlValuesToComponentBindings, Tr as Tooltip_default, Un as MoleculeInput_default, V as toBioTemplateComponentPropsByComponent, Vn as UnitInput_default, Wn as SequenceInput_default, Xn as FileUploader_default, Yn as DateTimePicker_default, Zn as NumberInput_default, _r as useDropdownState, ar as formatDuration, dn as extractTemplateCollection, gr as DatePicker_default, hn as getControlDefaults, jn as controlsToSectionFormSchemas, kn as controlsToFormSchema, kr as BaseTextarea_default, nr as durationMinutes, or as formatTime, tr as compareTime, vn as defineDoseDesignControlModel, vr as MultiSelect_default, wn as resolveControlModel, wr as BaseCheckbox_default, xr as BaseSlider_default, yr as useListSelection } from "./templates-DSbHJC4v.js";
2
- import { A as parseCSV, B as useExperimentSelector, C as useExpansionSet, F as classKey, I as useWellPlateEditor, J as SORT_OPTIONS, K as EXPERIMENT_STATUS_OPTIONS, L as useDoseCalculator, P as DEFAULT_COLORS, Q as getExperimentStatusVariant, R as APP_EXPERIMENT_KEY, U as useApi, W as DATE_PRESET_OPTIONS, X as formatExperimentDate, Z as formatExperimentStatus, _ as useScheduleDrag, a as useReagentSeries, at as useToast, c as useBioTemplatePresetWorkspace, ct as useTextSearch, et as usePlatformContext, it as useTheme, k as useAutoGroup, l as useBioTemplatePackWorkspace, n as DEFAULT_PRESETS, o as useGroupAssignment, r as DEFAULT_UNITS, s as useRackEditor, t as useProtocolTemplates, tt as useFormBuilder, ut as useSortedItems, v as useExperimentSamples, w as useSampleGroups, y as useExperimentData, z as useAppExperiment } from "./useProtocolTemplates-DwBhEPPU.js";
3
- import { a as canAccessByPolicy, g as useSettingsStore, h as colorPalettes, t as useAuthStore } from "./auth-BulIv_km.js";
4
- import { Fragment, Teleport, Transition, TransitionGroup, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createStaticVNode, createTextVNode, createVNode, defineComponent, effectScope, guardReactiveProps, h, inject, mergeProps, nextTick, normalizeClass, normalizeProps, normalizeStyle, onMounted, onScopeDispose, onUnmounted, openBlock, reactive, ref, renderList, renderSlot, resolveComponent, resolveDynamicComponent, shallowRef, toDisplayString, toRaw, unref, useSlots, vModelCheckbox, vModelSelect, vModelText, vShow, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
1
+ import { a as BasePill_default, i as Skeleton_default, n as ExperimentCodeBadge_default, o as BaseButton_default, r as EmptyState_default, t as ExperimentSelectorModal_default } from "./ExperimentSelectorModal-wm7yUdAr.js";
2
+ import { n as normalizeOptionInput, r as BaseInput_default, t as BaseSelect_default } from "./BaseSelect-DksaKYq_.js";
3
+ import { A as useConcentrationUnits, B as TagsInput_default, I as useChemicalFormula, J as formatTime, L as DateTimePicker_default, M as SequenceInput_default, O as ConcentrationInput_default, P as FormulaInput_default, R as FileUploader_default, T as getDefaultControlView, U as compareTime, V as TimePicker_default, W as durationMinutes, _ as controlsToFormSchema, at as MultiSelect_default, ct as BaseSlider_default, dt as BaseCheckbox_default, f as resolveControlModel, ft as Tooltip_default, g as mergeControlWorkspaceOptions, h as controlValuesToComponentProps, it as DatePicker_default, j as MoleculeInput_default, k as UnitInput_default, lt as BaseRadioGroup_default, m as controlValuesToComponentBindingsById, o as defineDoseDesignControlModel, ot as useListSelection, p as controlValuesToComponentBindings, pt as BaseTextarea_default, q as formatDuration, r as getControlDefaults, u as useControlWorkspace, ut as BaseToggle_default, w as controlsToViewItems, x as controlsToSidebarPanels, y as controlsToSectionFormSchemas, z as NumberInput_default } from "./useControlSchema-0n8Bcftq.js";
4
+ import { t as useEventListener } from "./useEventListener-CfVkP9Xz.js";
5
+ import { a as recordValuesEqualForKeys, c as normalizeLabelItemInput, i as pickExistingRecordKeys, n as FormFieldRendererInternal_default, o as FormField_default, r as formSchemaFieldNames, s as normalizeItemInput, t as SettingsModal_default } from "./SettingsModal-LEKI6Ebl.js";
6
+ import { t as BaseModal_default } from "./BaseModal-B9UA8Y_I.js";
7
+ import { t as useDropdownState } from "./useDropdownState-Ben4DnjJ.js";
8
+ import { A as parseCSV, B as useTheme, C as useExpansionSet, F as classKey, I as useWellPlateEditor, K as useSortedItems, L as useDoseCalculator, P as DEFAULT_COLORS, R as APP_EXPERIMENT_KEY, V as useToast, W as useTextSearch, _ as useScheduleDrag, a as useReagentSeries, c as useBioTemplatePresetWorkspace, k as useAutoGroup, l as useBioTemplatePackWorkspace, n as DEFAULT_PRESETS, o as useGroupAssignment, r as DEFAULT_UNITS, s as useRackEditor, t as useProtocolTemplates, v as useExperimentSamples, w as useSampleGroups, y as useExperimentData, z as useAppExperiment } from "./useProtocolTemplates-TUQO_F3n.js";
9
+ import { i as usePlatformContext, t as useFormBuilder } from "./useFormBuilder-COfYWDuC.js";
10
+ import { i as useApi } from "./useExperimentSelector-BpZklTbV.js";
11
+ import { n as ConfirmDialog_default, t as ExperimentPopover_default } from "./ExperimentPopover-CCYB1oWp.js";
12
+ import { B as toBioTemplateComponentProps, F as getBioTemplateComponentProps, H as toBioTemplateComponentPropsById, L as toBioTemplateComponentBindings, R as toBioTemplateComponentBindingsById, V as toBioTemplateComponentPropsByComponent, dn as extractTemplateCollection } from "./templates-Do43ZIMb.js";
13
+ import { Fragment, Teleport, Transition, TransitionGroup, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createStaticVNode, createTextVNode, createVNode, defineAsyncComponent, defineComponent, effectScope, guardReactiveProps, h, inject, mergeProps, nextTick, normalizeClass, normalizeProps, normalizeStyle, onMounted, onScopeDispose, onUnmounted, openBlock, reactive, ref, renderList, renderSlot, resolveComponent, resolveDynamicComponent, shallowRef, toDisplayString, toRaw, unref, useSlots, vModelCheckbox, vModelSelect, vModelText, vShow, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
5
14
  //#region \0rolldown/runtime.js
6
15
  var __defProp = Object.defineProperty;
7
16
  var __exportAll = (all, no_symbols) => {
@@ -14,75 +23,10 @@ var __exportAll = (all, no_symbols) => {
14
23
  return target;
15
24
  };
16
25
  //#endregion
17
- //#region src/components/BaseButton.vue?vue&type=script&setup=true&lang.ts
18
- var _hoisted_1$77 = ["type", "disabled"];
19
- var _hoisted_2$68 = {
20
- key: 0,
21
- class: "mint-button__spinner",
22
- fill: "none",
23
- viewBox: "0 0 24 24"
24
- };
25
- //#endregion
26
- //#region src/components/BaseButton.vue
27
- var BaseButton_default = /* @__PURE__ */ defineComponent({
28
- __name: "BaseButton",
29
- props: {
30
- variant: { default: "primary" },
31
- size: { default: "md" },
32
- disabled: {
33
- type: Boolean,
34
- default: false
35
- },
36
- loading: {
37
- type: Boolean,
38
- default: false
39
- },
40
- type: { default: "button" },
41
- fullWidth: {
42
- type: Boolean,
43
- default: false
44
- }
45
- },
46
- emits: ["click"],
47
- setup(__props, { emit: __emit }) {
48
- /** Renders a styled `<button>` with variant, size, loading spinner, and full-width options. */
49
- const props = __props;
50
- const emit = __emit;
51
- function handleClick(event) {
52
- if (!props.disabled && !props.loading) emit("click", event);
53
- }
54
- return (_ctx, _cache) => {
55
- return openBlock(), createElementBlock("button", {
56
- type: __props.type,
57
- disabled: __props.disabled || __props.loading,
58
- class: normalizeClass([
59
- "mint-button",
60
- `mint-button--${__props.variant}`,
61
- `mint-button--${__props.size}`,
62
- __props.fullWidth ? "mint-button--full-width" : "",
63
- __props.disabled || __props.loading ? "mint-button--disabled" : ""
64
- ]),
65
- onClick: handleClick
66
- }, [__props.loading ? (openBlock(), createElementBlock("svg", _hoisted_2$68, [..._cache[0] || (_cache[0] = [createElementVNode("circle", {
67
- style: { "opacity": "0.25" },
68
- cx: "12",
69
- cy: "12",
70
- r: "10",
71
- stroke: "currentColor",
72
- "stroke-width": "4"
73
- }, null, -1), createElementVNode("path", {
74
- style: { "opacity": "0.75" },
75
- fill: "currentColor",
76
- d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
77
- }, null, -1)])])) : createCommentVNode("", true), renderSlot(_ctx.$slots, "default")], 10, _hoisted_1$77);
78
- };
79
- }
80
- });
81
- //#endregion
82
26
  //#region src/components/ColorSlider.vue?vue&type=script&setup=true&lang.ts
83
- var _hoisted_1$76 = { class: "mint-color-slider__row" };
84
- var _hoisted_2$67 = { class: "mint-color-slider__track" };
85
- var _hoisted_3$61 = [
27
+ var _hoisted_1$67 = { class: "mint-color-slider__row" };
28
+ var _hoisted_2$59 = { class: "mint-color-slider__track" };
29
+ var _hoisted_3$54 = [
86
30
  "value",
87
31
  "min",
88
32
  "max",
@@ -197,7 +141,7 @@ var ColorSlider_default = /* @__PURE__ */ defineComponent({
197
141
  emit("update:modelValue", Number(target.value));
198
142
  }
199
143
  return (_ctx, _cache) => {
200
- return openBlock(), createElementBlock("div", { class: normalizeClass(["mint-color-slider", { "mint-color-slider--disabled": __props.disabled }]) }, [createElementVNode("div", _hoisted_1$76, [createElementVNode("div", _hoisted_2$67, [createElementVNode("input", {
144
+ return openBlock(), createElementBlock("div", { class: normalizeClass(["mint-color-slider", { "mint-color-slider--disabled": __props.disabled }]) }, [createElementVNode("div", _hoisted_1$67, [createElementVNode("div", _hoisted_2$59, [createElementVNode("input", {
201
145
  type: "range",
202
146
  value: currentValue.value,
203
147
  min: __props.min,
@@ -214,7 +158,7 @@ var ColorSlider_default = /* @__PURE__ */ defineComponent({
214
158
  "--thumb-size": `${sizeConfig.value.thumb}px`
215
159
  }),
216
160
  onInput: handleInput
217
- }, null, 44, _hoisted_3$61)]), __props.showValue ? (openBlock(), createElementBlock("div", {
161
+ }, null, 44, _hoisted_3$54)]), __props.showValue ? (openBlock(), createElementBlock("div", {
218
162
  key: 0,
219
163
  class: "mint-color-slider__badge",
220
164
  style: normalizeStyle({
@@ -232,27 +176,14 @@ var ColorSlider_default = /* @__PURE__ */ defineComponent({
232
176
  }
233
177
  });
234
178
  //#endregion
235
- //#region src/utils/items.ts
236
- function normalizeItemInput(item) {
237
- if (typeof item === "object") return item;
238
- return {
239
- id: item,
240
- label: item
241
- };
242
- }
243
- function normalizeLabelItemInput(item) {
244
- if (typeof item === "object") return item;
245
- return { label: item };
246
- }
247
- //#endregion
248
179
  //#region src/components/BaseTabs.vue?vue&type=script&setup=true&lang.ts
249
- var _hoisted_1$75 = [
180
+ var _hoisted_1$66 = [
250
181
  "aria-selected",
251
182
  "aria-disabled",
252
183
  "onClick"
253
184
  ];
254
- var _hoisted_2$66 = { class: "mint-tab__content" };
255
- var _hoisted_3$60 = {
185
+ var _hoisted_2$58 = { class: "mint-tab__content" };
186
+ var _hoisted_3$53 = {
256
187
  key: 0,
257
188
  class: "mint-tab__icon mint-tab__icon--svg",
258
189
  viewBox: "0 0 24 24",
@@ -263,13 +194,13 @@ var _hoisted_3$60 = {
263
194
  "stroke-linejoin": "round",
264
195
  "aria-hidden": "true"
265
196
  };
266
- var _hoisted_4$56 = ["d"];
267
- var _hoisted_5$54 = ["d"];
268
- var _hoisted_6$53 = {
197
+ var _hoisted_4$50 = ["d"];
198
+ var _hoisted_5$48 = ["d"];
199
+ var _hoisted_6$47 = {
269
200
  key: 1,
270
201
  class: "mint-tab__icon"
271
202
  };
272
- var _hoisted_7$47 = {
203
+ var _hoisted_7$43 = {
273
204
  key: 2,
274
205
  class: "mint-tab__badge"
275
206
  };
@@ -314,193 +245,33 @@ var BaseTabs_default = /* @__PURE__ */ defineComponent({
314
245
  tab.disabled ? "mint-tab--disabled" : ""
315
246
  ]),
316
247
  onClick: ($event) => selectTab(tab.id)
317
- }, [createElementVNode("span", _hoisted_2$66, [
318
- isSvgIcon(tab.icon) ? (openBlock(), createElementBlock("svg", _hoisted_3$60, [Array.isArray(tab.icon) ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(tab.icon, (d, index) => {
248
+ }, [createElementVNode("span", _hoisted_2$58, [
249
+ isSvgIcon(tab.icon) ? (openBlock(), createElementBlock("svg", _hoisted_3$53, [Array.isArray(tab.icon) ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(tab.icon, (d, index) => {
319
250
  return openBlock(), createElementBlock("path", {
320
251
  key: index,
321
252
  d
322
- }, null, 8, _hoisted_4$56);
253
+ }, null, 8, _hoisted_4$50);
323
254
  }), 128)) : (openBlock(), createElementBlock("path", {
324
255
  key: 1,
325
256
  d: tab.icon
326
- }, null, 8, _hoisted_5$54))])) : tab.icon ? (openBlock(), createElementBlock("span", _hoisted_6$53, toDisplayString(tab.icon), 1)) : createCommentVNode("", true),
257
+ }, null, 8, _hoisted_5$48))])) : tab.icon ? (openBlock(), createElementBlock("span", _hoisted_6$47, toDisplayString(tab.icon), 1)) : createCommentVNode("", true),
327
258
  createTextVNode(" " + toDisplayString(tab.label) + " ", 1),
328
- tab.badge !== void 0 ? (openBlock(), createElementBlock("span", _hoisted_7$47, toDisplayString(tab.badge), 1)) : createCommentVNode("", true)
329
- ])], 10, _hoisted_1$75);
259
+ tab.badge !== void 0 ? (openBlock(), createElementBlock("span", _hoisted_7$43, toDisplayString(tab.badge), 1)) : createCommentVNode("", true)
260
+ ])], 10, _hoisted_1$66);
330
261
  }), 128))], 2);
331
262
  };
332
263
  }
333
264
  });
334
265
  //#endregion
335
- //#region src/components/BaseModal.vue?vue&type=script&setup=true&lang.ts
336
- var _hoisted_1$74 = {
337
- key: 0,
338
- class: "mint-modal__grab-hint",
339
- "aria-hidden": "true"
340
- };
341
- var _hoisted_2$65 = {
342
- key: 1,
343
- class: "mint-modal__header"
344
- };
345
- var _hoisted_3$59 = {
346
- key: 0,
347
- class: "mint-modal__header-text"
348
- };
349
- var _hoisted_4$55 = {
350
- key: 0,
351
- class: "mint-modal__title"
352
- };
353
- var _hoisted_5$53 = {
354
- key: 1,
355
- class: "mint-modal__subtitle"
356
- };
357
- var _hoisted_6$52 = { class: "mint-modal__body" };
358
- var _hoisted_7$46 = {
359
- key: 2,
360
- class: "mint-modal__footer"
361
- };
362
- //#endregion
363
- //#region src/components/BaseModal.vue
364
- var BaseModal_default = /* @__PURE__ */ defineComponent({
365
- __name: "BaseModal",
366
- props: {
367
- modelValue: { type: Boolean },
368
- title: {},
369
- subtitle: {},
370
- size: { default: "md" },
371
- variant: { default: "centered" },
372
- closable: {
373
- type: Boolean,
374
- default: true
375
- },
376
- closeOnOverlay: {
377
- type: Boolean,
378
- default: false
379
- },
380
- closeOnEscape: {
381
- type: Boolean,
382
- default: true
383
- }
384
- },
385
- emits: ["update:modelValue", "close"],
386
- setup(__props, { emit: __emit }) {
387
- /** Modal dialog with backdrop, focus trap, Escape-to-close, and configurable size/variant. */
388
- const props = __props;
389
- const emit = __emit;
390
- const containerRef = ref(null);
391
- let previouslyFocused = null;
392
- const FOCUSABLE_SELECTOR = [
393
- "a[href]",
394
- "button:not([disabled])",
395
- "input:not([disabled])",
396
- "select:not([disabled])",
397
- "textarea:not([disabled])",
398
- "[tabindex]:not([tabindex=\"-1\"])"
399
- ].join(", ");
400
- function getFocusableElements() {
401
- if (!containerRef.value) return [];
402
- return Array.from(containerRef.value.querySelectorAll(FOCUSABLE_SELECTOR));
403
- }
404
- function handleKeydown(event) {
405
- if (event.key === "Escape" && props.closeOnEscape && props.modelValue) {
406
- close();
407
- return;
408
- }
409
- if (event.key !== "Tab" || !containerRef.value) return;
410
- const focusable = getFocusableElements();
411
- if (focusable.length === 0) {
412
- event.preventDefault();
413
- return;
414
- }
415
- const first = focusable[0];
416
- const last = focusable[focusable.length - 1];
417
- if (event.shiftKey && document.activeElement === first) {
418
- event.preventDefault();
419
- last.focus();
420
- } else if (!event.shiftKey && document.activeElement === last) {
421
- event.preventDefault();
422
- first.focus();
423
- }
424
- }
425
- function close() {
426
- if (props.closable) {
427
- emit("update:modelValue", false);
428
- emit("close");
429
- }
430
- }
431
- function handleOverlayClick(event) {
432
- if (props.closeOnOverlay && event.target === event.currentTarget) close();
433
- }
434
- watch(() => props.modelValue, async (isOpen) => {
435
- if (isOpen) {
436
- previouslyFocused = document.activeElement;
437
- document.body.style.overflow = "hidden";
438
- await nextTick();
439
- const focusable = getFocusableElements();
440
- if (focusable.length > 0) focusable[0].focus();
441
- else containerRef.value?.focus();
442
- } else {
443
- document.body.style.overflow = "";
444
- previouslyFocused?.focus();
445
- previouslyFocused = null;
446
- }
447
- });
448
- useEventListener(() => document, "keydown", handleKeydown);
449
- onUnmounted(() => {
450
- document.body.style.overflow = "";
451
- });
452
- return (_ctx, _cache) => {
453
- return openBlock(), createBlock(Teleport, { to: "body" }, [createVNode(Transition, { name: `modal-${__props.variant}` }, {
454
- default: withCtx(() => [__props.modelValue ? (openBlock(), createElementBlock("div", {
455
- key: 0,
456
- class: normalizeClass(["mint-modal", `mint-modal--${__props.variant}`]),
457
- onClick: handleOverlayClick
458
- }, [_cache[1] || (_cache[1] = createElementVNode("div", { class: "mint-modal__overlay" }, null, -1)), createElementVNode("div", {
459
- ref_key: "containerRef",
460
- ref: containerRef,
461
- class: normalizeClass([
462
- "mint-modal__container",
463
- `mint-modal__container--${__props.size}`,
464
- `mint-modal__container--${__props.variant}`
465
- ]),
466
- role: "dialog",
467
- "aria-modal": "true",
468
- tabindex: "-1"
469
- }, [
470
- __props.variant === "sheet" ? (openBlock(), createElementBlock("div", _hoisted_1$74)) : createCommentVNode("", true),
471
- __props.title || __props.subtitle || __props.closable || _ctx.$slots.header ? (openBlock(), createElementBlock("div", _hoisted_2$65, [__props.title || __props.subtitle || _ctx.$slots.header ? (openBlock(), createElementBlock("div", _hoisted_3$59, [renderSlot(_ctx.$slots, "header", {}, () => [__props.title ? (openBlock(), createElementBlock("h3", _hoisted_4$55, toDisplayString(__props.title), 1)) : createCommentVNode("", true), __props.subtitle ? (openBlock(), createElementBlock("p", _hoisted_5$53, toDisplayString(__props.subtitle), 1)) : createCommentVNode("", true)])])) : createCommentVNode("", true), __props.closable ? (openBlock(), createElementBlock("button", {
472
- key: 1,
473
- type: "button",
474
- class: "mint-modal__close",
475
- "aria-label": "Close modal",
476
- onClick: close
477
- }, [..._cache[0] || (_cache[0] = [createElementVNode("svg", {
478
- class: "mint-modal__close-icon",
479
- fill: "none",
480
- stroke: "currentColor",
481
- "stroke-width": "2",
482
- "stroke-linecap": "round",
483
- "stroke-linejoin": "round",
484
- viewBox: "0 0 24 24"
485
- }, [createElementVNode("path", { d: "M18 6 6 18" }), createElementVNode("path", { d: "m6 6 12 12" })], -1)])])) : createCommentVNode("", true)])) : createCommentVNode("", true),
486
- createElementVNode("div", _hoisted_6$52, [renderSlot(_ctx.$slots, "default")]),
487
- _ctx.$slots.footer ? (openBlock(), createElementBlock("div", _hoisted_7$46, [renderSlot(_ctx.$slots, "footer")])) : createCommentVNode("", true)
488
- ], 2)], 2)) : createCommentVNode("", true)]),
489
- _: 3
490
- }, 8, ["name"])]);
491
- };
492
- }
493
- });
494
- //#endregion
495
266
  //#region src/components/SegmentedControl.vue?vue&type=script&setup=true&lang.ts
496
- var _hoisted_1$73 = [
267
+ var _hoisted_1$65 = [
497
268
  "aria-checked",
498
269
  "disabled",
499
270
  "onClick",
500
271
  "onKeydown"
501
272
  ];
502
- var _hoisted_2$64 = { class: "mint-segmented-control__label" };
503
- var _hoisted_3$58 = {
273
+ var _hoisted_2$57 = { class: "mint-segmented-control__label" };
274
+ var _hoisted_3$52 = {
504
275
  key: 0,
505
276
  class: "mint-segmented-control__description"
506
277
  };
@@ -572,107 +343,35 @@ var SegmentedControl_default = /* @__PURE__ */ defineComponent({
572
343
  ]),
573
344
  onClick: ($event) => handleSelect(option),
574
345
  onKeydown: ($event) => handleKeydown($event, option)
575
- }, [createElementVNode("span", _hoisted_2$64, toDisplayString(option.label), 1), option.description && __props.variant === "card" ? (openBlock(), createElementBlock("span", _hoisted_3$58, toDisplayString(option.description), 1)) : createCommentVNode("", true)], 42, _hoisted_1$73);
346
+ }, [createElementVNode("span", _hoisted_2$57, toDisplayString(option.label), 1), option.description && __props.variant === "card" ? (openBlock(), createElementBlock("span", _hoisted_3$52, toDisplayString(option.description), 1)) : createCommentVNode("", true)], 42, _hoisted_1$65);
576
347
  }), 128))], 2);
577
348
  };
578
349
  }
579
350
  });
580
351
  //#endregion
581
- //#region src/components/BasePill.vue?vue&type=script&setup=true&lang.ts
582
- var _hoisted_1$72 = {
583
- key: 0,
584
- class: "mint-pill__icon"
585
- };
586
- var _hoisted_2$63 = { class: "mint-pill__label" };
587
- //#endregion
588
- //#region src/components/BasePill.vue
589
- var BasePill_default = /* @__PURE__ */ defineComponent({
590
- __name: "BasePill",
591
- props: {
592
- variant: { default: "default" },
593
- color: { default: void 0 },
594
- size: { default: "md" },
595
- removable: {
596
- type: Boolean,
597
- default: false
598
- },
599
- disabled: {
600
- type: Boolean,
601
- default: false
602
- },
603
- icon: {
604
- type: Boolean,
605
- default: false
606
- }
607
- },
608
- emits: ["remove"],
609
- setup(__props, { emit: __emit }) {
610
- /** Compact label for tags, status indicators, and badges; supports removable and icon slots. */
611
- const props = __props;
612
- /**
613
- * @event remove - Emitted when the remove button is clicked
614
- */
615
- const emit = __emit;
616
- function handleRemove(event) {
617
- event.stopPropagation();
618
- if (!props.disabled) emit("remove");
619
- }
620
- return (_ctx, _cache) => {
621
- return openBlock(), createElementBlock("span", { class: normalizeClass([
622
- "mint-pill",
623
- `mint-pill--${__props.variant}`,
624
- __props.color && `mint-pill--${__props.color}`,
625
- `mint-pill--${__props.size}`,
626
- {
627
- "mint-pill--disabled": __props.disabled,
628
- "mint-pill--with-icon": __props.icon
629
- }
630
- ]) }, [
631
- __props.icon ? (openBlock(), createElementBlock("span", _hoisted_1$72, [renderSlot(_ctx.$slots, "icon")])) : createCommentVNode("", true),
632
- createElementVNode("span", _hoisted_2$63, [renderSlot(_ctx.$slots, "default")]),
633
- __props.removable && !__props.disabled ? (openBlock(), createElementBlock("button", {
634
- key: 1,
635
- type: "button",
636
- class: "mint-pill__remove",
637
- "aria-label": "Remove",
638
- onClick: handleRemove
639
- }, [..._cache[0] || (_cache[0] = [createElementVNode("svg", {
640
- class: "mint-pill__remove-icon",
641
- fill: "none",
642
- stroke: "currentColor",
643
- "stroke-width": "2",
644
- "stroke-linecap": "round",
645
- "stroke-linejoin": "round",
646
- viewBox: "0 0 24 24"
647
- }, [createElementVNode("path", { d: "M18 6 6 18" }), createElementVNode("path", { d: "m6 6 12 12" })], -1)])])) : createCommentVNode("", true)
648
- ], 2);
649
- };
650
- }
651
- });
652
- //#endregion
653
352
  //#region src/components/DropdownButton.vue?vue&type=script&setup=true&lang.ts
654
- var _hoisted_1$71 = ["disabled", "aria-expanded"];
655
- var _hoisted_2$62 = {
353
+ var _hoisted_1$64 = ["disabled", "aria-expanded"];
354
+ var _hoisted_2$56 = {
656
355
  key: 0,
657
356
  class: "mint-dropdown-button__spinner",
658
357
  viewBox: "0 0 24 24",
659
358
  fill: "none",
660
359
  "aria-hidden": "true"
661
360
  };
662
- var _hoisted_3$57 = { class: "mint-dropdown-button__label" };
663
- var _hoisted_4$54 = ["aria-activedescendant"];
664
- var _hoisted_5$52 = [
361
+ var _hoisted_3$51 = { class: "mint-dropdown-button__label" };
362
+ var _hoisted_4$49 = ["aria-activedescendant"];
363
+ var _hoisted_5$47 = [
665
364
  "id",
666
365
  "aria-selected",
667
366
  "aria-disabled",
668
367
  "onClick"
669
368
  ];
670
- var _hoisted_6$51 = { class: "mint-dropdown-button__option-label" };
671
- var _hoisted_7$45 = {
369
+ var _hoisted_6$46 = { class: "mint-dropdown-button__option-label" };
370
+ var _hoisted_7$42 = {
672
371
  key: 0,
673
372
  class: "mint-dropdown-button__option-description"
674
373
  };
675
- var _hoisted_8$41 = {
374
+ var _hoisted_8$39 = {
676
375
  key: 1,
677
376
  class: "mint-dropdown-button__option-check",
678
377
  viewBox: "0 0 24 24",
@@ -747,7 +446,7 @@ var DropdownButton_default = /* @__PURE__ */ defineComponent({
747
446
  "aria-haspopup": "listbox",
748
447
  onClick: toggle
749
448
  }, [
750
- __props.loading ? (openBlock(), createElementBlock("svg", _hoisted_2$62, [..._cache[0] || (_cache[0] = [createElementVNode("circle", {
449
+ __props.loading ? (openBlock(), createElementBlock("svg", _hoisted_2$56, [..._cache[0] || (_cache[0] = [createElementVNode("circle", {
751
450
  cx: "12",
752
451
  cy: "12",
753
452
  r: "10",
@@ -760,7 +459,7 @@ var DropdownButton_default = /* @__PURE__ */ defineComponent({
760
459
  "stroke-width": "3",
761
460
  "stroke-linecap": "round"
762
461
  }, null, -1)])])) : createCommentVNode("", true),
763
- createElementVNode("span", _hoisted_3$57, toDisplayString(selectedLabel.value), 1),
462
+ createElementVNode("span", _hoisted_3$51, toDisplayString(selectedLabel.value), 1),
764
463
  (openBlock(), createElementBlock("svg", {
765
464
  class: normalizeClass(["mint-dropdown-button__chevron", { "mint-dropdown-button__chevron--open": unref(isOpen) }]),
766
465
  viewBox: "0 0 24 24",
@@ -770,7 +469,7 @@ var DropdownButton_default = /* @__PURE__ */ defineComponent({
770
469
  "stroke-linecap": "round",
771
470
  "stroke-linejoin": "round"
772
471
  }, [..._cache[1] || (_cache[1] = [createElementVNode("path", { d: "m6 9 6 6 6-6" }, null, -1)])], 2))
773
- ], 10, _hoisted_1$71), createVNode(Transition, { name: "mint-dropdown-button-menu" }, {
472
+ ], 10, _hoisted_1$64), createVNode(Transition, { name: "mint-dropdown-button-menu" }, {
774
473
  default: withCtx(() => [unref(isOpen) ? (openBlock(), createElementBlock("ul", {
775
474
  key: 0,
776
475
  class: "mint-dropdown-button__menu",
@@ -789,11 +488,11 @@ var DropdownButton_default = /* @__PURE__ */ defineComponent({
789
488
  }]),
790
489
  onClick: ($event) => selectOption(option)
791
490
  }, [
792
- createElementVNode("span", _hoisted_6$51, toDisplayString(option.label), 1),
793
- option.description ? (openBlock(), createElementBlock("span", _hoisted_7$45, toDisplayString(option.description), 1)) : createCommentVNode("", true),
794
- option.value === __props.modelValue ? (openBlock(), createElementBlock("svg", _hoisted_8$41, [..._cache[2] || (_cache[2] = [createElementVNode("path", { d: "M20 6 9 17l-5-5" }, null, -1)])])) : createCommentVNode("", true)
795
- ], 10, _hoisted_5$52);
796
- }), 128))], 8, _hoisted_4$54)) : createCommentVNode("", true)]),
491
+ createElementVNode("span", _hoisted_6$46, toDisplayString(option.label), 1),
492
+ option.description ? (openBlock(), createElementBlock("span", _hoisted_7$42, toDisplayString(option.description), 1)) : createCommentVNode("", true),
493
+ option.value === __props.modelValue ? (openBlock(), createElementBlock("svg", _hoisted_8$39, [..._cache[2] || (_cache[2] = [createElementVNode("path", { d: "M20 6 9 17l-5-5" }, null, -1)])])) : createCommentVNode("", true)
494
+ ], 10, _hoisted_5$47);
495
+ }), 128))], 8, _hoisted_4$49)) : createCommentVNode("", true)]),
797
496
  _: 1
798
497
  })], 512);
799
498
  };
@@ -801,25 +500,25 @@ var DropdownButton_default = /* @__PURE__ */ defineComponent({
801
500
  });
802
501
  //#endregion
803
502
  //#region src/components/Calendar.vue?vue&type=script&setup=true&lang.ts
804
- var _hoisted_1$70 = { class: "mint-calendar" };
805
- var _hoisted_2$61 = {
503
+ var _hoisted_1$63 = { class: "mint-calendar" };
504
+ var _hoisted_2$55 = {
806
505
  key: 0,
807
506
  class: "mint-calendar__header"
808
507
  };
809
- var _hoisted_3$56 = { class: "mint-calendar__title" };
810
- var _hoisted_4$53 = { class: "mint-calendar__weekdays" };
811
- var _hoisted_5$51 = { class: "mint-calendar__grid" };
812
- var _hoisted_6$50 = [
508
+ var _hoisted_3$50 = { class: "mint-calendar__title" };
509
+ var _hoisted_4$48 = { class: "mint-calendar__weekdays" };
510
+ var _hoisted_5$46 = { class: "mint-calendar__grid" };
511
+ var _hoisted_6$45 = [
813
512
  "disabled",
814
513
  "onClick",
815
514
  "onMouseenter"
816
515
  ];
817
- var _hoisted_7$44 = { class: "mint-calendar__day-number" };
818
- var _hoisted_8$40 = {
516
+ var _hoisted_7$41 = { class: "mint-calendar__day-number" };
517
+ var _hoisted_8$38 = {
819
518
  key: 0,
820
519
  class: "mint-calendar__markers"
821
520
  };
822
- var _hoisted_9$36 = ["title"];
521
+ var _hoisted_9$34 = ["title"];
823
522
  //#endregion
824
523
  //#region src/components/Calendar.vue
825
524
  var Calendar_default = /* @__PURE__ */ defineComponent({
@@ -1035,8 +734,8 @@ var Calendar_default = /* @__PURE__ */ defineComponent({
1035
734
  emit("navigate", "next", currentMonth.value, currentYear.value);
1036
735
  }
1037
736
  return (_ctx, _cache) => {
1038
- return openBlock(), createElementBlock("div", _hoisted_1$70, [
1039
- __props.showNavigation ? (openBlock(), createElementBlock("div", _hoisted_2$61, [
737
+ return openBlock(), createElementBlock("div", _hoisted_1$63, [
738
+ __props.showNavigation ? (openBlock(), createElementBlock("div", _hoisted_2$55, [
1040
739
  createElementVNode("button", {
1041
740
  type: "button",
1042
741
  class: "mint-calendar__nav-btn",
@@ -1055,7 +754,7 @@ var Calendar_default = /* @__PURE__ */ defineComponent({
1055
754
  year: currentYear.value,
1056
755
  prevMonth,
1057
756
  nextMonth
1058
- }, () => [createElementVNode("span", _hoisted_3$56, toDisplayString(monthLabel.value), 1)]),
757
+ }, () => [createElementVNode("span", _hoisted_3$50, toDisplayString(monthLabel.value), 1)]),
1059
758
  createElementVNode("button", {
1060
759
  type: "button",
1061
760
  class: "mint-calendar__nav-btn",
@@ -1070,7 +769,7 @@ var Calendar_default = /* @__PURE__ */ defineComponent({
1070
769
  "stroke-linejoin": "round"
1071
770
  }, [createElementVNode("path", { d: "m9 18 6-6-6-6" })], -1)])])
1072
771
  ])) : createCommentVNode("", true),
1073
- createElementVNode("div", _hoisted_4$53, [(openBlock(true), createElementBlock(Fragment, null, renderList(weekDayLabels.value, (label, i) => {
772
+ createElementVNode("div", _hoisted_4$48, [(openBlock(true), createElementBlock(Fragment, null, renderList(weekDayLabels.value, (label, i) => {
1074
773
  return openBlock(), createElementBlock("span", {
1075
774
  key: i,
1076
775
  class: "mint-calendar__weekday"
@@ -1079,7 +778,7 @@ var Calendar_default = /* @__PURE__ */ defineComponent({
1079
778
  index: i
1080
779
  }, () => [createTextVNode(toDisplayString(label), 1)])]);
1081
780
  }), 128))]),
1082
- createElementVNode("div", _hoisted_5$51, [(openBlock(true), createElementBlock(Fragment, null, renderList(calendarDays.value, (day, i) => {
781
+ createElementVNode("div", _hoisted_5$46, [(openBlock(true), createElementBlock(Fragment, null, renderList(calendarDays.value, (day, i) => {
1083
782
  return openBlock(), createElementBlock("button", {
1084
783
  key: i,
1085
784
  type: "button",
@@ -1094,14 +793,14 @@ var Calendar_default = /* @__PURE__ */ defineComponent({
1094
793
  }]),
1095
794
  onClick: ($event) => handleDayClick(day),
1096
795
  onMouseenter: ($event) => handleDayHover(day)
1097
- }, [renderSlot(_ctx.$slots, "day-content", { day }, () => [createElementVNode("span", _hoisted_7$44, toDisplayString(day.dayOfMonth), 1), day.markers.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_8$40, [(openBlock(true), createElementBlock(Fragment, null, renderList(day.markers.slice(0, 3), (marker, mi) => {
796
+ }, [renderSlot(_ctx.$slots, "day-content", { day }, () => [createElementVNode("span", _hoisted_7$41, toDisplayString(day.dayOfMonth), 1), day.markers.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_8$38, [(openBlock(true), createElementBlock(Fragment, null, renderList(day.markers.slice(0, 3), (marker, mi) => {
1098
797
  return openBlock(), createElementBlock("span", {
1099
798
  key: mi,
1100
799
  class: normalizeClass(["mint-calendar__marker", `mint-calendar__marker--${marker.type ?? "dot"}`]),
1101
800
  style: normalizeStyle(marker.color ? { "--marker-color": marker.color } : {}),
1102
801
  title: marker.label
1103
- }, null, 14, _hoisted_9$36);
1104
- }), 128))])) : createCommentVNode("", true)])], 42, _hoisted_6$50);
802
+ }, null, 14, _hoisted_9$34);
803
+ }), 128))])) : createCommentVNode("", true)])], 42, _hoisted_6$45);
1105
804
  }), 128))])
1106
805
  ]);
1107
806
  };
@@ -1109,45 +808,50 @@ var Calendar_default = /* @__PURE__ */ defineComponent({
1109
808
  });
1110
809
  //#endregion
1111
810
  //#region src/components/DataFrame.vue?vue&type=script&setup=true&lang.ts
1112
- var _hoisted_1$69 = {
811
+ var _hoisted_1$62 = {
1113
812
  key: 0,
1114
813
  class: "mint-dataframe__header"
1115
814
  };
1116
- var _hoisted_2$60 = { class: "mint-dataframe__search-wrapper" };
1117
- var _hoisted_3$55 = ["placeholder"];
1118
- var _hoisted_4$52 = { class: "mint-dataframe__table" };
1119
- var _hoisted_5$50 = {
815
+ var _hoisted_2$54 = { class: "mint-dataframe__search-wrapper" };
816
+ var _hoisted_3$49 = ["placeholder"];
817
+ var _hoisted_4$47 = { class: "mint-dataframe__table" };
818
+ var _hoisted_5$45 = {
1120
819
  key: 0,
1121
820
  class: "mint-dataframe__th mint-dataframe__th--checkbox"
1122
821
  };
1123
- var _hoisted_6$49 = ["checked", "indeterminate"];
1124
- var _hoisted_7$43 = ["onClick"];
1125
- var _hoisted_8$39 = { class: "mint-dataframe__th-content" };
1126
- var _hoisted_9$35 = ["onClick"];
1127
- var _hoisted_10$32 = {
822
+ var _hoisted_6$44 = ["checked", "indeterminate"];
823
+ var _hoisted_7$40 = ["onClick"];
824
+ var _hoisted_8$37 = { class: "mint-dataframe__th-content" };
825
+ var _hoisted_9$33 = [
826
+ "tabindex",
827
+ "role",
828
+ "onClick",
829
+ "onKeydown"
830
+ ];
831
+ var _hoisted_10$29 = {
1128
832
  key: 0,
1129
833
  class: "mint-dataframe__td mint-dataframe__td--checkbox"
1130
834
  };
1131
- var _hoisted_11$30 = ["checked", "onChange"];
1132
- var _hoisted_12$27 = ["onClick"];
1133
- var _hoisted_13$26 = {
835
+ var _hoisted_11$27 = ["checked", "onChange"];
836
+ var _hoisted_12$24 = ["onClick"];
837
+ var _hoisted_13$23 = {
1134
838
  key: 0,
1135
839
  class: "mint-dataframe__empty"
1136
840
  };
1137
- var _hoisted_14$23 = { class: "mint-dataframe__empty-text" };
1138
- var _hoisted_15$22 = {
841
+ var _hoisted_14$20 = { class: "mint-dataframe__empty-text" };
842
+ var _hoisted_15$19 = {
1139
843
  key: 1,
1140
844
  class: "mint-dataframe__loading"
1141
845
  };
1142
- var _hoisted_16$20 = {
846
+ var _hoisted_16$17 = {
1143
847
  key: 1,
1144
848
  class: "mint-dataframe__footer"
1145
849
  };
1146
- var _hoisted_17$20 = { class: "mint-dataframe__page-info" };
1147
- var _hoisted_18$18 = { class: "mint-dataframe__page-controls" };
1148
- var _hoisted_19$17 = ["disabled"];
1149
- var _hoisted_20$15 = { class: "mint-dataframe__page-number" };
1150
- var _hoisted_21$13 = ["disabled"];
850
+ var _hoisted_17$17 = { class: "mint-dataframe__page-info" };
851
+ var _hoisted_18$15 = { class: "mint-dataframe__page-controls" };
852
+ var _hoisted_19$14 = ["disabled"];
853
+ var _hoisted_20$13 = { class: "mint-dataframe__page-number" };
854
+ var _hoisted_21$11 = ["disabled"];
1151
855
  //#endregion
1152
856
  //#region src/components/DataFrame.vue
1153
857
  var DataFrame_default = /* @__PURE__ */ defineComponent({
@@ -1194,7 +898,11 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1194
898
  type: Boolean,
1195
899
  default: false
1196
900
  },
1197
- selectedKeys: { default: () => [] }
901
+ selectedKeys: { default: () => [] },
902
+ clickableRows: {
903
+ type: Boolean,
904
+ default: false
905
+ }
1198
906
  },
1199
907
  emits: [
1200
908
  "update:sort",
@@ -1287,6 +995,19 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1287
995
  page
1288
996
  });
1289
997
  }
998
+ function handleRowClick(row, index) {
999
+ emit("row-click", row, index);
1000
+ }
1001
+ function handleRowKeydown(event, row, index) {
1002
+ if (!props.clickableRows) return;
1003
+ if (event.key !== "Enter" && event.key !== " ") return;
1004
+ event.preventDefault();
1005
+ handleRowClick(row, index);
1006
+ }
1007
+ function handleCellClick(row, col, index) {
1008
+ emit("cell-click", getCellValue(row, col.key), col, row);
1009
+ if (props.clickableRows) handleRowClick(row, index);
1010
+ }
1290
1011
  function isColumnSortable(col) {
1291
1012
  return col.sortable === true || props.sortable && col.sortable !== false;
1292
1013
  }
@@ -1316,7 +1037,7 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1316
1037
  });
1317
1038
  return (_ctx, _cache) => {
1318
1039
  return openBlock(), createElementBlock("div", { class: normalizeClass(["mint-dataframe", { "mint-dataframe--bordered": __props.bordered }]) }, [
1319
- __props.searchable ? (openBlock(), createElementBlock("div", _hoisted_1$69, [createElementVNode("div", _hoisted_2$60, [_cache[4] || (_cache[4] = createElementVNode("svg", {
1040
+ __props.searchable ? (openBlock(), createElementBlock("div", _hoisted_1$62, [createElementVNode("div", _hoisted_2$54, [_cache[4] || (_cache[4] = createElementVNode("svg", {
1320
1041
  class: "mint-dataframe__search-icon",
1321
1042
  viewBox: "0 0 24 24",
1322
1043
  fill: "none",
@@ -1333,18 +1054,18 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1333
1054
  type: "text",
1334
1055
  class: "mint-dataframe__search",
1335
1056
  placeholder: __props.searchPlaceholder
1336
- }, null, 8, _hoisted_3$55), [[vModelText, searchQuery.value]])])])) : createCommentVNode("", true),
1057
+ }, null, 8, _hoisted_3$49), [[vModelText, searchQuery.value]])])])) : createCommentVNode("", true),
1337
1058
  createElementVNode("div", {
1338
1059
  class: "mint-dataframe__table-wrapper",
1339
1060
  style: normalizeStyle(wrapperStyle.value)
1340
1061
  }, [
1341
- createElementVNode("table", _hoisted_4$52, [createElementVNode("thead", { class: normalizeClass(["mint-dataframe__thead", { "mint-dataframe__thead--sticky": __props.stickyHeader }]) }, [createElementVNode("tr", null, [__props.selectable ? (openBlock(), createElementBlock("th", _hoisted_5$50, [createElementVNode("input", {
1062
+ createElementVNode("table", _hoisted_4$47, [createElementVNode("thead", { class: normalizeClass(["mint-dataframe__thead", { "mint-dataframe__thead--sticky": __props.stickyHeader }]) }, [createElementVNode("tr", null, [__props.selectable ? (openBlock(), createElementBlock("th", _hoisted_5$45, [createElementVNode("input", {
1342
1063
  type: "checkbox",
1343
1064
  checked: allSelected.value,
1344
1065
  indeterminate: selectIndeterminate.value,
1345
1066
  class: "mint-dataframe__checkbox",
1346
1067
  onChange: toggleSelectAll
1347
- }, null, 40, _hoisted_6$49)])) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (col) => {
1068
+ }, null, 40, _hoisted_6$44)])) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (col) => {
1348
1069
  return openBlock(), createElementBlock("th", {
1349
1070
  key: col.key,
1350
1071
  class: normalizeClass([
@@ -1361,7 +1082,7 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1361
1082
  minWidth: col.minWidth ? typeof col.minWidth === "number" ? `${col.minWidth}px` : col.minWidth : void 0
1362
1083
  }),
1363
1084
  onClick: ($event) => isColumnSortable(col) ? handleSort(col) : void 0
1364
- }, [renderSlot(_ctx.$slots, `header-${col.key}`, { column: col }, () => [createElementVNode("div", _hoisted_8$39, [createElementVNode("span", null, toDisplayString(col.label), 1), isColumnSortable(col) ? (openBlock(), createElementBlock("svg", {
1085
+ }, [renderSlot(_ctx.$slots, `header-${col.key}`, { column: col }, () => [createElementVNode("div", _hoisted_8$37, [createElementVNode("span", null, toDisplayString(col.label), 1), isColumnSortable(col) ? (openBlock(), createElementBlock("svg", {
1365
1086
  key: 0,
1366
1087
  class: normalizeClass(["mint-dataframe__sort-icon", {
1367
1088
  "mint-dataframe__sort-icon--asc": activeSort.value?.key === col.key && activeSort.value?.direction === "asc",
@@ -1378,22 +1099,26 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1378
1099
  createElementVNode("path", { d: "M17 20V4" }, null, -1),
1379
1100
  createElementVNode("path", { d: "m3 8 4-4 4 4" }, null, -1),
1380
1101
  createElementVNode("path", { d: "M7 4v16" }, null, -1)
1381
- ])], 2)) : createCommentVNode("", true)])])], 14, _hoisted_7$43);
1102
+ ])], 2)) : createCommentVNode("", true)])])], 14, _hoisted_7$40);
1382
1103
  }), 128))])], 2), createElementVNode("tbody", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(paginatedData.value, (row, rowIndex) => {
1383
1104
  return openBlock(), createElementBlock("tr", {
1384
1105
  key: getRowKey(row, rowIndex),
1385
1106
  class: normalizeClass(["mint-dataframe__row", {
1386
1107
  "mint-dataframe__row--striped": __props.striped && rowIndex % 2 === 1,
1387
- "mint-dataframe__row--selected": unref(rowSelection).isSelected(getRowKey(row, rowIndex))
1108
+ "mint-dataframe__row--selected": unref(rowSelection).isSelected(getRowKey(row, rowIndex)),
1109
+ "mint-dataframe__row--clickable": __props.clickableRows
1388
1110
  }]),
1389
- onClick: ($event) => emit("row-click", row, rowIndex)
1390
- }, [__props.selectable ? (openBlock(), createElementBlock("td", _hoisted_10$32, [createElementVNode("input", {
1111
+ tabindex: __props.clickableRows ? 0 : void 0,
1112
+ role: __props.clickableRows ? "button" : void 0,
1113
+ onClick: ($event) => handleRowClick(row, rowIndex),
1114
+ onKeydown: ($event) => handleRowKeydown($event, row, rowIndex)
1115
+ }, [__props.selectable ? (openBlock(), createElementBlock("td", _hoisted_10$29, [createElementVNode("input", {
1391
1116
  type: "checkbox",
1392
1117
  checked: unref(rowSelection).isSelected(getRowKey(row, rowIndex)),
1393
1118
  class: "mint-dataframe__checkbox",
1394
1119
  onClick: _cache[1] || (_cache[1] = withModifiers(() => {}, ["stop"])),
1395
1120
  onChange: ($event) => toggleRowSelect(getRowKey(row, rowIndex))
1396
- }, null, 40, _hoisted_11$30)])) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (col) => {
1121
+ }, null, 40, _hoisted_11$27)])) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (col) => {
1397
1122
  return openBlock(), createElementBlock("td", {
1398
1123
  key: col.key,
1399
1124
  class: normalizeClass([
@@ -1402,16 +1127,16 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1402
1127
  `mint-dataframe__td--align-${col.align ?? "left"}`,
1403
1128
  { "mint-dataframe__td--ellipsis": col.ellipsis }
1404
1129
  ]),
1405
- onClick: withModifiers(($event) => emit("cell-click", getCellValue(row, col.key), col, row), ["stop"])
1130
+ onClick: withModifiers(($event) => handleCellClick(row, col, rowIndex), ["stop"])
1406
1131
  }, [renderSlot(_ctx.$slots, `cell-${col.key}`, {
1407
1132
  value: getCellValue(row, col.key),
1408
1133
  row,
1409
1134
  column: col,
1410
1135
  index: rowIndex
1411
- }, () => [createTextVNode(toDisplayString(formatCell(col, row, rowIndex)), 1)])], 10, _hoisted_12$27);
1412
- }), 128))], 10, _hoisted_9$35);
1136
+ }, () => [createTextVNode(toDisplayString(formatCell(col, row, rowIndex)), 1)])], 10, _hoisted_12$24);
1137
+ }), 128))], 42, _hoisted_9$33);
1413
1138
  }), 128))])]),
1414
- paginatedData.value.length === 0 && !__props.loading ? (openBlock(), createElementBlock("div", _hoisted_13$26, [renderSlot(_ctx.$slots, "empty", {}, () => [_cache[6] || (_cache[6] = createElementVNode("svg", {
1139
+ paginatedData.value.length === 0 && !__props.loading ? (openBlock(), createElementBlock("div", _hoisted_13$23, [renderSlot(_ctx.$slots, "empty", {}, () => [_cache[6] || (_cache[6] = createElementVNode("svg", {
1415
1140
  class: "mint-dataframe__empty-icon",
1416
1141
  viewBox: "0 0 24 24",
1417
1142
  fill: "none",
@@ -1419,8 +1144,8 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1419
1144
  "stroke-width": "2",
1420
1145
  "stroke-linecap": "round",
1421
1146
  "stroke-linejoin": "round"
1422
- }, [createElementVNode("polyline", { points: "22 12 16 12 14 15 10 15 8 12 2 12" }), createElementVNode("path", { d: "M5.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" })], -1)), createElementVNode("p", _hoisted_14$23, toDisplayString(__props.emptyText), 1)])])) : createCommentVNode("", true),
1423
- __props.loading ? (openBlock(), createElementBlock("div", _hoisted_15$22, [renderSlot(_ctx.$slots, "loading", {}, () => [_cache[7] || (_cache[7] = createElementVNode("svg", {
1147
+ }, [createElementVNode("polyline", { points: "22 12 16 12 14 15 10 15 8 12 2 12" }), createElementVNode("path", { d: "M5.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" })], -1)), createElementVNode("p", _hoisted_14$20, toDisplayString(__props.emptyText), 1)])])) : createCommentVNode("", true),
1148
+ __props.loading ? (openBlock(), createElementBlock("div", _hoisted_15$19, [renderSlot(_ctx.$slots, "loading", {}, () => [_cache[7] || (_cache[7] = createElementVNode("svg", {
1424
1149
  class: "mint-dataframe__loading-spinner",
1425
1150
  viewBox: "0 0 24 24",
1426
1151
  fill: "none",
@@ -1439,7 +1164,7 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1439
1164
  "stroke-linecap": "round"
1440
1165
  })], -1))])])) : createCommentVNode("", true)
1441
1166
  ], 4),
1442
- __props.pagination ? (openBlock(), createElementBlock("div", _hoisted_16$20, [renderSlot(_ctx.$slots, "footer", {}, () => [createElementVNode("span", _hoisted_17$20, 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_18$18, [
1167
+ __props.pagination ? (openBlock(), createElementBlock("div", _hoisted_16$17, [renderSlot(_ctx.$slots, "footer", {}, () => [createElementVNode("span", _hoisted_17$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_18$15, [
1443
1168
  createElementVNode("button", {
1444
1169
  type: "button",
1445
1170
  class: "mint-dataframe__page-btn",
@@ -1452,8 +1177,8 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1452
1177
  "stroke-width": "2",
1453
1178
  "stroke-linecap": "round",
1454
1179
  "stroke-linejoin": "round"
1455
- }, [createElementVNode("path", { d: "m15 18-6-6 6-6" })], -1)])], 8, _hoisted_19$17),
1456
- createElementVNode("span", _hoisted_20$15, toDisplayString(__props.pagination.page) + " / " + toDisplayString(totalPages.value), 1),
1180
+ }, [createElementVNode("path", { d: "m15 18-6-6 6-6" })], -1)])], 8, _hoisted_19$14),
1181
+ createElementVNode("span", _hoisted_20$13, toDisplayString(__props.pagination.page) + " / " + toDisplayString(totalPages.value), 1),
1457
1182
  createElementVNode("button", {
1458
1183
  type: "button",
1459
1184
  class: "mint-dataframe__page-btn",
@@ -1466,74 +1191,15 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1466
1191
  "stroke-width": "2",
1467
1192
  "stroke-linecap": "round",
1468
1193
  "stroke-linejoin": "round"
1469
- }, [createElementVNode("path", { d: "m9 18 6-6-6-6" })], -1)])], 8, _hoisted_21$13)
1194
+ }, [createElementVNode("path", { d: "m9 18 6-6-6-6" })], -1)])], 8, _hoisted_21$11)
1470
1195
  ])])])) : createCommentVNode("", true)
1471
1196
  ], 2);
1472
1197
  };
1473
1198
  }
1474
1199
  });
1475
1200
  //#endregion
1476
- //#region src/components/FormField.vue?vue&type=script&setup=true&lang.ts
1477
- var _hoisted_1$68 = { class: "mint-form-field" };
1478
- var _hoisted_2$59 = {
1479
- key: 0,
1480
- class: "mint-form-field__label-row"
1481
- };
1482
- var _hoisted_3$54 = ["for"];
1483
- var _hoisted_4$51 = {
1484
- key: 0,
1485
- class: "mint-form-field__required",
1486
- "aria-hidden": "true"
1487
- };
1488
- var _hoisted_5$49 = {
1489
- key: 0,
1490
- class: "mint-form-field__optional"
1491
- };
1492
- var _hoisted_6$48 = ["id"];
1493
- var _hoisted_7$42 = ["id"];
1494
- //#endregion
1495
- //#region src/components/FormField.vue
1496
- var FormField_default = /* @__PURE__ */ defineComponent({
1497
- __name: "FormField",
1498
- props: {
1499
- label: {},
1500
- error: {},
1501
- hint: {},
1502
- required: { type: Boolean },
1503
- showOptional: { type: Boolean },
1504
- htmlFor: {},
1505
- fieldId: {}
1506
- },
1507
- setup(__props) {
1508
- /** Wraps a form control with a label, optional hint text, and validation error display. */
1509
- const props = __props;
1510
- const errorId = computed(() => props.error && props.fieldId ? `${props.fieldId}-error` : void 0);
1511
- const hintId = computed(() => !props.error && props.hint && props.fieldId ? `${props.fieldId}-hint` : void 0);
1512
- const describedBy = computed(() => errorId.value ?? hintId.value);
1513
- return (_ctx, _cache) => {
1514
- return openBlock(), createElementBlock("div", _hoisted_1$68, [
1515
- __props.label ? (openBlock(), createElementBlock("div", _hoisted_2$59, [createElementVNode("label", {
1516
- for: __props.htmlFor,
1517
- class: "mint-form-field__label"
1518
- }, [createTextVNode(toDisplayString(__props.label) + " ", 1), __props.required ? (openBlock(), createElementBlock("span", _hoisted_4$51, "*")) : createCommentVNode("", true)], 8, _hoisted_3$54), !__props.required && __props.showOptional ? (openBlock(), createElementBlock("span", _hoisted_5$49, " optional ")) : createCommentVNode("", true)])) : createCommentVNode("", true),
1519
- renderSlot(_ctx.$slots, "default", { describedBy: describedBy.value }),
1520
- __props.error ? (openBlock(), createElementBlock("p", {
1521
- key: 1,
1522
- id: errorId.value,
1523
- class: "mint-form-field__error",
1524
- role: "alert"
1525
- }, toDisplayString(__props.error), 9, _hoisted_6$48)) : __props.hint ? (openBlock(), createElementBlock("p", {
1526
- key: 2,
1527
- id: hintId.value,
1528
- class: "mint-form-field__hint"
1529
- }, toDisplayString(__props.hint), 9, _hoisted_7$42)) : createCommentVNode("", true)
1530
- ]);
1531
- };
1532
- }
1533
- });
1534
- //#endregion
1535
1201
  //#region src/components/AlertBox.vue?vue&type=script&setup=true&lang.ts
1536
- var _hoisted_1$67 = {
1202
+ var _hoisted_1$61 = {
1537
1203
  key: 0,
1538
1204
  class: "mint-alert__icon mint-alert__icon--success",
1539
1205
  viewBox: "0 0 24 24",
@@ -1543,7 +1209,7 @@ var _hoisted_1$67 = {
1543
1209
  "stroke-linecap": "round",
1544
1210
  "stroke-linejoin": "round"
1545
1211
  };
1546
- var _hoisted_2$58 = {
1212
+ var _hoisted_2$53 = {
1547
1213
  key: 1,
1548
1214
  class: "mint-alert__icon mint-alert__icon--error",
1549
1215
  viewBox: "0 0 24 24",
@@ -1553,7 +1219,7 @@ var _hoisted_2$58 = {
1553
1219
  "stroke-linecap": "round",
1554
1220
  "stroke-linejoin": "round"
1555
1221
  };
1556
- var _hoisted_3$53 = {
1222
+ var _hoisted_3$48 = {
1557
1223
  key: 2,
1558
1224
  class: "mint-alert__icon mint-alert__icon--warning",
1559
1225
  viewBox: "0 0 24 24",
@@ -1563,7 +1229,7 @@ var _hoisted_3$53 = {
1563
1229
  "stroke-linecap": "round",
1564
1230
  "stroke-linejoin": "round"
1565
1231
  };
1566
- var _hoisted_4$50 = {
1232
+ var _hoisted_4$46 = {
1567
1233
  key: 3,
1568
1234
  class: "mint-alert__icon mint-alert__icon--info",
1569
1235
  viewBox: "0 0 24 24",
@@ -1573,13 +1239,13 @@ var _hoisted_4$50 = {
1573
1239
  "stroke-linecap": "round",
1574
1240
  "stroke-linejoin": "round"
1575
1241
  };
1576
- var _hoisted_5$48 = { class: "mint-alert__content" };
1577
- var _hoisted_6$47 = {
1242
+ var _hoisted_5$44 = { class: "mint-alert__content" };
1243
+ var _hoisted_6$43 = {
1578
1244
  key: 0,
1579
1245
  class: "mint-alert__title"
1580
1246
  };
1581
- var _hoisted_7$41 = { class: "mint-alert__message" };
1582
- var _hoisted_8$38 = {
1247
+ var _hoisted_7$39 = { class: "mint-alert__message" };
1248
+ var _hoisted_8$36 = {
1583
1249
  key: 4,
1584
1250
  class: "mint-alert__actions"
1585
1251
  };
@@ -1608,11 +1274,11 @@ var AlertBox_default = /* @__PURE__ */ defineComponent({
1608
1274
  class: normalizeClass(["mint-alert", `mint-alert--${props.type}`]),
1609
1275
  role: "alert"
1610
1276
  }, [
1611
- props.type === "success" ? (openBlock(), createElementBlock("svg", _hoisted_1$67, [..._cache[2] || (_cache[2] = [createElementVNode("circle", {
1277
+ props.type === "success" ? (openBlock(), createElementBlock("svg", _hoisted_1$61, [..._cache[2] || (_cache[2] = [createElementVNode("circle", {
1612
1278
  cx: "12",
1613
1279
  cy: "12",
1614
1280
  r: "10"
1615
- }, null, -1), createElementVNode("path", { d: "m9 12 2 2 4-4" }, null, -1)])])) : props.type === "error" ? (openBlock(), createElementBlock("svg", _hoisted_2$58, [..._cache[3] || (_cache[3] = [
1281
+ }, null, -1), createElementVNode("path", { d: "m9 12 2 2 4-4" }, null, -1)])])) : props.type === "error" ? (openBlock(), createElementBlock("svg", _hoisted_2$53, [..._cache[3] || (_cache[3] = [
1616
1282
  createElementVNode("circle", {
1617
1283
  cx: "12",
1618
1284
  cy: "12",
@@ -1620,11 +1286,11 @@ var AlertBox_default = /* @__PURE__ */ defineComponent({
1620
1286
  }, null, -1),
1621
1287
  createElementVNode("path", { d: "m15 9-6 6" }, null, -1),
1622
1288
  createElementVNode("path", { d: "m9 9 6 6" }, null, -1)
1623
- ])])) : props.type === "warning" ? (openBlock(), createElementBlock("svg", _hoisted_3$53, [..._cache[4] || (_cache[4] = [
1289
+ ])])) : props.type === "warning" ? (openBlock(), createElementBlock("svg", _hoisted_3$48, [..._cache[4] || (_cache[4] = [
1624
1290
  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),
1625
1291
  createElementVNode("path", { d: "M12 9v4" }, null, -1),
1626
1292
  createElementVNode("path", { d: "M12 17h.01" }, null, -1)
1627
- ])])) : (openBlock(), createElementBlock("svg", _hoisted_4$50, [..._cache[5] || (_cache[5] = [
1293
+ ])])) : (openBlock(), createElementBlock("svg", _hoisted_4$46, [..._cache[5] || (_cache[5] = [
1628
1294
  createElementVNode("circle", {
1629
1295
  cx: "12",
1630
1296
  cy: "12",
@@ -1633,8 +1299,8 @@ var AlertBox_default = /* @__PURE__ */ defineComponent({
1633
1299
  createElementVNode("path", { d: "M12 16v-4" }, null, -1),
1634
1300
  createElementVNode("path", { d: "M12 8h.01" }, null, -1)
1635
1301
  ])])),
1636
- createElementVNode("div", _hoisted_5$48, [props.title ? (openBlock(), createElementBlock("h4", _hoisted_6$47, toDisplayString(props.title), 1)) : createCommentVNode("", true), createElementVNode("div", _hoisted_7$41, [renderSlot(_ctx.$slots, "default")])]),
1637
- hasActions() ? (openBlock(), createElementBlock("div", _hoisted_8$38, [renderSlot(_ctx.$slots, "actions", {}, () => [createElementVNode("button", {
1302
+ createElementVNode("div", _hoisted_5$44, [props.title ? (openBlock(), createElementBlock("h4", _hoisted_6$43, toDisplayString(props.title), 1)) : createCommentVNode("", true), createElementVNode("div", _hoisted_7$39, [renderSlot(_ctx.$slots, "default")])]),
1303
+ hasActions() ? (openBlock(), createElementBlock("div", _hoisted_8$36, [renderSlot(_ctx.$slots, "actions", {}, () => [createElementVNode("button", {
1638
1304
  type: "button",
1639
1305
  class: normalizeClass(["mint-alert__action-btn", `mint-alert__action-btn--${props.type}`]),
1640
1306
  onClick: _cache[0] || (_cache[0] = ($event) => emit("action"))
@@ -1660,9 +1326,9 @@ var AlertBox_default = /* @__PURE__ */ defineComponent({
1660
1326
  });
1661
1327
  //#endregion
1662
1328
  //#region src/components/AppToastContainer.vue?vue&type=script&setup=true&lang.ts
1663
- var _hoisted_1$66 = { class: "mint-toast__container" };
1664
- var _hoisted_2$57 = ["onClick"];
1665
- var _hoisted_3$52 = { class: "mint-toast__message" };
1329
+ var _hoisted_1$60 = { class: "mint-toast__container" };
1330
+ var _hoisted_2$52 = ["onClick"];
1331
+ var _hoisted_3$47 = { class: "mint-toast__message" };
1666
1332
  //#endregion
1667
1333
  //#region src/components/AppToastContainer.vue
1668
1334
  var AppToastContainer_default = /* @__PURE__ */ defineComponent({
@@ -1677,7 +1343,7 @@ var AppToastContainer_default = /* @__PURE__ */ defineComponent({
1677
1343
  info: "#3B82F6"
1678
1344
  };
1679
1345
  return (_ctx, _cache) => {
1680
- return openBlock(), createBlock(Teleport, { to: "body" }, [createElementVNode("div", _hoisted_1$66, [createVNode(TransitionGroup, { name: "toast" }, {
1346
+ return openBlock(), createBlock(Teleport, { to: "body" }, [createElementVNode("div", _hoisted_1$60, [createVNode(TransitionGroup, { name: "toast" }, {
1681
1347
  default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(toasts), (toast) => {
1682
1348
  return openBlock(), createElementBlock("div", {
1683
1349
  key: toast.id,
@@ -1751,7 +1417,7 @@ var AppToastContainer_default = /* @__PURE__ */ defineComponent({
1751
1417
  createElementVNode("path", { d: "M12 16v-4" }, null, -1),
1752
1418
  createElementVNode("path", { d: "M12 8h.01" }, null, -1)
1753
1419
  ])], 4)),
1754
- createElementVNode("span", _hoisted_3$52, toDisplayString(toast.message), 1),
1420
+ createElementVNode("span", _hoisted_3$47, toDisplayString(toast.message), 1),
1755
1421
  createElementVNode("span", {
1756
1422
  class: "mint-toast__progress",
1757
1423
  style: normalizeStyle({
@@ -1759,7 +1425,7 @@ var AppToastContainer_default = /* @__PURE__ */ defineComponent({
1759
1425
  animationDuration: `${toast.duration ?? 3500}ms`
1760
1426
  })
1761
1427
  }, null, 4)
1762
- ], 14, _hoisted_2$57);
1428
+ ], 14, _hoisted_2$52);
1763
1429
  }), 128))]),
1764
1430
  _: 1
1765
1431
  })])]);
@@ -1768,7 +1434,7 @@ var AppToastContainer_default = /* @__PURE__ */ defineComponent({
1768
1434
  });
1769
1435
  //#endregion
1770
1436
  //#region src/components/IconButton.vue?vue&type=script&setup=true&lang.ts
1771
- var _hoisted_1$65 = [
1437
+ var _hoisted_1$59 = [
1772
1438
  "disabled",
1773
1439
  "aria-label",
1774
1440
  "title"
@@ -1830,13 +1496,13 @@ var IconButton_default = /* @__PURE__ */ defineComponent({
1830
1496
  }, null, -1)])], 2)) : (openBlock(), createElementBlock("span", {
1831
1497
  key: 1,
1832
1498
  class: normalizeClass(`mint-icon-button__icon--${__props.size}`)
1833
- }, [renderSlot(_ctx.$slots, "default")], 2))], 10, _hoisted_1$65);
1499
+ }, [renderSlot(_ctx.$slots, "default")], 2))], 10, _hoisted_1$59);
1834
1500
  };
1835
1501
  }
1836
1502
  });
1837
1503
  //#endregion
1838
1504
  //#region src/components/ThemeToggle.vue?vue&type=script&setup=true&lang.ts
1839
- var _hoisted_1$64 = {
1505
+ var _hoisted_1$58 = {
1840
1506
  key: 0,
1841
1507
  class: "mint-theme-toggle__icon",
1842
1508
  viewBox: "0 0 24 24",
@@ -1846,7 +1512,7 @@ var _hoisted_1$64 = {
1846
1512
  "stroke-linecap": "round",
1847
1513
  "stroke-linejoin": "round"
1848
1514
  };
1849
- var _hoisted_2$56 = {
1515
+ var _hoisted_2$51 = {
1850
1516
  key: 1,
1851
1517
  class: "mint-theme-toggle__icon",
1852
1518
  viewBox: "0 0 24 24",
@@ -1872,7 +1538,7 @@ var ThemeToggle_default = /* @__PURE__ */ defineComponent({
1872
1538
  label: unref(isDark) ? "Switch to light mode" : "Switch to dark mode",
1873
1539
  onClick: unref(toggleTheme)
1874
1540
  }, {
1875
- default: withCtx(() => [unref(isDark) ? (openBlock(), createElementBlock("svg", _hoisted_1$64, [..._cache[0] || (_cache[0] = [
1541
+ default: withCtx(() => [unref(isDark) ? (openBlock(), createElementBlock("svg", _hoisted_1$58, [..._cache[0] || (_cache[0] = [
1876
1542
  createElementVNode("circle", {
1877
1543
  cx: "12",
1878
1544
  cy: "12",
@@ -1886,7 +1552,7 @@ var ThemeToggle_default = /* @__PURE__ */ defineComponent({
1886
1552
  createElementVNode("path", { d: "M20 12h2" }, null, -1),
1887
1553
  createElementVNode("path", { d: "m6.34 17.66-1.41 1.41" }, null, -1),
1888
1554
  createElementVNode("path", { d: "m19.07 4.93-1.41 1.41" }, null, -1)
1889
- ])])) : (openBlock(), createElementBlock("svg", _hoisted_2$56, [..._cache[1] || (_cache[1] = [createElementVNode("path", { d: "M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401" }, null, -1)])]))]),
1555
+ ])])) : (openBlock(), createElementBlock("svg", _hoisted_2$51, [..._cache[1] || (_cache[1] = [createElementVNode("path", { d: "M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401" }, null, -1)])]))]),
1890
1556
  _: 1
1891
1557
  }, 8, [
1892
1558
  "size",
@@ -1898,25 +1564,25 @@ var ThemeToggle_default = /* @__PURE__ */ defineComponent({
1898
1564
  });
1899
1565
  //#endregion
1900
1566
  //#region src/components/CollapsibleCard.vue?vue&type=script&setup=true&lang.ts
1901
- var _hoisted_1$63 = { class: "mint-collapsible-card__header-shell" };
1902
- var _hoisted_2$55 = ["disabled", "aria-expanded"];
1903
- var _hoisted_3$51 = { class: "mint-collapsible-card__title-section" };
1904
- var _hoisted_4$49 = ["d"];
1905
- var _hoisted_5$47 = ["d"];
1906
- var _hoisted_6$46 = { class: "mint-collapsible-card__titles" };
1907
- var _hoisted_7$40 = { class: "mint-collapsible-card__title" };
1908
- var _hoisted_8$37 = {
1567
+ var _hoisted_1$57 = { class: "mint-collapsible-card__header-shell" };
1568
+ var _hoisted_2$50 = ["disabled", "aria-expanded"];
1569
+ var _hoisted_3$46 = { class: "mint-collapsible-card__title-section" };
1570
+ var _hoisted_4$45 = ["d"];
1571
+ var _hoisted_5$43 = ["d"];
1572
+ var _hoisted_6$42 = { class: "mint-collapsible-card__titles" };
1573
+ var _hoisted_7$38 = { class: "mint-collapsible-card__title" };
1574
+ var _hoisted_8$35 = {
1909
1575
  key: 0,
1910
1576
  class: "mint-collapsible-card__subtitle"
1911
1577
  };
1912
- var _hoisted_9$34 = { class: "mint-collapsible-card__actions" };
1913
- var _hoisted_10$31 = [
1578
+ var _hoisted_9$32 = { class: "mint-collapsible-card__actions" };
1579
+ var _hoisted_10$28 = [
1914
1580
  "disabled",
1915
1581
  "aria-label",
1916
1582
  "title",
1917
1583
  "onClick"
1918
1584
  ];
1919
- var _hoisted_11$29 = {
1585
+ var _hoisted_11$26 = {
1920
1586
  key: 0,
1921
1587
  class: "mint-collapsible-card__action-icon",
1922
1588
  viewBox: "0 0 24 24",
@@ -1927,20 +1593,20 @@ var _hoisted_11$29 = {
1927
1593
  "stroke-linejoin": "round",
1928
1594
  "aria-hidden": "true"
1929
1595
  };
1930
- var _hoisted_12$26 = ["d"];
1931
- var _hoisted_13$25 = ["d"];
1932
- var _hoisted_14$22 = {
1596
+ var _hoisted_12$23 = ["d"];
1597
+ var _hoisted_13$22 = ["d"];
1598
+ var _hoisted_14$19 = {
1933
1599
  key: 1,
1934
1600
  class: "mint-collapsible-card__action-text-icon"
1935
1601
  };
1936
- var _hoisted_15$21 = ["aria-checked", "onKeydown"];
1937
- var _hoisted_16$19 = [
1602
+ var _hoisted_15$18 = ["aria-checked", "onKeydown"];
1603
+ var _hoisted_16$16 = [
1938
1604
  "disabled",
1939
1605
  "aria-label",
1940
1606
  "aria-expanded"
1941
1607
  ];
1942
- var _hoisted_17$19 = { class: "mint-collapsible-card__body" };
1943
- var _hoisted_18$17 = { class: "mint-collapsible-card__content" };
1608
+ var _hoisted_17$16 = { class: "mint-collapsible-card__body" };
1609
+ var _hoisted_18$14 = { class: "mint-collapsible-card__content" };
1944
1610
  //#endregion
1945
1611
  //#region src/components/CollapsibleCard.vue
1946
1612
  var CollapsibleCard_default = /* @__PURE__ */ defineComponent({
@@ -1978,1507 +1644,138 @@ var CollapsibleCard_default = /* @__PURE__ */ defineComponent({
1978
1644
  },
1979
1645
  emits: ["update:toggleValue", "action"],
1980
1646
  setup(__props, { emit: __emit }) {
1981
- /** Card whose body collapses with a chevron-rotate animation, with an optional inline toggle switch independent of expand state. */
1982
- const props = __props;
1983
- const emit = __emit;
1984
- const isOpen = ref(props.defaultOpen);
1985
- const toggle = () => {
1986
- if (!props.disabled) isOpen.value = !isOpen.value;
1987
- };
1988
- const handleToggleClick = (event) => {
1989
- event.stopPropagation();
1990
- emit("update:toggleValue", !props.toggleValue);
1991
- };
1992
- const headerClasses = computed(() => ["mint-collapsible-card__header", props.disabled ? "mint-collapsible-card__header--disabled" : ""]);
1993
- const iconBgStyle = computed(() => ({ backgroundColor: props.iconBg || "var(--color-primary-soft)" }));
1994
- const iconColorStyle = computed(() => ({ color: props.iconColor || "var(--color-primary)" }));
1995
- const isSvgIcon = computed(() => isSvgIconValue(props.icon));
1996
- const toggleTrackStyle = computed(() => {
1997
- if (!props.toggleValue || !props.toggleColor) return {};
1998
- return {
1999
- backgroundColor: props.toggleColor,
2000
- borderColor: props.toggleColor
2001
- };
2002
- });
2003
- const badgeClasses = computed(() => ["mint-collapsible-card__badge", `mint-collapsible-card__badge--${props.badgeTone}`]);
2004
- function isSvgIconValue(icon) {
2005
- if (!icon) return false;
2006
- return Array.isArray(icon) || icon.startsWith("M") || icon.startsWith("m");
2007
- }
2008
- function actionClasses(action) {
2009
- return [
2010
- "mint-collapsible-card__action",
2011
- action.tone ? `mint-collapsible-card__action--${action.tone}` : "",
2012
- action.disabled ? "mint-collapsible-card__action--disabled" : ""
2013
- ];
2014
- }
2015
- function actionStyle(action) {
2016
- return action.iconColor ? { color: action.iconColor } : {};
2017
- }
2018
- function handleActionClick(action) {
2019
- if (props.disabled || action.disabled) return;
2020
- emit("action", action.id);
2021
- }
2022
- return (_ctx, _cache) => {
2023
- return openBlock(), createElementBlock("div", { class: normalizeClass(["mint-collapsible-card", __props.dense ? "mint-collapsible-card--dense" : ""]) }, [createElementVNode("div", _hoisted_1$63, [createElementVNode("button", {
2024
- type: "button",
2025
- class: normalizeClass(headerClasses.value),
2026
- disabled: __props.disabled,
2027
- "aria-expanded": isOpen.value,
2028
- onClick: toggle
2029
- }, [createElementVNode("div", _hoisted_3$51, [__props.icon ? (openBlock(), createElementBlock("div", {
2030
- key: 0,
2031
- class: "mint-collapsible-card__icon-badge",
2032
- style: normalizeStyle(iconBgStyle.value)
2033
- }, [isSvgIcon.value ? (openBlock(), createElementBlock("svg", {
2034
- key: 0,
2035
- class: "mint-collapsible-card__icon",
2036
- style: normalizeStyle(iconColorStyle.value),
2037
- viewBox: "0 0 24 24",
2038
- fill: "none",
2039
- stroke: "currentColor",
2040
- "stroke-width": "2",
2041
- "stroke-linecap": "round",
2042
- "stroke-linejoin": "round"
2043
- }, [Array.isArray(__props.icon) ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(__props.icon, (d, i) => {
2044
- return openBlock(), createElementBlock("path", {
2045
- key: i,
2046
- d
2047
- }, null, 8, _hoisted_4$49);
2048
- }), 128)) : (openBlock(), createElementBlock("path", {
2049
- key: 1,
2050
- d: __props.icon
2051
- }, null, 8, _hoisted_5$47))], 4)) : (openBlock(), createElementBlock("span", {
2052
- key: 1,
2053
- class: "mint-collapsible-card__icon-text",
2054
- style: normalizeStyle(iconColorStyle.value)
2055
- }, toDisplayString(__props.icon), 5))], 4)) : createCommentVNode("", true), createElementVNode("div", _hoisted_6$46, [createElementVNode("h3", _hoisted_7$40, toDisplayString(__props.title), 1), __props.subtitle ? (openBlock(), createElementBlock("p", _hoisted_8$37, toDisplayString(__props.subtitle), 1)) : createCommentVNode("", true)])])], 10, _hoisted_2$55), createElementVNode("div", _hoisted_9$34, [
2056
- __props.badge !== void 0 ? (openBlock(), createElementBlock("span", {
2057
- key: 0,
2058
- class: normalizeClass(badgeClasses.value)
2059
- }, toDisplayString(__props.badge), 3)) : createCommentVNode("", true),
2060
- (openBlock(true), createElementBlock(Fragment, null, renderList(__props.actions, (action) => {
2061
- return openBlock(), createElementBlock("button", {
2062
- key: action.id,
2063
- type: "button",
2064
- class: normalizeClass(actionClasses(action)),
2065
- style: normalizeStyle(actionStyle(action)),
2066
- disabled: __props.disabled || action.disabled,
2067
- "aria-label": action.label,
2068
- title: action.label,
2069
- onClick: ($event) => handleActionClick(action)
2070
- }, [action.icon && isSvgIconValue(action.icon) ? (openBlock(), createElementBlock("svg", _hoisted_11$29, [Array.isArray(action.icon) ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(action.icon, (d, i) => {
2071
- return openBlock(), createElementBlock("path", {
2072
- key: i,
2073
- d
2074
- }, null, 8, _hoisted_12$26);
2075
- }), 128)) : (openBlock(), createElementBlock("path", {
2076
- key: 1,
2077
- d: action.icon
2078
- }, null, 8, _hoisted_13$25))])) : action.icon ? (openBlock(), createElementBlock("span", _hoisted_14$22, toDisplayString(action.icon), 1)) : createCommentVNode("", true)], 14, _hoisted_10$31);
2079
- }), 128)),
2080
- __props.showToggle ? (openBlock(), createElementBlock("div", {
2081
- key: 1,
2082
- class: "mint-collapsible-card__toggle",
2083
- onClick: handleToggleClick
2084
- }, [createElementVNode("div", {
2085
- role: "switch",
2086
- tabindex: "0",
2087
- "aria-checked": __props.toggleValue,
2088
- class: normalizeClass(["mint-collapsible-card__toggle-track", __props.toggleValue ? "mint-collapsible-card__toggle-track--on" : ""]),
2089
- style: normalizeStyle(toggleTrackStyle.value),
2090
- onKeydown: [withKeys(withModifiers(handleToggleClick, ["prevent"]), ["enter"]), withKeys(withModifiers(handleToggleClick, ["prevent"]), ["space"])]
2091
- }, [createElementVNode("span", { class: normalizeClass(["mint-collapsible-card__toggle-knob", __props.toggleValue ? "mint-collapsible-card__toggle-knob--on" : ""]) }, null, 2)], 46, _hoisted_15$21)])) : createCommentVNode("", true),
2092
- createElementVNode("button", {
2093
- type: "button",
2094
- class: "mint-collapsible-card__chevron-button",
2095
- disabled: __props.disabled,
2096
- "aria-label": isOpen.value ? "Collapse section" : "Expand section",
2097
- "aria-expanded": isOpen.value,
2098
- onClick: toggle
2099
- }, [(openBlock(), createElementBlock("svg", {
2100
- class: normalizeClass(["mint-collapsible-card__chevron", isOpen.value ? "mint-collapsible-card__chevron--open" : ""]),
2101
- fill: "none",
2102
- stroke: "currentColor",
2103
- "stroke-width": "2",
2104
- "stroke-linecap": "round",
2105
- "stroke-linejoin": "round",
2106
- viewBox: "0 0 24 24",
2107
- "aria-hidden": "true"
2108
- }, [..._cache[0] || (_cache[0] = [createElementVNode("path", { d: "m6 9 6 6 6-6" }, null, -1)])], 2))], 8, _hoisted_16$19)
2109
- ])]), createVNode(Transition, { name: "collapse" }, {
2110
- default: withCtx(() => [withDirectives(createElementVNode("div", _hoisted_17$19, [createElementVNode("div", _hoisted_18$17, [renderSlot(_ctx.$slots, "default")])], 512), [[vShow, isOpen.value]])]),
2111
- _: 3
2112
- })], 2);
2113
- };
2114
- }
2115
- });
2116
- //#endregion
2117
- //#region src/components/internal/FormFieldRendererInternal.vue
2118
- var FormFieldRendererInternal_default = /* @__PURE__ */ defineComponent({
2119
- __name: "FormFieldRendererInternal",
2120
- props: {
2121
- field: {},
2122
- resolvedProps: {},
2123
- form: {}
2124
- },
2125
- setup(__props) {
2126
- const props = __props;
2127
- const entry = computed(() => getFieldRegistryEntry(props.field.type));
2128
- const isChoiceField = computed(() => props.field.type === "checkbox" || props.field.type === "toggle");
2129
- const componentProps = computed(() => {
2130
- if (!isChoiceField.value) return props.resolvedProps;
2131
- return {
2132
- variant: "row",
2133
- label: props.field.label,
2134
- description: props.field.hint,
2135
- icon: props.field.icon,
2136
- iconColor: props.field.iconColor,
2137
- iconBg: props.field.iconBg,
2138
- ...props.resolvedProps
2139
- };
2140
- });
2141
- const errorMessage = computed(() => {
2142
- const name = props.field.name;
2143
- return props.form.touched[name] ? props.form.errors[name] : null;
2144
- });
2145
- function handleUpload(files) {
2146
- props.form.setFieldValue(props.field.name, files);
2147
- }
2148
- return (_ctx, _cache) => {
2149
- return openBlock(), createBlock(FormField_default, {
2150
- label: isChoiceField.value ? void 0 : __props.field.label,
2151
- error: errorMessage.value ?? void 0,
2152
- hint: isChoiceField.value ? void 0 : __props.field.hint,
2153
- required: !!__props.field.validation?.required,
2154
- "html-for": isChoiceField.value ? void 0 : __props.field.name
2155
- }, {
2156
- default: withCtx(() => [renderSlot(_ctx.$slots, `field:${__props.field.name}`, {
2157
- field: __props.field,
2158
- form: __props.form,
2159
- fieldProps: __props.form.getFieldProps(__props.field.name)
2160
- }, () => [entry.value.vModel ? (openBlock(), createBlock(resolveDynamicComponent(entry.value.component), normalizeProps(mergeProps({ key: 0 }, componentProps.value)), null, 16)) : (openBlock(), createBlock(resolveDynamicComponent(entry.value.component), mergeProps({ key: 1 }, componentProps.value, { onUpload: handleUpload }), null, 16))])]),
2161
- _: 3
2162
- }, 8, [
2163
- "label",
2164
- "error",
2165
- "hint",
2166
- "required",
2167
- "html-for"
2168
- ]);
2169
- };
2170
- }
2171
- });
2172
- //#endregion
2173
- //#region src/utils/formModelSync.ts
2174
- function recordValuesEqualForKeys(left, right, keys) {
2175
- for (const key of keys) if (!valuesEqual(left[key], right[key])) return false;
2176
- return true;
2177
- }
2178
- function pickRecordKeys(source, keys) {
2179
- return Object.fromEntries(keys.map((key) => [key, source[key]]));
2180
- }
2181
- function pickExistingRecordKeys(source, keys) {
2182
- return Object.fromEntries(keys.filter((key) => Object.prototype.hasOwnProperty.call(source, key)).map((key) => [key, source[key]]));
2183
- }
2184
- function formSchemaFieldNames(schema) {
2185
- return (schema.steps ? schema.steps.flatMap((step) => step.sections) : schema.sections).flatMap((section) => section.fields.map((field) => field.name));
2186
- }
2187
- function valuesEqual(left, right) {
2188
- if (Object.is(left, right)) return true;
2189
- if (Array.isArray(left) && Array.isArray(right)) return left.length === right.length && left.every((item, index) => valuesEqual(item, right[index]));
2190
- if (isRecord(left) && isRecord(right)) return recordValuesEqualForKeys(left, right, [...new Set([...Object.keys(left), ...Object.keys(right)])]);
2191
- return false;
2192
- }
2193
- function isRecord(value) {
2194
- return typeof value === "object" && value !== null && !Array.isArray(value);
2195
- }
2196
- //#endregion
2197
- //#region src/components/SettingsModal.schema.ts
2198
- var APPEARANCE_TAB_ID = "appearance";
2199
- var APPEARANCE_TAB = {
2200
- id: APPEARANCE_TAB_ID,
2201
- label: "Appearance",
2202
- description: "Theme, color palette, and table density"
2203
- };
2204
- function buildFlatSettingsSchema(schema) {
2205
- return { sections: schema.groups.map((group) => ({
2206
- id: group.id,
2207
- title: "",
2208
- fields: group.fields,
2209
- columns: group.columns,
2210
- condition: group.condition
2211
- })) };
2212
- }
2213
- function filterSettingsSchemaByAccess(schema, canShow) {
2214
- return { groups: schema.groups.flatMap((group) => {
2215
- if (!canShow(group)) return [];
2216
- const fields = group.fields.filter(canShow);
2217
- if (fields.length === 0) return [];
2218
- return [{
2219
- ...group,
2220
- fields
2221
- }];
2222
- }) };
2223
- }
2224
- function settingsGroupToTab(group) {
2225
- return {
2226
- id: group.id,
2227
- label: group.label,
2228
- icon: group.icon,
2229
- description: group.description
2230
- };
2231
- }
2232
- function normalizeVisibleSettingsTabs(tabs, canShow) {
2233
- return tabs.map(normalizeItemInput).filter(canShow);
2234
- }
2235
- function buildSettingsTabs(baseTabs, showAppearance) {
2236
- return showAppearance ? [...baseTabs, APPEARANCE_TAB] : baseTabs;
2237
- }
2238
- //#endregion
2239
- //#region src/components/SettingsModal.vue?vue&type=script&setup=true&lang.ts
2240
- var _hoisted_1$62 = {
2241
- key: 0,
2242
- class: "mint-settings-modal__tabs"
2243
- };
2244
- var _hoisted_2$54 = ["onClick"];
2245
- var _hoisted_3$50 = {
2246
- key: 1,
2247
- class: "mint-settings-modal__rail",
2248
- role: "tablist",
2249
- "aria-orientation": "vertical",
2250
- "aria-label": "Settings sections"
2251
- };
2252
- var _hoisted_4$48 = [
2253
- "id",
2254
- "aria-selected",
2255
- "aria-controls",
2256
- "tabindex",
2257
- "onClick"
2258
- ];
2259
- var _hoisted_5$46 = {
2260
- class: "mint-settings-modal__rail-item-icon",
2261
- "aria-hidden": "true"
2262
- };
2263
- var _hoisted_6$45 = ["innerHTML"];
2264
- var _hoisted_7$39 = { class: "mint-settings-modal__rail-item-text" };
2265
- var _hoisted_8$36 = { class: "mint-settings-modal__rail-item-label" };
2266
- var _hoisted_9$33 = {
2267
- key: 0,
2268
- class: "mint-settings-modal__rail-item-description"
2269
- };
2270
- var _hoisted_10$30 = {
2271
- key: 0,
2272
- class: "mint-settings-modal__pane-header"
2273
- };
2274
- var _hoisted_11$28 = { class: "mint-settings-modal__pane-title" };
2275
- var _hoisted_12$25 = {
2276
- key: 0,
2277
- class: "mint-settings-modal__pane-subtitle"
2278
- };
2279
- var _hoisted_13$24 = { key: 2 };
2280
- var _hoisted_14$21 = { class: "mint-settings-modal__section" };
2281
- var _hoisted_15$20 = { class: "mint-settings-modal__option-group" };
2282
- var _hoisted_16$18 = ["onClick"];
2283
- var _hoisted_17$18 = { class: "mint-settings-modal__section" };
2284
- var _hoisted_18$16 = { class: "mint-settings-modal__option-group" };
2285
- var _hoisted_19$16 = ["onClick"];
2286
- var _hoisted_20$14 = { class: "mint-settings-modal__section" };
2287
- var _hoisted_21$12 = { class: "mint-settings-modal__option-group" };
2288
- var _hoisted_22$10 = ["onClick"];
2289
- var _hoisted_23$9 = {
2290
- key: 0,
2291
- class: "mint-settings-modal__footer"
2292
- };
2293
- //#endregion
2294
- //#region src/components/SettingsModal.vue
2295
- var SettingsModal_default = /* @__PURE__ */ defineComponent({
2296
- __name: "SettingsModal",
2297
- props: {
2298
- modelValue: { type: Boolean },
2299
- title: { default: "Settings" },
2300
- tabs: { default: () => [] },
2301
- showAppearance: {
2302
- type: Boolean,
2303
- default: true
2304
- },
2305
- size: { default: "lg" },
2306
- layout: { default: "horizontal" },
2307
- schema: {},
2308
- model: { default: void 0 },
2309
- controls: {},
2310
- controlOptions: {},
2311
- values: {},
2312
- enhancements: {},
2313
- userType: {}
2314
- },
2315
- emits: [
2316
- "update:modelValue",
2317
- "update:values",
2318
- "close"
2319
- ],
2320
- setup(__props, { emit: __emit }) {
2321
- /**
2322
- * Tabbed settings modal with three usage modes:
2323
- *
2324
- * 1. Schema-driven (recommended) — pass `schema`, compact `controls`, or a
2325
- * complete `defineControlModel()` result plus `v-model:values`. Each
2326
- * group/section becomes a tab; fields auto-render via the SDK form field
2327
- * registry (text, select, number, toggle, molecule, concentration, …).
2328
- * Conditional visibility, validation, and dynamic options come for free.
2329
- *
2330
- * 2. Manual tabs + slots — pass `tabs` and a `<template #tab-{id}>` slot
2331
- * per tab. Use this when you need bespoke widgets the form-builder
2332
- * registry doesn't cover (or for legacy plugins).
2333
- *
2334
- * 3. Appearance only — `showAppearance` (default true) renders the built-in
2335
- * theme / palette / table-density tab. Works alongside both modes above.
2336
- *
2337
- * Layout: `horizontal` (underline tabs, default) or `vertical` (sidebar rail
2338
- * with optional icons + descriptions, recommended for 5+ groups).
2339
- */
2340
- const props = __props;
2341
- const emit = __emit;
2342
- const settings = useSettingsStore();
2343
- const auth = useAuthStore();
2344
- const { user: platformUser } = usePlatformContext();
2345
- const isVertical = computed(() => props.layout === "vertical");
2346
- const uid = `mint-settings-${Math.random().toString(36).slice(2, 9)}`;
2347
- const tabId = (id) => `${uid}-tab-${id}`;
2348
- const panelId = (id) => `${uid}-panel-${id}`;
2349
- const resolvedModel = computed(() => {
2350
- return resolveControlModel(props.model);
2351
- });
2352
- const resolvedControls = computed(() => props.controls ?? resolvedModel.value?.controls);
2353
- const resolvedControlOptions = computed(() => mergeControlWorkspaceOptions(resolvedModel.value?.controlOptions ?? {}, props.controlOptions));
2354
- const sourceSettingsSchema = computed(() => props.schema ?? (resolvedControls.value ? controlsToSettingsSchema(resolvedControls.value, resolvedControlOptions.value) : void 0));
2355
- const currentAccessUser = computed(() => {
2356
- if (props.userType) return { role: props.userType === "admin" ? "admin" : "user" };
2357
- return auth.userInfo ?? platformUser.value ?? null;
2358
- });
2359
- const isAccessUserAuthenticated = computed(() => props.userType !== void 0 || auth.isAuthenticated || !!platformUser.value);
2360
- const settingsSchema = computed(() => {
2361
- if (!sourceSettingsSchema.value) return void 0;
2362
- return filterSettingsSchemaByAccess(sourceSettingsSchema.value, canShowForCurrentUser);
2363
- });
2364
- const isSchemaDriven = computed(() => !!settingsSchema.value);
2365
- const resolvedValues = computed(() => ({
2366
- ...resolvedControlOptions.value.initialValues ?? {},
2367
- ...props.values ?? {}
2368
- }));
2369
- const builder = useFormBuilder(settingsSchema.value ? buildFlatSettingsSchema(settingsSchema.value) : { sections: [] }, resolvedValues.value, props.enhancements);
2370
- watch(() => settingsSchema.value, (schema) => {
2371
- if (!schema) {
2372
- builder.updateSchema({ sections: [] }, {});
2373
- return;
2374
- }
2375
- const flatSchema = buildFlatSettingsSchema(schema);
2376
- const fieldNames = formSchemaFieldNames(flatSchema);
2377
- const sourceValues = props.values === void 0 ? {
2378
- ...resolvedValues.value,
2379
- ...builder.form.data
2380
- } : resolvedValues.value;
2381
- builder.updateSchema(flatSchema, pickExistingRecordKeys(sourceValues ?? {}, fieldNames));
2382
- }, { deep: true });
2383
- watch(() => ({ ...resolvedValues.value }), (data) => {
2384
- if (!settingsSchema.value) return;
2385
- const fieldNames = builderFieldNames();
2386
- if (recordValuesEqualForKeys(data, builder.form.data, fieldNames)) return;
2387
- builder.reset(pickRecordKeys(data, fieldNames));
2388
- }, { deep: true });
2389
- watch(() => ({ ...builder.form.data }), (data) => {
2390
- if (settingsSchema.value) emit("update:values", data);
2391
- }, { deep: true });
2392
- const visibleSchemaGroups = computed(() => settingsSchema.value ? settingsSchema.value.groups.filter((g) => builder.isSectionVisible(g.id)) : []);
2393
- const manualTabs = computed(() => normalizeVisibleSettingsTabs(props.tabs, canShowForCurrentUser));
2394
- const allTabs = computed(() => {
2395
- return buildSettingsTabs(settingsSchema.value ? visibleSchemaGroups.value.map(settingsGroupToTab) : manualTabs.value, props.showAppearance);
2396
- });
2397
- const activeTab = ref(allTabs.value[0]?.id || "appearance");
2398
- const activeTabMeta = computed(() => allTabs.value.find((t) => t.id === activeTab.value));
2399
- watch(allTabs, (tabs) => {
2400
- if (!tabs.some((t) => t.id === activeTab.value)) activeTab.value = tabs[0]?.id ?? "appearance";
2401
- });
2402
- const activeGroup = computed(() => visibleSchemaGroups.value.find((g) => g.id === activeTab.value));
2403
- const activeGroupVisibleFields = computed(() => {
2404
- if (!activeGroup.value) return [];
2405
- return activeGroup.value.fields.filter((f) => builder.isFieldVisible(f.name));
2406
- });
2407
- const themeOptions = [
2408
- {
2409
- value: "light",
2410
- label: "Light"
2411
- },
2412
- {
2413
- value: "dark",
2414
- label: "Dark"
2415
- },
2416
- {
2417
- value: "system",
2418
- label: "System"
2419
- }
2420
- ];
2421
- const densityOptions = [
2422
- {
2423
- value: "compact",
2424
- label: "Compact"
2425
- },
2426
- {
2427
- value: "normal",
2428
- label: "Normal"
2429
- },
2430
- {
2431
- value: "comfortable",
2432
- label: "Comfortable"
2433
- }
2434
- ];
2435
- function handleClose() {
2436
- emit("update:modelValue", false);
2437
- emit("close");
2438
- }
2439
- function builderFieldNames() {
2440
- return builder.fields.map((field) => field.name);
2441
- }
2442
- function canShowForCurrentUser(item) {
2443
- return canAccessByPolicy(currentAccessUser.value, item, isAccessUserAuthenticated.value);
2444
- }
2445
- return (_ctx, _cache) => {
2446
- return openBlock(), createBlock(BaseModal_default, {
2447
- "model-value": __props.modelValue,
2448
- title: __props.title,
2449
- size: __props.size,
2450
- "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => emit("update:modelValue", $event)),
2451
- onClose: handleClose
2452
- }, {
2453
- default: withCtx(() => [createElementVNode("div", { class: normalizeClass(["mint-settings-modal", `mint-settings-modal--${__props.layout}`]) }, [!isVertical.value && allTabs.value.length > 1 ? (openBlock(), createElementBlock("div", _hoisted_1$62, [(openBlock(true), createElementBlock(Fragment, null, renderList(allTabs.value, (tab) => {
2454
- return openBlock(), createElementBlock("button", {
2455
- key: tab.id,
2456
- type: "button",
2457
- class: normalizeClass(["mint-settings-modal__tab", { "mint-settings-modal__tab--active": activeTab.value === tab.id }]),
2458
- onClick: ($event) => activeTab.value = tab.id
2459
- }, toDisplayString(tab.label), 11, _hoisted_2$54);
2460
- }), 128))])) : isVertical.value ? (openBlock(), createElementBlock("div", _hoisted_3$50, [(openBlock(true), createElementBlock(Fragment, null, renderList(allTabs.value, (tab) => {
2461
- return openBlock(), createElementBlock("button", {
2462
- id: tabId(tab.id),
2463
- key: tab.id,
2464
- type: "button",
2465
- role: "tab",
2466
- class: normalizeClass(["mint-settings-modal__rail-item", { "mint-settings-modal__rail-item--active": activeTab.value === tab.id }]),
2467
- "aria-selected": activeTab.value === tab.id,
2468
- "aria-controls": panelId(tab.id),
2469
- tabindex: activeTab.value === tab.id ? 0 : -1,
2470
- onClick: ($event) => activeTab.value = tab.id
2471
- }, [createElementVNode("span", _hoisted_5$46, [tab.icon ? (openBlock(), createElementBlock("span", {
2472
- key: 0,
2473
- innerHTML: tab.icon
2474
- }, null, 8, _hoisted_6$45)) : createCommentVNode("", true)]), createElementVNode("span", _hoisted_7$39, [createElementVNode("span", _hoisted_8$36, toDisplayString(tab.label), 1), tab.description ? (openBlock(), createElementBlock("span", _hoisted_9$33, toDisplayString(tab.description), 1)) : createCommentVNode("", true)])], 10, _hoisted_4$48);
2475
- }), 128))])) : createCommentVNode("", true), (openBlock(), createBlock(resolveDynamicComponent(isVertical.value ? "section" : "div"), {
2476
- class: normalizeClass(isVertical.value ? "mint-settings-modal__pane" : "mint-settings-modal__content"),
2477
- id: isVertical.value && activeTabMeta.value ? panelId(activeTabMeta.value.id) : void 0,
2478
- role: isVertical.value ? "tabpanel" : void 0,
2479
- "aria-labelledby": isVertical.value && activeTabMeta.value ? tabId(activeTabMeta.value.id) : void 0,
2480
- tabindex: isVertical.value ? 0 : void 0
2481
- }, {
2482
- default: withCtx(() => [isVertical.value && activeTabMeta.value?.label ? (openBlock(), createElementBlock("header", _hoisted_10$30, [createElementVNode("h4", _hoisted_11$28, toDisplayString(activeTabMeta.value.label), 1), activeTabMeta.value.description ? (openBlock(), createElementBlock("p", _hoisted_12$25, toDisplayString(activeTabMeta.value.description), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true), createElementVNode("div", { class: normalizeClass(isVertical.value ? "mint-settings-modal__pane-body" : null) }, [isSchemaDriven.value && activeGroup.value ? (openBlock(), createElementBlock("div", {
2483
- key: 0,
2484
- class: "mint-settings-modal__group-grid",
2485
- style: normalizeStyle({ "--mint-settings-cols": activeGroup.value.columns ?? 1 })
2486
- }, [(openBlock(true), createElementBlock(Fragment, null, renderList(activeGroupVisibleFields.value, (field) => {
2487
- return openBlock(), createElementBlock("div", {
2488
- key: field.name,
2489
- style: normalizeStyle(field.colSpan ? { gridColumn: `span ${field.colSpan}` } : void 0)
2490
- }, [renderSlot(_ctx.$slots, `field:${field.name}`, {
2491
- field,
2492
- form: unref(builder).form,
2493
- fieldProps: unref(builder).form.getFieldProps(field.name)
2494
- }, () => [createVNode(FormFieldRendererInternal_default, {
2495
- field,
2496
- "resolved-props": unref(builder).getResolvedFieldProps(field),
2497
- form: unref(builder).form
2498
- }, null, 8, [
2499
- "field",
2500
- "resolved-props",
2501
- "form"
2502
- ])])], 4);
2503
- }), 128))], 4)) : !isSchemaDriven.value ? (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(manualTabs.value, (tab) => {
2504
- return withDirectives((openBlock(), createElementBlock("div", { key: tab.id }, [renderSlot(_ctx.$slots, `tab-${tab.id}`)], 512)), [[vShow, activeTab.value === tab.id]]);
2505
- }), 128)) : createCommentVNode("", true), __props.showAppearance ? withDirectives((openBlock(), createElementBlock("div", _hoisted_13$24, [
2506
- createElementVNode("div", _hoisted_14$21, [_cache[1] || (_cache[1] = createElementVNode("div", { class: "mint-settings-modal__section-label" }, "Theme", -1)), createElementVNode("div", _hoisted_15$20, [(openBlock(), createElementBlock(Fragment, null, renderList(themeOptions, (opt) => {
2507
- return createElementVNode("button", {
2508
- key: opt.value,
2509
- type: "button",
2510
- class: normalizeClass(["mint-settings-modal__option-btn", { "mint-settings-modal__option-btn--active": unref(settings).theme === opt.value }]),
2511
- onClick: ($event) => unref(settings).theme = opt.value
2512
- }, toDisplayString(opt.label), 11, _hoisted_16$18);
2513
- }), 64))])]),
2514
- createElementVNode("div", _hoisted_17$18, [_cache[2] || (_cache[2] = createElementVNode("div", { class: "mint-settings-modal__section-label" }, "Color Palette", -1)), createElementVNode("div", _hoisted_18$16, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(colorPalettes), (palette, key) => {
2515
- return openBlock(), createElementBlock("button", {
2516
- key,
2517
- type: "button",
2518
- class: normalizeClass(["mint-settings-modal__option-btn", { "mint-settings-modal__option-btn--active": unref(settings).colorPalette === key }]),
2519
- onClick: ($event) => unref(settings).colorPalette = key
2520
- }, toDisplayString(palette.name), 11, _hoisted_19$16);
2521
- }), 128))])]),
2522
- createElementVNode("div", _hoisted_20$14, [
2523
- _cache[3] || (_cache[3] = createElementVNode("div", { class: "mint-settings-modal__section-label" }, "Table Density", -1)),
2524
- createElementVNode("div", _hoisted_21$12, [(openBlock(), createElementBlock(Fragment, null, renderList(densityOptions, (opt) => {
2525
- return createElementVNode("button", {
2526
- key: opt.value,
2527
- type: "button",
2528
- class: normalizeClass(["mint-settings-modal__option-btn", { "mint-settings-modal__option-btn--active": unref(settings).tableDensity === opt.value }]),
2529
- onClick: ($event) => unref(settings).tableDensity = opt.value
2530
- }, toDisplayString(opt.label), 11, _hoisted_22$10);
2531
- }), 64))]),
2532
- _cache[4] || (_cache[4] = createElementVNode("p", { class: "mint-settings-modal__note" }, "Adjusts row height in data tables.", -1))
2533
- ]),
2534
- renderSlot(_ctx.$slots, "appearance")
2535
- ], 512)), [[vShow, activeTab.value === unref(APPEARANCE_TAB_ID)]]) : createCommentVNode("", true)], 2)]),
2536
- _: 3
2537
- }, 8, [
2538
- "class",
2539
- "id",
2540
- "role",
2541
- "aria-labelledby",
2542
- "tabindex"
2543
- ]))], 2), _ctx.$slots.footer ? (openBlock(), createElementBlock("div", _hoisted_23$9, [renderSlot(_ctx.$slots, "footer", {
2544
- values: unref(builder).form.data,
2545
- close: handleClose
2546
- })])) : createCommentVNode("", true)]),
2547
- _: 3
2548
- }, 8, [
2549
- "model-value",
2550
- "title",
2551
- "size"
2552
- ]);
2553
- };
2554
- }
2555
- });
2556
- //#endregion
2557
- //#region src/components/ConfirmDialog.vue?vue&type=script&setup=true&lang.ts
2558
- var _hoisted_1$61 = { class: "mint-confirm" };
2559
- var _hoisted_2$53 = {
2560
- key: 1,
2561
- class: "mint-confirm__message"
2562
- };
2563
- var _hoisted_3$49 = { class: "mint-confirm__footer" };
2564
- var _hoisted_4$47 = ["disabled"];
2565
- var _hoisted_5$45 = ["disabled"];
2566
- var _hoisted_6$44 = {
2567
- key: 0,
2568
- class: "mint-confirm__btn-spinner",
2569
- fill: "none",
2570
- viewBox: "0 0 24 24"
2571
- };
2572
- //#endregion
2573
- //#region src/components/ConfirmDialog.vue
2574
- var ConfirmDialog_default = /* @__PURE__ */ defineComponent({
2575
- __name: "ConfirmDialog",
2576
- props: {
2577
- modelValue: { type: Boolean },
2578
- title: { default: "Confirm" },
2579
- subtitle: {},
2580
- message: {},
2581
- variant: { default: "danger" },
2582
- confirmLabel: { default: "Confirm" },
2583
- cancelLabel: { default: "Cancel" },
2584
- loading: {
2585
- type: Boolean,
2586
- default: false
2587
- }
2588
- },
2589
- emits: [
2590
- "update:modelValue",
2591
- "confirm",
2592
- "cancel"
2593
- ],
2594
- setup(__props, { emit: __emit }) {
2595
- /** Confirm/cancel dialog with danger, warning, and info variants; blocks close while loading. */
2596
- const emit = __emit;
2597
- function handleCancel() {
2598
- emit("update:modelValue", false);
2599
- emit("cancel");
2600
- }
2601
- function handleConfirm() {
2602
- emit("confirm");
2603
- }
2604
- return (_ctx, _cache) => {
2605
- return openBlock(), createBlock(BaseModal_default, {
2606
- "model-value": __props.modelValue,
2607
- title: __props.title,
2608
- subtitle: __props.subtitle,
2609
- size: "sm",
2610
- closable: !__props.loading,
2611
- "close-on-overlay": !__props.loading,
2612
- "close-on-escape": !__props.loading,
2613
- "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => emit("update:modelValue", $event))
2614
- }, {
2615
- footer: withCtx(() => [createElementVNode("div", _hoisted_3$49, [createElementVNode("button", {
2616
- type: "button",
2617
- class: "mint-confirm__btn-cancel",
2618
- disabled: __props.loading,
2619
- onClick: handleCancel
2620
- }, toDisplayString(__props.cancelLabel), 9, _hoisted_4$47), createElementVNode("button", {
2621
- type: "button",
2622
- class: normalizeClass(["mint-confirm__btn-confirm", `mint-confirm__btn-confirm--${__props.variant}`]),
2623
- disabled: __props.loading,
2624
- onClick: handleConfirm
2625
- }, [__props.loading ? (openBlock(), createElementBlock("svg", _hoisted_6$44, [..._cache[1] || (_cache[1] = [createElementVNode("circle", {
2626
- style: { "opacity": "0.25" },
2627
- cx: "12",
2628
- cy: "12",
2629
- r: "10",
2630
- stroke: "currentColor",
2631
- "stroke-width": "4"
2632
- }, null, -1), createElementVNode("path", {
2633
- style: { "opacity": "0.75" },
2634
- fill: "currentColor",
2635
- d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
2636
- }, null, -1)])])) : createCommentVNode("", true), createTextVNode(" " + toDisplayString(__props.confirmLabel), 1)], 10, _hoisted_5$45)])]),
2637
- default: withCtx(() => [createElementVNode("div", _hoisted_1$61, [
2638
- _ctx.$slots.icon ? (openBlock(), createElementBlock("div", {
2639
- key: 0,
2640
- class: normalizeClass(["mint-confirm__icon", `mint-confirm__icon--${__props.variant}`])
2641
- }, [renderSlot(_ctx.$slots, "icon")], 2)) : createCommentVNode("", true),
2642
- __props.message ? (openBlock(), createElementBlock("p", _hoisted_2$53, toDisplayString(__props.message), 1)) : createCommentVNode("", true),
2643
- renderSlot(_ctx.$slots, "default")
2644
- ])]),
2645
- _: 3
2646
- }, 8, [
2647
- "model-value",
2648
- "title",
2649
- "subtitle",
2650
- "closable",
2651
- "close-on-overlay",
2652
- "close-on-escape"
2653
- ]);
2654
- };
2655
- }
2656
- });
2657
- //#endregion
2658
- //#region src/components/ExperimentPopover.vue?vue&type=script&setup=true&lang.ts
2659
- var _hoisted_1$60 = ["title"];
2660
- var _hoisted_2$52 = {
2661
- key: 0,
2662
- class: "mint-experiment-popover__trigger-code"
2663
- };
2664
- var _hoisted_3$48 = {
2665
- key: 1,
2666
- class: "mint-experiment-popover__trigger-text"
2667
- };
2668
- var _hoisted_4$46 = {
2669
- key: 2,
2670
- class: "mint-experiment-popover__trigger-text"
2671
- };
2672
- var _hoisted_5$44 = ["disabled", "title"];
2673
- var _hoisted_6$43 = {
2674
- key: 0,
2675
- class: "mint-experiment-popover__spinner--inline"
2676
- };
2677
- var _hoisted_7$38 = {
2678
- key: 1,
2679
- class: "mint-experiment-popover__save-trigger-icon",
2680
- fill: "none",
2681
- stroke: "currentColor",
2682
- viewBox: "0 0 24 24"
2683
- };
2684
- var _hoisted_8$35 = {
2685
- key: 2,
2686
- class: "mint-experiment-popover__save-trigger-icon",
2687
- fill: "none",
2688
- stroke: "currentColor",
2689
- viewBox: "0 0 24 24"
2690
- };
2691
- var _hoisted_9$32 = {
2692
- key: 0,
2693
- class: "mint-experiment-popover__panel"
2694
- };
2695
- var _hoisted_10$29 = { class: "mint-experiment-popover__header" };
2696
- var _hoisted_11$27 = { class: "mint-experiment-popover__subtitle" };
2697
- var _hoisted_12$24 = {
2698
- key: 0,
2699
- class: "mint-experiment-popover__body"
2700
- };
2701
- var _hoisted_13$23 = {
2702
- key: 1,
2703
- class: "mint-experiment-popover__body"
2704
- };
2705
- var _hoisted_14$20 = { class: "mint-experiment-popover__card" };
2706
- var _hoisted_15$19 = { class: "mint-experiment-popover__card-info" };
2707
- var _hoisted_16$17 = {
2708
- key: 0,
2709
- class: "mint-experiment-popover__card-code"
2710
- };
2711
- var _hoisted_17$17 = { class: "mint-experiment-popover__card-name" };
2712
- var _hoisted_18$15 = {
2713
- key: 1,
2714
- class: "mint-experiment-popover__card-status"
2715
- };
2716
- var _hoisted_19$15 = { class: "mint-experiment-popover__card-actions" };
2717
- //#endregion
2718
- //#region src/components/ExperimentPopover.vue
2719
- var ExperimentPopover_default = /* @__PURE__ */ defineComponent({
2720
- __name: "ExperimentPopover",
2721
- props: {
2722
- experimentName: {},
2723
- experimentCode: {},
2724
- experimentStatus: {},
2725
- showSave: {
2726
- type: Boolean,
2727
- default: false
2728
- },
2729
- showDetach: {
2730
- type: Boolean,
2731
- default: false
2732
- },
2733
- saveDisabled: {
2734
- type: Boolean,
2735
- default: false
2736
- },
2737
- saveLoading: {
2738
- type: Boolean,
2739
- default: false
2740
- },
2741
- saveSuccessMessage: {},
2742
- saveDisabledMessage: {},
2743
- confirmSave: {
2744
- type: Boolean,
2745
- default: true
2746
- },
2747
- confirmTitle: {},
2748
- confirmMessage: {}
2749
- },
2750
- emits: [
2751
- "select",
2752
- "save",
2753
- "detach"
2754
- ],
2755
- setup(__props, { emit: __emit }) {
2756
- /** Floating popover showing the active experiment with save, detach, and select actions. */
2757
- const props = __props;
2758
- const emit = __emit;
2759
- const { isOpen, rootRef: popoverRef, close, toggle } = useDropdownState({ closeOnEscape: false });
2760
- const showSuccess = ref(false);
2761
- const showConfirm = ref(false);
2762
- function handleSelect() {
2763
- emit("select");
2764
- close();
2765
- }
2766
- function handleSave() {
2767
- if (props.saveDisabled || props.saveLoading) return;
2768
- if (props.confirmSave) showConfirm.value = true;
2769
- else emit("save");
2770
- }
2771
- function handleConfirmSave() {
2772
- showConfirm.value = false;
2773
- emit("save");
2774
- }
2775
- function handleDetach() {
2776
- emit("detach");
2777
- close();
2778
- }
2779
- let successTimer = null;
2780
- watch(() => props.saveSuccessMessage, (msg) => {
2781
- if (successTimer) clearTimeout(successTimer);
2782
- if (msg) {
2783
- showSuccess.value = true;
2784
- successTimer = setTimeout(() => {
2785
- showSuccess.value = false;
2786
- successTimer = null;
2787
- }, 3e3);
2788
- }
2789
- });
2790
- onUnmounted(() => {
2791
- if (successTimer) clearTimeout(successTimer);
2792
- });
2793
- return (_ctx, _cache) => {
2794
- return openBlock(), createElementBlock("div", {
2795
- ref_key: "popoverRef",
2796
- ref: popoverRef,
2797
- class: "mint-experiment-popover"
2798
- }, [
2799
- createElementVNode("div", { class: normalizeClass(["mint-experiment-popover__split", { "mint-experiment-popover__split--with-save": __props.showSave && __props.experimentName }]) }, [createElementVNode("button", {
2800
- type: "button",
2801
- class: normalizeClass([
2802
- "mint-experiment-popover__trigger",
2803
- { "mint-experiment-popover__trigger--active": unref(isOpen) },
2804
- { "mint-experiment-popover__trigger--empty": !__props.experimentCode && !__props.experimentName }
2805
- ]),
2806
- title: __props.experimentName || void 0,
2807
- onClick: _cache[0] || (_cache[0] = withModifiers((...args) => unref(toggle) && unref(toggle)(...args), ["stop"]))
2808
- }, [
2809
- _cache[2] || (_cache[2] = createElementVNode("svg", {
2810
- class: "mint-experiment-popover__trigger-icon",
2811
- fill: "none",
2812
- stroke: "currentColor",
2813
- viewBox: "0 0 24 24"
2814
- }, [createElementVNode("path", {
2815
- "stroke-linecap": "round",
2816
- "stroke-linejoin": "round",
2817
- "stroke-width": "1.75",
2818
- d: "M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z"
2819
- })], -1)),
2820
- __props.experimentCode ? (openBlock(), createElementBlock("span", _hoisted_2$52, toDisplayString(__props.experimentCode), 1)) : __props.experimentName ? (openBlock(), createElementBlock("span", _hoisted_3$48, toDisplayString(__props.experimentName), 1)) : (openBlock(), createElementBlock("span", _hoisted_4$46, "No experiment")),
2821
- _cache[3] || (_cache[3] = createElementVNode("svg", {
2822
- class: "mint-experiment-popover__trigger-chevron",
2823
- viewBox: "0 0 24 24",
2824
- fill: "none",
2825
- stroke: "currentColor",
2826
- "stroke-width": "2",
2827
- "stroke-linecap": "round",
2828
- "stroke-linejoin": "round"
2829
- }, [createElementVNode("path", { d: "m6 9 6 6 6-6" })], -1))
2830
- ], 10, _hoisted_1$60), __props.showSave && __props.experimentName ? (openBlock(), createElementBlock("button", {
2831
- key: 0,
2832
- type: "button",
2833
- class: normalizeClass([
2834
- "mint-experiment-popover__save-trigger",
2835
- { "mint-experiment-popover__save-trigger--loading": __props.saveLoading },
2836
- { "mint-experiment-popover__save-trigger--success": showSuccess.value },
2837
- { "mint-experiment-popover__save-trigger--disabled": __props.saveDisabled && !showSuccess.value }
2838
- ]),
2839
- disabled: __props.saveDisabled && !showSuccess.value,
2840
- title: __props.saveDisabled && __props.saveDisabledMessage ? __props.saveDisabledMessage : showSuccess.value && __props.saveSuccessMessage ? __props.saveSuccessMessage : "Save to Experiment",
2841
- onClick: withModifiers(handleSave, ["stop"])
2842
- }, [__props.saveLoading ? (openBlock(), createElementBlock("span", _hoisted_6$43)) : showSuccess.value ? (openBlock(), createElementBlock("svg", _hoisted_7$38, [..._cache[4] || (_cache[4] = [createElementVNode("path", {
2843
- "stroke-linecap": "round",
2844
- "stroke-linejoin": "round",
2845
- "stroke-width": "2.5",
2846
- d: "M5 13l4 4L19 7"
2847
- }, null, -1)])])) : (openBlock(), createElementBlock("svg", _hoisted_8$35, [..._cache[5] || (_cache[5] = [createElementVNode("path", {
2848
- "stroke-linecap": "round",
2849
- "stroke-linejoin": "round",
2850
- "stroke-width": "2",
2851
- d: "M8 7H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4"
2852
- }, null, -1)])]))], 10, _hoisted_5$44)) : createCommentVNode("", true)], 2),
2853
- unref(isOpen) ? (openBlock(), createElementBlock("div", _hoisted_9$32, [createElementVNode("div", _hoisted_10$29, [_cache[6] || (_cache[6] = createElementVNode("div", { class: "mint-experiment-popover__title" }, "Experiment", -1)), createElementVNode("div", _hoisted_11$27, toDisplayString(__props.experimentName ? "Linked experiment context" : "Link to an MINT experiment"), 1)]), !__props.experimentName ? (openBlock(), createElementBlock("div", _hoisted_12$24, [createElementVNode("button", {
2854
- type: "button",
2855
- class: "mint-experiment-popover__select-btn",
2856
- onClick: handleSelect
2857
- }, [..._cache[7] || (_cache[7] = [createElementVNode("svg", {
2858
- width: "14",
2859
- height: "14",
2860
- fill: "none",
2861
- stroke: "currentColor",
2862
- viewBox: "0 0 24 24"
2863
- }, [createElementVNode("path", {
2864
- "stroke-linecap": "round",
2865
- "stroke-linejoin": "round",
2866
- "stroke-width": "2",
2867
- d: "M12 4v16m8-8H4"
2868
- })], -1), createTextVNode(" Select Experiment ", -1)])])])) : (openBlock(), createElementBlock("div", _hoisted_13$23, [createElementVNode("div", _hoisted_14$20, [_cache[8] || (_cache[8] = createElementVNode("div", { class: "mint-experiment-popover__card-icon" }, [createElementVNode("svg", {
2869
- fill: "none",
2870
- stroke: "currentColor",
2871
- viewBox: "0 0 24 24"
2872
- }, [createElementVNode("path", {
2873
- "stroke-linecap": "round",
2874
- "stroke-linejoin": "round",
2875
- "stroke-width": "1.75",
2876
- d: "M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z"
2877
- })])], -1)), createElementVNode("div", _hoisted_15$19, [
2878
- __props.experimentCode ? (openBlock(), createElementBlock("span", _hoisted_16$17, toDisplayString(__props.experimentCode), 1)) : createCommentVNode("", true),
2879
- createElementVNode("div", _hoisted_17$17, toDisplayString(__props.experimentName), 1),
2880
- __props.experimentStatus ? (openBlock(), createElementBlock("div", _hoisted_18$15, toDisplayString(unref(formatExperimentStatus)(__props.experimentStatus)), 1)) : createCommentVNode("", true)
2881
- ])]), createElementVNode("div", _hoisted_19$15, [createElementVNode("button", {
2882
- type: "button",
2883
- class: "mint-experiment-popover__change-btn",
2884
- onClick: handleSelect
2885
- }, " Change "), __props.showDetach ? (openBlock(), createElementBlock("button", {
2886
- key: 0,
2887
- type: "button",
2888
- class: "mint-experiment-popover__detach-btn",
2889
- onClick: handleDetach
2890
- }, " Detach ")) : createCommentVNode("", true)])]))])) : createCommentVNode("", true),
2891
- createVNode(ConfirmDialog_default, {
2892
- modelValue: showConfirm.value,
2893
- "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => showConfirm.value = $event),
2894
- title: __props.confirmTitle ?? "Save to Experiment",
2895
- message: __props.confirmMessage ?? `Save current data to ${__props.experimentName}?`,
2896
- variant: "info",
2897
- "confirm-label": "Save",
2898
- loading: __props.saveLoading,
2899
- onConfirm: handleConfirmSave
2900
- }, null, 8, [
2901
- "modelValue",
2902
- "title",
2903
- "message",
2904
- "loading"
2905
- ])
2906
- ], 512);
2907
- };
2908
- }
2909
- });
2910
- //#endregion
2911
- //#region src/components/Skeleton.vue
2912
- var Skeleton_default = /* @__PURE__ */ defineComponent({
2913
- __name: "Skeleton",
2914
- props: {
2915
- variant: { default: "text" },
2916
- width: {},
2917
- height: {},
2918
- animation: { default: "wave" }
2919
- },
2920
- setup(__props) {
2921
- /** Animated loading placeholder in text, circular, rectangular, or rounded variants with pulse or wave animation. */
2922
- const props = __props;
2923
- const style = computed(() => {
2924
- const s = {};
2925
- if (props.width) s.width = typeof props.width === "number" ? `${props.width}px` : props.width;
2926
- if (props.height) s.height = typeof props.height === "number" ? `${props.height}px` : props.height;
2927
- return s;
2928
- });
2929
- const classes = computed(() => {
2930
- const base = ["bg-bg-hover"];
2931
- switch (props.variant) {
2932
- case "circular":
2933
- base.push("rounded-full");
2934
- if (!props.width && !props.height) base.push("w-10 h-10");
2935
- break;
2936
- case "rectangular":
2937
- base.push("rounded-none");
2938
- if (!props.height) base.push("h-24");
2939
- break;
2940
- case "rounded":
2941
- base.push("rounded-mint");
2942
- if (!props.height) base.push("h-24");
2943
- break;
2944
- default:
2945
- base.push("rounded");
2946
- if (!props.height) base.push("h-4");
2947
- if (!props.width) base.push("w-full");
2948
- }
2949
- switch (props.animation) {
2950
- case "pulse":
2951
- base.push("animate-pulse");
2952
- break;
2953
- case "wave":
2954
- base.push("skeleton-wave");
2955
- break;
2956
- }
2957
- return base;
2958
- });
2959
- return (_ctx, _cache) => {
2960
- return openBlock(), createElementBlock("div", {
2961
- class: normalizeClass(classes.value),
2962
- style: normalizeStyle(style.value)
2963
- }, null, 6);
2964
- };
2965
- }
2966
- });
2967
- //#endregion
2968
- //#region src/components/EmptyState.vue?vue&type=script&setup=true&lang.ts
2969
- var _hoisted_1$59 = ["d"];
2970
- var _hoisted_2$51 = ["d"];
2971
- var _hoisted_3$47 = { class: "mint-empty-state__body" };
2972
- var _hoisted_4$45 = {
2973
- key: 0,
2974
- class: "mint-empty-state__title"
2975
- };
2976
- var _hoisted_5$43 = {
2977
- key: 1,
2978
- class: "mint-empty-state__description"
2979
- };
2980
- var _hoisted_6$42 = {
2981
- key: 0,
2982
- class: "mint-empty-state__action"
2983
- };
2984
- //#endregion
2985
- //#region src/components/EmptyState.vue
2986
- var EmptyState_default = /* @__PURE__ */ defineComponent({
2987
- __name: "EmptyState",
2988
- props: {
2989
- title: {},
2990
- description: {},
2991
- iconPath: {},
2992
- color: { default: "primary" },
2993
- size: { default: "md" },
2994
- variant: { default: "illustrated" },
2995
- actionLabel: {}
2996
- },
2997
- emits: ["action"],
2998
- setup(__props, { emit: __emit }) {
2999
- /** Empty-state placeholder with icon badge, headline, description, default slot, and optional CTA button. */
3000
- const emit = __emit;
3001
- const defaultIconPaths = [
3002
- "M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z",
3003
- "M7 11h10",
3004
- "M7 15h6",
3005
- "M7 7h8"
3006
- ];
3007
- return (_ctx, _cache) => {
3008
- return openBlock(), createElementBlock("div", { class: normalizeClass([
3009
- "mint-empty-state",
3010
- `mint-empty-state--${__props.variant}`,
3011
- `mint-empty-state--${__props.size}`
3012
- ]) }, [
3013
- createElementVNode("div", { class: normalizeClass(["mint-empty-state__icon-wrapper", `mint-empty-state__icon-wrapper--${__props.color}`]) }, [renderSlot(_ctx.$slots, "icon", {}, () => [(openBlock(), createElementBlock("svg", {
3014
- class: normalizeClass(["mint-empty-state__icon", `mint-empty-state__icon--${__props.color}`]),
3015
- viewBox: "0 0 24 24",
3016
- fill: "none",
3017
- stroke: "currentColor",
3018
- "stroke-width": "2",
3019
- "stroke-linecap": "round",
3020
- "stroke-linejoin": "round"
3021
- }, [__props.iconPath ? (openBlock(), createElementBlock("path", {
3022
- key: 0,
3023
- d: __props.iconPath
3024
- }, null, 8, _hoisted_1$59)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, renderList(defaultIconPaths, (d, i) => {
3025
- return createElementVNode("path", {
3026
- key: i,
3027
- d
3028
- }, null, 8, _hoisted_2$51);
3029
- }), 64))], 2))])], 2),
3030
- createElementVNode("div", _hoisted_3$47, [
3031
- __props.title ? (openBlock(), createElementBlock("h3", _hoisted_4$45, toDisplayString(__props.title), 1)) : createCommentVNode("", true),
3032
- __props.description ? (openBlock(), createElementBlock("p", _hoisted_5$43, toDisplayString(__props.description), 1)) : createCommentVNode("", true),
3033
- renderSlot(_ctx.$slots, "default")
3034
- ]),
3035
- __props.actionLabel ? (openBlock(), createElementBlock("div", _hoisted_6$42, [createVNode(BaseButton_default, { onClick: _cache[0] || (_cache[0] = ($event) => emit("action")) }, {
3036
- default: withCtx(() => [createTextVNode(toDisplayString(__props.actionLabel), 1)]),
3037
- _: 1
3038
- })])) : createCommentVNode("", true)
3039
- ], 2);
3040
- };
3041
- }
3042
- });
3043
- //#endregion
3044
- //#region src/components/ExperimentCodeBadge.vue?vue&type=script&setup=true&lang.ts
3045
- var _hoisted_1$58 = [
3046
- "role",
3047
- "tabindex",
3048
- "title"
3049
- ];
3050
- //#endregion
3051
- //#region src/components/ExperimentCodeBadge.vue
3052
- var ExperimentCodeBadge_default = /* @__PURE__ */ defineComponent({
3053
- __name: "ExperimentCodeBadge",
3054
- props: {
3055
- code: {},
3056
- size: { default: "md" },
3057
- copyable: {
3058
- type: Boolean,
3059
- default: true
3060
- }
3061
- },
3062
- emits: ["copy"],
3063
- setup(__props, { emit: __emit }) {
3064
- /** Inline badge that displays an experiment code and copies it to the clipboard on click. */
3065
- const props = __props;
3066
- const emit = __emit;
3067
- const copied = ref(false);
3068
- let copyTimeout = null;
3069
- async function handleCopy() {
3070
- if (!props.copyable) return;
3071
- try {
3072
- await navigator.clipboard.writeText(props.code);
3073
- copied.value = true;
3074
- emit("copy", props.code);
3075
- if (copyTimeout) clearTimeout(copyTimeout);
3076
- copyTimeout = setTimeout(() => {
3077
- copied.value = false;
3078
- }, 1500);
3079
- } catch {}
3080
- }
3081
- function handleKeydown(event) {
3082
- if (!props.copyable) return;
3083
- if (event.key === "Enter" || event.key === " ") {
3084
- event.preventDefault();
3085
- handleCopy();
3086
- }
3087
- }
3088
- return (_ctx, _cache) => {
3089
- return openBlock(), createElementBlock("span", {
3090
- class: normalizeClass([
3091
- "mint-exp-code",
3092
- `mint-exp-code--${__props.size}`,
3093
- {
3094
- "mint-exp-code--copyable": __props.copyable,
3095
- "mint-exp-code--copied": copied.value
3096
- }
3097
- ]),
3098
- role: __props.copyable ? "button" : void 0,
3099
- tabindex: __props.copyable ? 0 : void 0,
3100
- title: __props.copyable ? copied.value ? "Copied!" : "Click to copy" : void 0,
3101
- onClick: handleCopy,
3102
- onKeydown: handleKeydown
3103
- }, toDisplayString(copied.value ? "Copied!" : __props.code), 43, _hoisted_1$58);
3104
- };
3105
- }
3106
- });
3107
- //#endregion
3108
- //#region src/components/ExperimentSelectorModal.vue?vue&type=script&setup=true&lang.ts
3109
- var _hoisted_1$57 = { class: "mint-experiment-selector__filters-row" };
3110
- var _hoisted_2$50 = { class: "mint-experiment-selector__search" };
3111
- var _hoisted_3$46 = { class: "mint-experiment-selector__filter-select" };
3112
- var _hoisted_4$44 = {
3113
- key: 0,
3114
- class: "mint-experiment-selector__filter-select"
3115
- };
3116
- var _hoisted_5$42 = {
3117
- key: 0,
3118
- class: "mint-experiment-selector__filters-dot"
3119
- };
3120
- var _hoisted_6$41 = {
3121
- key: 0,
3122
- class: "mint-experiment-selector__filters-advanced"
3123
- };
3124
- var _hoisted_7$37 = {
3125
- key: 0,
3126
- class: "mint-experiment-selector__filter-select"
3127
- };
3128
- var _hoisted_8$34 = { class: "mint-experiment-selector__filter-select" };
3129
- var _hoisted_9$31 = { class: "mint-experiment-selector__filter-select" };
3130
- var _hoisted_10$28 = { class: "mint-experiment-selector__group-toggle" };
3131
- var _hoisted_11$26 = {
3132
- key: 1,
3133
- class: "mint-experiment-selector__skeleton"
3134
- };
3135
- var _hoisted_12$23 = { class: "mint-experiment-selector__skeleton-content" };
3136
- var _hoisted_13$22 = {
3137
- key: 2,
3138
- class: "mint-experiment-selector__error"
3139
- };
3140
- var _hoisted_14$19 = ["onClick"];
3141
- var _hoisted_15$18 = { class: "mint-experiment-selector__group-name" };
3142
- var _hoisted_16$16 = { class: "mint-experiment-selector__group-count" };
3143
- var _hoisted_17$16 = ["onClick", "onMouseenter"];
3144
- var _hoisted_18$14 = { class: "mint-experiment-selector__row-content" };
3145
- var _hoisted_19$14 = { class: "mint-experiment-selector__name" };
3146
- var _hoisted_20$13 = { class: "mint-experiment-selector__meta" };
3147
- var _hoisted_21$11 = ["onClick", "onMouseenter"];
3148
- var _hoisted_22$9 = { class: "mint-experiment-selector__row-content" };
3149
- var _hoisted_23$8 = { class: "mint-experiment-selector__name" };
3150
- var _hoisted_24$8 = { class: "mint-experiment-selector__meta" };
3151
- var _hoisted_25$8 = { key: 0 };
3152
- var _hoisted_26$8 = {
3153
- key: 6,
3154
- class: "mint-experiment-selector__footer"
3155
- };
3156
- //#endregion
3157
- //#region src/components/ExperimentSelectorModal.vue
3158
- var ExperimentSelectorModal_default = /* @__PURE__ */ defineComponent({
3159
- __name: "ExperimentSelectorModal",
3160
- props: {
3161
- modelValue: { type: Boolean },
3162
- experimentType: {},
3163
- currentExperimentId: { default: null },
3164
- title: { default: "Select Experiment" },
3165
- size: { default: "full" },
3166
- groupByProject: {
3167
- type: Boolean,
3168
- default: false
3169
- },
3170
- showFilters: {
3171
- type: Boolean,
3172
- default: false
3173
- }
3174
- },
3175
- emits: [
3176
- "update:modelValue",
3177
- "select",
3178
- "deselect"
3179
- ],
3180
- setup(__props, { emit: __emit }) {
3181
- /** Modal for searching and selecting an experiment from the platform list with filters and keyboard nav. */
1647
+ /** Card whose body collapses with a chevron-rotate animation, with an optional inline toggle switch independent of expand state. */
3182
1648
  const props = __props;
3183
1649
  const emit = __emit;
3184
- const { experiments, filters, isLoading, error, sortKey, experimentTypes, projects, groupedByProject, fetch: fetchExperiments, fetchFilterOptions } = useExperimentSelector({ experimentType: props.experimentType });
3185
- const activeIndex = ref(-1);
3186
- const listRef = ref(null);
3187
- const showAdvanced = ref(props.showFilters);
3188
- const groupToggle = ref(props.groupByProject);
3189
- const hasActiveAdvancedFilters = computed(() => !!(filters.project || filters.experimentType || filters.datePreset || sortKey.value !== "created_at:desc"));
3190
- const typeFilterOptions = computed(() => [{
3191
- value: "",
3192
- label: "All types"
3193
- }, ...experimentTypes.value.map((t) => ({
3194
- value: t.value,
3195
- label: t.label
3196
- }))]);
3197
- const projectFilterOptions = computed(() => [{
3198
- value: "",
3199
- label: "All projects"
3200
- }, ...projects.value]);
3201
- const flatExperiments = computed(() => {
3202
- if (!groupToggle.value) return experiments.value;
3203
- return groupedByProject.value.flatMap(([, exps]) => exps);
1650
+ const isOpen = ref(props.defaultOpen);
1651
+ const toggle = () => {
1652
+ if (!props.disabled) isOpen.value = !isOpen.value;
1653
+ };
1654
+ const handleToggleClick = (event) => {
1655
+ event.stopPropagation();
1656
+ emit("update:toggleValue", !props.toggleValue);
1657
+ };
1658
+ const headerClasses = computed(() => ["mint-collapsible-card__header", props.disabled ? "mint-collapsible-card__header--disabled" : ""]);
1659
+ const iconBgStyle = computed(() => ({ backgroundColor: props.iconBg || "var(--color-primary-soft)" }));
1660
+ const iconColorStyle = computed(() => ({ color: props.iconColor || "var(--color-primary)" }));
1661
+ const isSvgIcon = computed(() => isSvgIconValue(props.icon));
1662
+ const toggleTrackStyle = computed(() => {
1663
+ if (!props.toggleValue || !props.toggleColor) return {};
1664
+ return {
1665
+ backgroundColor: props.toggleColor,
1666
+ borderColor: props.toggleColor
1667
+ };
3204
1668
  });
3205
- function setFilter(key, value) {
3206
- filters[key] = String(value) || void 0;
3207
- }
3208
- function handleSortChange(value) {
3209
- sortKey.value = String(value) || "created_at:desc";
3210
- }
3211
- function handleSelect(experiment) {
3212
- emit("select", experiment);
3213
- emit("update:modelValue", false);
3214
- }
3215
- function handleDeselect() {
3216
- emit("deselect");
3217
- emit("update:modelValue", false);
3218
- }
3219
- function handleKeydown(event) {
3220
- const list = flatExperiments.value;
3221
- if (!list.length) return;
3222
- switch (event.key) {
3223
- case "ArrowDown":
3224
- event.preventDefault();
3225
- activeIndex.value = Math.min(activeIndex.value + 1, list.length - 1);
3226
- scrollActiveIntoView();
3227
- break;
3228
- case "ArrowUp":
3229
- event.preventDefault();
3230
- activeIndex.value = Math.max(activeIndex.value - 1, 0);
3231
- scrollActiveIntoView();
3232
- break;
3233
- case "Enter":
3234
- event.preventDefault();
3235
- if (activeIndex.value >= 0 && activeIndex.value < list.length) handleSelect(list[activeIndex.value]);
3236
- break;
3237
- }
1669
+ const badgeClasses = computed(() => ["mint-collapsible-card__badge", `mint-collapsible-card__badge--${props.badgeTone}`]);
1670
+ function isSvgIconValue(icon) {
1671
+ if (!icon) return false;
1672
+ return Array.isArray(icon) || icon.startsWith("M") || icon.startsWith("m");
3238
1673
  }
3239
- function scrollActiveIntoView() {
3240
- nextTick(() => {
3241
- (listRef.value?.querySelector(".mint-experiment-selector__row--focused"))?.scrollIntoView({ block: "nearest" });
3242
- });
1674
+ function actionClasses(action) {
1675
+ return [
1676
+ "mint-collapsible-card__action",
1677
+ action.tone ? `mint-collapsible-card__action--${action.tone}` : "",
1678
+ action.disabled ? "mint-collapsible-card__action--disabled" : ""
1679
+ ];
3243
1680
  }
3244
- const flatIndexMap = computed(() => {
3245
- const map = /* @__PURE__ */ new Map();
3246
- flatExperiments.value.forEach((exp, i) => map.set(exp.id, i));
3247
- return map;
3248
- });
3249
- function getFlatIndex(experiment) {
3250
- return flatIndexMap.value.get(experiment.id) ?? -1;
1681
+ function actionStyle(action) {
1682
+ return action.iconColor ? { color: action.iconColor } : {};
3251
1683
  }
3252
- const collapsedGroups = reactive(/* @__PURE__ */ new Set());
3253
- function toggleGroup(groupName) {
3254
- if (collapsedGroups.has(groupName)) collapsedGroups.delete(groupName);
3255
- else collapsedGroups.add(groupName);
1684
+ function handleActionClick(action) {
1685
+ if (props.disabled || action.disabled) return;
1686
+ emit("action", action.id);
3256
1687
  }
3257
- watch(experiments, () => {
3258
- activeIndex.value = -1;
3259
- });
3260
- watch(() => props.modelValue, (isOpen) => {
3261
- if (isOpen) {
3262
- activeIndex.value = -1;
3263
- collapsedGroups.clear();
3264
- fetchFilterOptions();
3265
- fetchExperiments();
3266
- }
3267
- });
3268
1688
  return (_ctx, _cache) => {
3269
- return openBlock(), createBlock(BaseModal_default, {
3270
- "model-value": __props.modelValue,
3271
- title: __props.title,
3272
- size: __props.size,
3273
- "onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => emit("update:modelValue", $event))
3274
- }, {
3275
- default: withCtx(() => [createElementVNode("div", {
3276
- class: "mint-experiment-selector",
3277
- onKeydown: handleKeydown
3278
- }, [
3279
- createElementVNode("div", _hoisted_1$57, [
3280
- createElementVNode("div", _hoisted_2$50, [createVNode(BaseInput_default, {
3281
- modelValue: unref(filters).search,
3282
- "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => unref(filters).search = $event),
3283
- placeholder: "Search experiments...",
3284
- size: "sm",
3285
- type: "search"
3286
- }, null, 8, ["modelValue"])]),
3287
- createElementVNode("div", _hoisted_3$46, [createVNode(BaseSelect_default, {
3288
- "model-value": unref(filters).status ?? "",
3289
- options: unref(EXPERIMENT_STATUS_OPTIONS),
3290
- size: "sm",
3291
- "onUpdate:modelValue": _cache[1] || (_cache[1] = (v) => setFilter("status", v))
3292
- }, null, 8, ["model-value", "options"])]),
3293
- typeFilterOptions.value.length > 1 ? (openBlock(), createElementBlock("div", _hoisted_4$44, [createVNode(BaseSelect_default, {
3294
- "model-value": unref(filters).experimentType ?? "",
3295
- options: typeFilterOptions.value,
3296
- size: "sm",
3297
- "onUpdate:modelValue": _cache[2] || (_cache[2] = (v) => setFilter("experimentType", v))
3298
- }, null, 8, ["model-value", "options"])])) : createCommentVNode("", true),
3299
- createElementVNode("button", {
3300
- class: normalizeClass(["mint-experiment-selector__filters-toggle", { "mint-experiment-selector__filters-toggle--active": hasActiveAdvancedFilters.value }]),
3301
- type: "button",
3302
- onClick: _cache[3] || (_cache[3] = ($event) => showAdvanced.value = !showAdvanced.value)
3303
- }, [
3304
- _cache[8] || (_cache[8] = createElementVNode("svg", {
3305
- width: "14",
3306
- height: "14",
3307
- viewBox: "0 0 24 24",
3308
- fill: "none",
3309
- stroke: "currentColor",
3310
- "stroke-width": "2",
3311
- "stroke-linecap": "round",
3312
- "stroke-linejoin": "round"
3313
- }, [
3314
- createElementVNode("line", {
3315
- x1: "4",
3316
- y1: "6",
3317
- x2: "20",
3318
- y2: "6"
3319
- }),
3320
- createElementVNode("line", {
3321
- x1: "8",
3322
- y1: "12",
3323
- x2: "20",
3324
- y2: "12"
3325
- }),
3326
- createElementVNode("line", {
3327
- x1: "12",
3328
- y1: "18",
3329
- x2: "20",
3330
- y2: "18"
3331
- }),
3332
- createElementVNode("circle", {
3333
- cx: "6",
3334
- cy: "12",
3335
- r: "2"
3336
- }),
3337
- createElementVNode("circle", {
3338
- cx: "10",
3339
- cy: "18",
3340
- r: "2"
3341
- }),
3342
- createElementVNode("circle", {
3343
- cx: "6",
3344
- cy: "6",
3345
- r: "2"
3346
- })
3347
- ], -1)),
3348
- _cache[9] || (_cache[9] = createTextVNode(" Filters ", -1)),
3349
- hasActiveAdvancedFilters.value ? (openBlock(), createElementBlock("span", _hoisted_5$42)) : createCommentVNode("", true)
3350
- ], 2)
3351
- ]),
3352
- showAdvanced.value ? (openBlock(), createElementBlock("div", _hoisted_6$41, [
3353
- projectFilterOptions.value.length > 1 ? (openBlock(), createElementBlock("div", _hoisted_7$37, [createVNode(BaseSelect_default, {
3354
- "model-value": unref(filters).project ?? "",
3355
- options: projectFilterOptions.value,
3356
- size: "sm",
3357
- "onUpdate:modelValue": _cache[4] || (_cache[4] = (v) => setFilter("project", v))
3358
- }, null, 8, ["model-value", "options"])])) : createCommentVNode("", true),
3359
- createElementVNode("div", _hoisted_8$34, [createVNode(BaseSelect_default, {
3360
- "model-value": unref(filters).datePreset ?? "",
3361
- options: unref(DATE_PRESET_OPTIONS),
3362
- size: "sm",
3363
- "onUpdate:modelValue": _cache[5] || (_cache[5] = (v) => setFilter("datePreset", v))
3364
- }, null, 8, ["model-value", "options"])]),
3365
- createElementVNode("div", _hoisted_9$31, [createVNode(BaseSelect_default, {
3366
- "model-value": unref(sortKey),
3367
- options: unref(SORT_OPTIONS),
3368
- size: "sm",
3369
- "onUpdate:modelValue": handleSortChange
3370
- }, null, 8, ["model-value", "options"])]),
3371
- createElementVNode("label", _hoisted_10$28, [withDirectives(createElementVNode("input", {
3372
- "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => groupToggle.value = $event),
3373
- type: "checkbox",
3374
- class: "mint-experiment-selector__group-checkbox"
3375
- }, null, 512), [[vModelCheckbox, groupToggle.value]]), _cache[10] || (_cache[10] = createTextVNode(" Group by project ", -1))])
3376
- ])) : createCommentVNode("", true),
3377
- unref(isLoading) ? (openBlock(), createElementBlock("div", _hoisted_11$26, [(openBlock(), createElementBlock(Fragment, null, renderList(4, (n) => {
3378
- return createElementVNode("div", {
3379
- key: n,
3380
- class: "mint-experiment-selector__skeleton-row"
3381
- }, [createElementVNode("div", _hoisted_12$23, [createVNode(Skeleton_default, {
3382
- width: 120 + n * 20,
3383
- height: "14px"
3384
- }, null, 8, ["width"]), createVNode(Skeleton_default, {
3385
- width: "80px",
3386
- height: "10px"
3387
- })]), createVNode(Skeleton_default, {
3388
- width: "60px",
3389
- height: "20px",
3390
- variant: "rounded"
3391
- })]);
3392
- }), 64))])) : unref(error) ? (openBlock(), createElementBlock("div", _hoisted_13$22, toDisplayString(unref(error)), 1)) : unref(experiments).length === 0 ? (openBlock(), createBlock(EmptyState_default, {
3393
- key: 3,
3394
- title: "No experiments found",
3395
- description: "Try adjusting your search or filters.",
3396
- size: "sm"
3397
- })) : groupToggle.value ? (openBlock(), createElementBlock("div", {
3398
- key: 4,
3399
- ref_key: "listRef",
3400
- ref: listRef,
3401
- class: "mint-experiment-selector__list"
3402
- }, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(groupedByProject), ([groupName, groupExps]) => {
3403
- return openBlock(), createElementBlock(Fragment, { key: groupName }, [createElementVNode("button", {
3404
- type: "button",
3405
- class: "mint-experiment-selector__group-header",
3406
- onClick: ($event) => toggleGroup(groupName)
3407
- }, [
3408
- (openBlock(), createElementBlock("svg", {
3409
- class: normalizeClass(["mint-experiment-selector__group-chevron", { "mint-experiment-selector__group-chevron--collapsed": collapsedGroups.has(groupName) }]),
3410
- width: "14",
3411
- height: "14",
3412
- viewBox: "0 0 24 24",
3413
- fill: "none",
3414
- stroke: "currentColor",
3415
- "stroke-width": "2",
3416
- "stroke-linecap": "round",
3417
- "stroke-linejoin": "round"
3418
- }, [..._cache[11] || (_cache[11] = [createElementVNode("polyline", { points: "6 9 12 15 18 9" }, null, -1)])], 2)),
3419
- createElementVNode("span", _hoisted_15$18, toDisplayString(groupName), 1),
3420
- createElementVNode("span", _hoisted_16$16, toDisplayString(groupExps.length), 1)
3421
- ], 8, _hoisted_14$19), !collapsedGroups.has(groupName) ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(groupExps, (exp) => {
3422
- return openBlock(), createElementBlock("div", {
3423
- key: exp.id,
3424
- class: normalizeClass(["mint-experiment-selector__row", {
3425
- "mint-experiment-selector__row--active": exp.id === __props.currentExperimentId,
3426
- "mint-experiment-selector__row--focused": getFlatIndex(exp) === activeIndex.value
3427
- }]),
3428
- onClick: ($event) => handleSelect(exp),
3429
- onMouseenter: ($event) => activeIndex.value = getFlatIndex(exp)
3430
- }, [createElementVNode("div", _hoisted_18$14, [createElementVNode("div", _hoisted_19$14, [createTextVNode(toDisplayString(exp.name) + " ", 1), exp.experiment_code ? (openBlock(), createBlock(ExperimentCodeBadge_default, {
3431
- key: 0,
3432
- code: exp.experiment_code,
3433
- size: "sm",
3434
- copyable: false
3435
- }, null, 8, ["code"])) : createCommentVNode("", true)]), createElementVNode("div", _hoisted_20$13, [createElementVNode("span", null, toDisplayString(unref(formatExperimentDate)(exp.created_at)), 1)])]), createVNode(BasePill_default, {
3436
- variant: unref(getExperimentStatusVariant)(exp.status),
3437
- size: "sm"
3438
- }, {
3439
- default: withCtx(() => [createTextVNode(toDisplayString(unref(formatExperimentStatus)(exp.status)), 1)]),
3440
- _: 2
3441
- }, 1032, ["variant"])], 42, _hoisted_17$16);
3442
- }), 128)) : createCommentVNode("", true)], 64);
3443
- }), 128))], 512)) : (openBlock(), createElementBlock("div", {
3444
- key: 5,
3445
- ref_key: "listRef",
3446
- ref: listRef,
3447
- class: "mint-experiment-selector__list"
3448
- }, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(experiments), (exp, idx) => {
3449
- return openBlock(), createElementBlock("div", {
3450
- key: exp.id,
3451
- class: normalizeClass(["mint-experiment-selector__row", {
3452
- "mint-experiment-selector__row--active": exp.id === __props.currentExperimentId,
3453
- "mint-experiment-selector__row--focused": idx === activeIndex.value
3454
- }]),
3455
- onClick: ($event) => handleSelect(exp),
3456
- onMouseenter: ($event) => activeIndex.value = idx
3457
- }, [createElementVNode("div", _hoisted_22$9, [createElementVNode("div", _hoisted_23$8, [createTextVNode(toDisplayString(exp.name) + " ", 1), exp.experiment_code ? (openBlock(), createBlock(ExperimentCodeBadge_default, {
3458
- key: 0,
3459
- code: exp.experiment_code,
3460
- size: "sm",
3461
- copyable: false
3462
- }, null, 8, ["code"])) : createCommentVNode("", true)]), createElementVNode("div", _hoisted_24$8, [exp.project_name || exp.project ? (openBlock(), createElementBlock("span", _hoisted_25$8, toDisplayString(exp.project_name || exp.project), 1)) : createCommentVNode("", true), createElementVNode("span", null, toDisplayString(unref(formatExperimentDate)(exp.created_at)), 1)])]), createVNode(BasePill_default, {
3463
- variant: unref(getExperimentStatusVariant)(exp.status),
3464
- size: "sm"
3465
- }, {
3466
- default: withCtx(() => [createTextVNode(toDisplayString(unref(formatExperimentStatus)(exp.status)), 1)]),
3467
- _: 2
3468
- }, 1032, ["variant"])], 42, _hoisted_21$11);
3469
- }), 128))], 512)),
3470
- __props.currentExperimentId != null ? (openBlock(), createElementBlock("div", _hoisted_26$8, [createElementVNode("button", {
1689
+ return openBlock(), createElementBlock("div", { class: normalizeClass(["mint-collapsible-card", __props.dense ? "mint-collapsible-card--dense" : ""]) }, [createElementVNode("div", _hoisted_1$57, [createElementVNode("button", {
1690
+ type: "button",
1691
+ class: normalizeClass(headerClasses.value),
1692
+ disabled: __props.disabled,
1693
+ "aria-expanded": isOpen.value,
1694
+ onClick: toggle
1695
+ }, [createElementVNode("div", _hoisted_3$46, [__props.icon ? (openBlock(), createElementBlock("div", {
1696
+ key: 0,
1697
+ class: "mint-collapsible-card__icon-badge",
1698
+ style: normalizeStyle(iconBgStyle.value)
1699
+ }, [isSvgIcon.value ? (openBlock(), createElementBlock("svg", {
1700
+ key: 0,
1701
+ class: "mint-collapsible-card__icon",
1702
+ style: normalizeStyle(iconColorStyle.value),
1703
+ viewBox: "0 0 24 24",
1704
+ fill: "none",
1705
+ stroke: "currentColor",
1706
+ "stroke-width": "2",
1707
+ "stroke-linecap": "round",
1708
+ "stroke-linejoin": "round"
1709
+ }, [Array.isArray(__props.icon) ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(__props.icon, (d, i) => {
1710
+ return openBlock(), createElementBlock("path", {
1711
+ key: i,
1712
+ d
1713
+ }, null, 8, _hoisted_4$45);
1714
+ }), 128)) : (openBlock(), createElementBlock("path", {
1715
+ key: 1,
1716
+ d: __props.icon
1717
+ }, null, 8, _hoisted_5$43))], 4)) : (openBlock(), createElementBlock("span", {
1718
+ key: 1,
1719
+ class: "mint-collapsible-card__icon-text",
1720
+ style: normalizeStyle(iconColorStyle.value)
1721
+ }, toDisplayString(__props.icon), 5))], 4)) : createCommentVNode("", true), createElementVNode("div", _hoisted_6$42, [createElementVNode("h3", _hoisted_7$38, toDisplayString(__props.title), 1), __props.subtitle ? (openBlock(), createElementBlock("p", _hoisted_8$35, toDisplayString(__props.subtitle), 1)) : createCommentVNode("", true)])])], 10, _hoisted_2$50), createElementVNode("div", _hoisted_9$32, [
1722
+ __props.badge !== void 0 ? (openBlock(), createElementBlock("span", {
1723
+ key: 0,
1724
+ class: normalizeClass(badgeClasses.value)
1725
+ }, toDisplayString(__props.badge), 3)) : createCommentVNode("", true),
1726
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.actions, (action) => {
1727
+ return openBlock(), createElementBlock("button", {
1728
+ key: action.id,
3471
1729
  type: "button",
3472
- class: "mint-experiment-selector__clear-btn",
3473
- onClick: handleDeselect
3474
- }, " Clear selection ")])) : createCommentVNode("", true)
3475
- ], 32)]),
3476
- _: 1
3477
- }, 8, [
3478
- "model-value",
3479
- "title",
3480
- "size"
3481
- ]);
1730
+ class: normalizeClass(actionClasses(action)),
1731
+ style: normalizeStyle(actionStyle(action)),
1732
+ disabled: __props.disabled || action.disabled,
1733
+ "aria-label": action.label,
1734
+ title: action.label,
1735
+ onClick: ($event) => handleActionClick(action)
1736
+ }, [action.icon && isSvgIconValue(action.icon) ? (openBlock(), createElementBlock("svg", _hoisted_11$26, [Array.isArray(action.icon) ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(action.icon, (d, i) => {
1737
+ return openBlock(), createElementBlock("path", {
1738
+ key: i,
1739
+ d
1740
+ }, null, 8, _hoisted_12$23);
1741
+ }), 128)) : (openBlock(), createElementBlock("path", {
1742
+ key: 1,
1743
+ d: action.icon
1744
+ }, null, 8, _hoisted_13$22))])) : action.icon ? (openBlock(), createElementBlock("span", _hoisted_14$19, toDisplayString(action.icon), 1)) : createCommentVNode("", true)], 14, _hoisted_10$28);
1745
+ }), 128)),
1746
+ __props.showToggle ? (openBlock(), createElementBlock("div", {
1747
+ key: 1,
1748
+ class: "mint-collapsible-card__toggle",
1749
+ onClick: handleToggleClick
1750
+ }, [createElementVNode("div", {
1751
+ role: "switch",
1752
+ tabindex: "0",
1753
+ "aria-checked": __props.toggleValue,
1754
+ class: normalizeClass(["mint-collapsible-card__toggle-track", __props.toggleValue ? "mint-collapsible-card__toggle-track--on" : ""]),
1755
+ style: normalizeStyle(toggleTrackStyle.value),
1756
+ onKeydown: [withKeys(withModifiers(handleToggleClick, ["prevent"]), ["enter"]), withKeys(withModifiers(handleToggleClick, ["prevent"]), ["space"])]
1757
+ }, [createElementVNode("span", { class: normalizeClass(["mint-collapsible-card__toggle-knob", __props.toggleValue ? "mint-collapsible-card__toggle-knob--on" : ""]) }, null, 2)], 46, _hoisted_15$18)])) : createCommentVNode("", true),
1758
+ createElementVNode("button", {
1759
+ type: "button",
1760
+ class: "mint-collapsible-card__chevron-button",
1761
+ disabled: __props.disabled,
1762
+ "aria-label": isOpen.value ? "Collapse section" : "Expand section",
1763
+ "aria-expanded": isOpen.value,
1764
+ onClick: toggle
1765
+ }, [(openBlock(), createElementBlock("svg", {
1766
+ class: normalizeClass(["mint-collapsible-card__chevron", isOpen.value ? "mint-collapsible-card__chevron--open" : ""]),
1767
+ fill: "none",
1768
+ stroke: "currentColor",
1769
+ "stroke-width": "2",
1770
+ "stroke-linecap": "round",
1771
+ "stroke-linejoin": "round",
1772
+ viewBox: "0 0 24 24",
1773
+ "aria-hidden": "true"
1774
+ }, [..._cache[0] || (_cache[0] = [createElementVNode("path", { d: "m6 9 6 6 6-6" }, null, -1)])], 2))], 8, _hoisted_16$16)
1775
+ ])]), createVNode(Transition, { name: "collapse" }, {
1776
+ default: withCtx(() => [withDirectives(createElementVNode("div", _hoisted_17$16, [createElementVNode("div", _hoisted_18$14, [renderSlot(_ctx.$slots, "default")])], 512), [[vShow, isOpen.value]])]),
1777
+ _: 3
1778
+ })], 2);
3482
1779
  };
3483
1780
  }
3484
1781
  });
@@ -3487,6 +1784,11 @@ var ExperimentSelectorModal_default = /* @__PURE__ */ defineComponent({
3487
1784
  var PLUGIN_ICON_FALLBACK_PATH = "M14 7v4a1 1 0 0 0 1 1h4M5 3h9l5 5v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z";
3488
1785
  var PATH_REGEX = /^[Mm][\s,\d\-.]/;
3489
1786
  var RASTER_DATA_URL_REGEX = /^data:image\/(png|jpeg|jpg|gif|webp);/;
1787
+ var VIEW_BOX_REGEX = /^-?\d+(?:\.\d+)?\s+-?\d+(?:\.\d+)?\s+\d+(?:\.\d+)?\s+\d+(?:\.\d+)?$/;
1788
+ var COLOR_REGEX = /^(#(?:[0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})|currentColor|white|black|none)$/i;
1789
+ var MAX_STRUCTURED_ICON_LENGTH = 8e3;
1790
+ var MAX_PATHS = 8;
1791
+ var MAX_STOPS = 8;
3490
1792
  function normalizePluginIconSource(icon) {
3491
1793
  return (icon ?? "").replace(/^[\s]+/, "");
3492
1794
  }
@@ -3496,6 +1798,11 @@ function detectPluginIcon(icon) {
3496
1798
  format: "fallback",
3497
1799
  value: PLUGIN_ICON_FALLBACK_PATH
3498
1800
  };
1801
+ const structured = parseStructuredPluginIcon(raw);
1802
+ if (structured) return {
1803
+ format: "structured",
1804
+ value: structured
1805
+ };
3499
1806
  if (PATH_REGEX.test(raw)) return {
3500
1807
  format: "path",
3501
1808
  value: raw
@@ -3517,6 +1824,93 @@ function isPluginIconFormat(icon) {
3517
1824
  const raw = normalizePluginIconSource(icon);
3518
1825
  return !!raw && detectPluginIcon(raw).format !== "fallback";
3519
1826
  }
1827
+ function parseStructuredPluginIcon(raw) {
1828
+ if (!raw.startsWith("{") || raw.length > MAX_STRUCTURED_ICON_LENGTH) return void 0;
1829
+ let parsed;
1830
+ try {
1831
+ parsed = JSON.parse(raw);
1832
+ } catch {
1833
+ return;
1834
+ }
1835
+ if (!isRecord(parsed) || parsed.type !== "mint-icon") return void 0;
1836
+ const viewBox = typeof parsed.viewBox === "string" && VIEW_BOX_REGEX.test(parsed.viewBox) ? parsed.viewBox : "0 0 24 24";
1837
+ const paths = parseStructuredPaths(parsed.paths);
1838
+ if (!paths.length) return void 0;
1839
+ const gradient = parseStructuredGradient(parsed.gradient);
1840
+ const background = parseStructuredBackground(parsed.background, gradient);
1841
+ return {
1842
+ type: "mint-icon",
1843
+ viewBox,
1844
+ ...background ? { background } : {},
1845
+ ...gradient ? { gradient } : {},
1846
+ paths
1847
+ };
1848
+ }
1849
+ function parseStructuredPaths(value) {
1850
+ if (!Array.isArray(value)) return [];
1851
+ return value.slice(0, MAX_PATHS).flatMap((item) => {
1852
+ if (!isRecord(item) || typeof item.d !== "string" || !item.d.trim()) return [];
1853
+ const path = { d: item.d.slice(0, 2e3) };
1854
+ if (isSafeColor(item.fill)) path.fill = item.fill;
1855
+ if (isSafeColor(item.stroke)) path.stroke = item.stroke;
1856
+ if (isFiniteNumber(item.strokeWidth, 0, 24)) path.strokeWidth = item.strokeWidth;
1857
+ if (isFiniteNumber(item.opacity, 0, 1)) path.opacity = item.opacity;
1858
+ return [path];
1859
+ });
1860
+ }
1861
+ function parseStructuredGradient(value) {
1862
+ if (!isRecord(value) || value.type !== "linear") return void 0;
1863
+ const stops = parseStructuredStops(value.stops);
1864
+ if (stops.length < 2 && isSafeColor(value.from) && isSafeColor(value.to)) stops.push({
1865
+ offset: "0%",
1866
+ color: value.from
1867
+ }, {
1868
+ offset: "100%",
1869
+ color: value.to
1870
+ });
1871
+ if (stops.length < 2) return void 0;
1872
+ return {
1873
+ type: "linear",
1874
+ angle: isFiniteNumber(value.angle, 0, 360) ? value.angle : 135,
1875
+ stops
1876
+ };
1877
+ }
1878
+ function parseStructuredStops(value) {
1879
+ if (!Array.isArray(value)) return [];
1880
+ return value.slice(0, MAX_STOPS).flatMap((item) => {
1881
+ if (!isRecord(item) || !isSafeColor(item.color)) return [];
1882
+ const offset = parseOffset(item.offset);
1883
+ if (!offset) return [];
1884
+ return [{
1885
+ offset,
1886
+ color: item.color,
1887
+ ...isFiniteNumber(item.opacity, 0, 1) ? { opacity: item.opacity } : {}
1888
+ }];
1889
+ });
1890
+ }
1891
+ function parseStructuredBackground(value, gradient) {
1892
+ if (!isRecord(value)) return void 0;
1893
+ const fill = value.fill === "gradient" && gradient ? "gradient" : isSafeColor(value.fill) ? value.fill : void 0;
1894
+ if (!fill) return void 0;
1895
+ return {
1896
+ fill,
1897
+ radius: isFiniteNumber(value.radius, 0, 12) ? value.radius : 5
1898
+ };
1899
+ }
1900
+ function parseOffset(value) {
1901
+ if (isFiniteNumber(value, 0, 1)) return String(value);
1902
+ if (typeof value !== "string") return void 0;
1903
+ if (/^(?:100|(?:[1-9]?\d)(?:\.\d+)?)%$/.test(value)) return value;
1904
+ }
1905
+ function isRecord(value) {
1906
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1907
+ }
1908
+ function isSafeColor(value) {
1909
+ return typeof value === "string" && COLOR_REGEX.test(value);
1910
+ }
1911
+ function isFiniteNumber(value, min, max) {
1912
+ return typeof value === "number" && Number.isFinite(value) && value >= min && value <= max;
1913
+ }
3520
1914
  //#endregion
3521
1915
  //#region src/components/internal/ActionItemInternal.vue?vue&type=script&setup=true&lang.ts
3522
1916
  var _hoisted_1$56 = [
@@ -3598,8 +1992,37 @@ var ActionItemInternal_default = /* @__PURE__ */ defineComponent({
3598
1992
  });
3599
1993
  //#endregion
3600
1994
  //#region src/components/PluginIcon.vue?vue&type=script&setup=true&lang.ts
3601
- var _hoisted_1$55 = {
3602
- key: 0,
1995
+ var _hoisted_1$55 = ["viewBox"];
1996
+ var _hoisted_2$48 = { key: 0 };
1997
+ var _hoisted_3$44 = [
1998
+ "id",
1999
+ "x1",
2000
+ "y1",
2001
+ "x2",
2002
+ "y2"
2003
+ ];
2004
+ var _hoisted_4$44 = [
2005
+ "offset",
2006
+ "stop-color",
2007
+ "stop-opacity"
2008
+ ];
2009
+ var _hoisted_5$42 = [
2010
+ "x",
2011
+ "y",
2012
+ "width",
2013
+ "height",
2014
+ "rx",
2015
+ "fill"
2016
+ ];
2017
+ var _hoisted_6$41 = [
2018
+ "d",
2019
+ "fill",
2020
+ "stroke",
2021
+ "stroke-width",
2022
+ "opacity"
2023
+ ];
2024
+ var _hoisted_7$37 = {
2025
+ key: 1,
3603
2026
  class: "mint-plugin-icon__svg",
3604
2027
  viewBox: "0 0 24 24",
3605
2028
  fill: "none",
@@ -3609,8 +2032,8 @@ var _hoisted_1$55 = {
3609
2032
  "stroke-linejoin": "round",
3610
2033
  "aria-hidden": "true"
3611
2034
  };
3612
- var _hoisted_2$48 = ["d"];
3613
- var _hoisted_3$44 = ["src"];
2035
+ var _hoisted_8$34 = ["d"];
2036
+ var _hoisted_9$31 = ["src"];
3614
2037
  //#endregion
3615
2038
  //#region src/components/PluginIcon.vue
3616
2039
  var PluginIcon_default = /* @__PURE__ */ defineComponent({
@@ -3624,6 +2047,7 @@ var PluginIcon_default = /* @__PURE__ */ defineComponent({
3624
2047
  },
3625
2048
  setup(__props) {
3626
2049
  /** Renders a plugin's icon as a sized chip. Auto-detects format:
2050
+ * - Structured MINT icon JSON ({"type":"mint-icon",...}) → controlled multi-color SVG
3627
2051
  * - SVG path data (e.g. "M13 10V3...") → inline <svg><path>
3628
2052
  * - Raster data URL (data:image/png|jpeg|jpg|gif|webp;...) → <img>
3629
2053
  * - https:// URL → <img> with no-referrer + lazy loading
@@ -3633,6 +2057,40 @@ var PluginIcon_default = /* @__PURE__ */ defineComponent({
3633
2057
  * (mixed-content + XSS, see spec 2026-05-04-plugin-icon-component-design.md). */
3634
2058
  const props = __props;
3635
2059
  const detected = computed(() => detectPluginIcon(props.icon));
2060
+ const structuredIcon = computed(() => detected.value.format === "structured" ? detected.value.value : void 0);
2061
+ const iconValue = computed(() => typeof detected.value.value === "string" ? detected.value.value : "");
2062
+ const gradientId = computed(() => {
2063
+ const source = props.icon ?? "";
2064
+ let hash = 0;
2065
+ for (let index = 0; index < source.length; index += 1) hash = (hash << 5) - hash + source.charCodeAt(index) | 0;
2066
+ return `mint-plugin-icon-gradient-${Math.abs(hash)}`;
2067
+ });
2068
+ const gradientCoords = computed(() => {
2069
+ const radians = ((structuredIcon.value?.gradient?.angle ?? 135) - 90) * Math.PI / 180;
2070
+ const x = Math.cos(radians) * 50;
2071
+ const y = Math.sin(radians) * 50;
2072
+ return {
2073
+ x1: `${50 - x}%`,
2074
+ y1: `${50 - y}%`,
2075
+ x2: `${50 + x}%`,
2076
+ y2: `${50 + y}%`
2077
+ };
2078
+ });
2079
+ const structuredViewBox = computed(() => {
2080
+ const parts = structuredIcon.value?.viewBox.split(/\s+/).map(Number) ?? [
2081
+ 0,
2082
+ 0,
2083
+ 24,
2084
+ 24
2085
+ ];
2086
+ return {
2087
+ x: parts[0],
2088
+ y: parts[1],
2089
+ width: parts[2],
2090
+ height: parts[3]
2091
+ };
2092
+ });
2093
+ const backgroundFill = computed(() => structuredIcon.value?.background?.fill === "gradient" ? `url(#${gradientId.value})` : structuredIcon.value?.background?.fill);
3636
2094
  const rootClasses = computed(() => [
3637
2095
  "mint-plugin-icon",
3638
2096
  `mint-plugin-icon--${props.size}`,
@@ -3643,14 +2101,55 @@ var PluginIcon_default = /* @__PURE__ */ defineComponent({
3643
2101
  return openBlock(), createElementBlock("span", {
3644
2102
  class: normalizeClass(rootClasses.value),
3645
2103
  style: normalizeStyle(rootStyle.value)
3646
- }, [detected.value.format === "path" || detected.value.format === "fallback" ? (openBlock(), createElementBlock("svg", _hoisted_1$55, [createElementVNode("path", { d: detected.value.value }, null, 8, _hoisted_2$48)])) : (openBlock(), createElementBlock("img", {
3647
- key: 1,
2104
+ }, [structuredIcon.value ? (openBlock(), createElementBlock("svg", {
2105
+ key: 0,
2106
+ class: "mint-plugin-icon__svg mint-plugin-icon__svg--structured",
2107
+ viewBox: structuredIcon.value.viewBox,
2108
+ "aria-hidden": "true"
2109
+ }, [
2110
+ structuredIcon.value.gradient ? (openBlock(), createElementBlock("defs", _hoisted_2$48, [createElementVNode("linearGradient", {
2111
+ id: gradientId.value,
2112
+ x1: gradientCoords.value.x1,
2113
+ y1: gradientCoords.value.y1,
2114
+ x2: gradientCoords.value.x2,
2115
+ y2: gradientCoords.value.y2
2116
+ }, [(openBlock(true), createElementBlock(Fragment, null, renderList(structuredIcon.value.gradient.stops, (stop) => {
2117
+ return openBlock(), createElementBlock("stop", {
2118
+ key: `${stop.offset}-${stop.color}`,
2119
+ offset: stop.offset,
2120
+ "stop-color": stop.color,
2121
+ "stop-opacity": stop.opacity
2122
+ }, null, 8, _hoisted_4$44);
2123
+ }), 128))], 8, _hoisted_3$44)])) : createCommentVNode("", true),
2124
+ structuredIcon.value.background ? (openBlock(), createElementBlock("rect", {
2125
+ key: 1,
2126
+ x: structuredViewBox.value.x,
2127
+ y: structuredViewBox.value.y,
2128
+ width: structuredViewBox.value.width,
2129
+ height: structuredViewBox.value.height,
2130
+ rx: structuredIcon.value.background.radius,
2131
+ fill: backgroundFill.value
2132
+ }, null, 8, _hoisted_5$42)) : createCommentVNode("", true),
2133
+ (openBlock(true), createElementBlock(Fragment, null, renderList(structuredIcon.value.paths, (path, index) => {
2134
+ return openBlock(), createElementBlock("path", {
2135
+ key: index,
2136
+ d: path.d,
2137
+ fill: path.fill ?? "none",
2138
+ stroke: path.stroke,
2139
+ "stroke-width": path.strokeWidth,
2140
+ opacity: path.opacity,
2141
+ "stroke-linecap": "round",
2142
+ "stroke-linejoin": "round"
2143
+ }, null, 8, _hoisted_6$41);
2144
+ }), 128))
2145
+ ], 8, _hoisted_1$55)) : detected.value.format === "path" || detected.value.format === "fallback" ? (openBlock(), createElementBlock("svg", _hoisted_7$37, [createElementVNode("path", { d: iconValue.value }, null, 8, _hoisted_8$34)])) : (openBlock(), createElementBlock("img", {
2146
+ key: 2,
3648
2147
  class: "mint-plugin-icon__img",
3649
- src: detected.value.value,
2148
+ src: iconValue.value,
3650
2149
  alt: "",
3651
2150
  referrerpolicy: "no-referrer",
3652
2151
  loading: "lazy"
3653
- }, null, 8, _hoisted_3$44))], 6);
2152
+ }, null, 8, _hoisted_9$31))], 6);
3654
2153
  };
3655
2154
  }
3656
2155
  });
@@ -4425,6 +2924,9 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
4425
2924
  setup(__props, { emit: __emit }) {
4426
2925
  /** Full application top bar with brand logo, page selector or plugin switcher, centered pill nav, experiment popover, and avatar menu. */
4427
2926
  const props = __props;
2927
+ const SettingsModal = defineAsyncComponent(() => import("./SettingsModal-L7Ejny45.js"));
2928
+ const ExperimentPopover = defineAsyncComponent(() => import("./ExperimentPopover-D0bg_fqM.js"));
2929
+ const ExperimentSelectorModal = defineAsyncComponent(() => import("./ExperimentSelectorModal-B_kPbXcg.js"));
4428
2930
  const emit = __emit;
4429
2931
  const settingsOpen = ref(false);
4430
2932
  const { isIntegrated, plugin } = usePlatformContext();
@@ -4532,7 +3034,7 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
4532
3034
  }, null, 8, ["items", "current-item-id"])) : createCommentVNode("", true)])])) : createCommentVNode("", true),
4533
3035
  createElementVNode("div", _hoisted_12$21, [
4534
3036
  __props.showStandaloneLabel && isStandalone.value && !unref(appExperiment) ? (openBlock(), createElementBlock("span", _hoisted_13$21, toDisplayString(__props.standaloneLabel), 1)) : createCommentVNode("", true),
4535
- unref(appExperiment) && !isStandalone.value ? (openBlock(), createBlock(ExperimentPopover_default, mergeProps({ key: 1 }, unref(appExperiment).popover.value, {
3037
+ unref(appExperiment) && !isStandalone.value ? (openBlock(), createBlock(unref(ExperimentPopover), mergeProps({ key: 1 }, unref(appExperiment).popover.value, {
4536
3038
  onSelect: _cache[5] || (_cache[5] = ($event) => unref(appExperiment).openModal()),
4537
3039
  onSave: _cache[6] || (_cache[6] = ($event) => unref(appExperiment).handleSave()),
4538
3040
  onDetach: _cache[7] || (_cache[7] = ($event) => unref(appExperiment).handleDetach())
@@ -4625,7 +3127,7 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
4625
3127
  }, [createElementVNode("div", _hoisted_16$15, toDisplayString(profileInitial.value), 1), __props.userName ? (openBlock(), createElementBlock("span", _hoisted_17$15, toDisplayString(__props.userName), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true)
4626
3128
  ])
4627
3129
  ])], 2),
4628
- __props.showSettings ? (openBlock(), createBlock(SettingsModal_default, {
3130
+ __props.showSettings && settingsOpen.value ? (openBlock(), createBlock(unref(SettingsModal), {
4629
3131
  key: 0,
4630
3132
  modelValue: settingsOpen.value,
4631
3133
  "onUpdate:modelValue": _cache[14] || (_cache[14] = ($event) => settingsOpen.value = $event),
@@ -4665,7 +3167,7 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
4665
3167
  "enhancements",
4666
3168
  "user-type"
4667
3169
  ])) : createCommentVNode("", true),
4668
- unref(appExperiment) && !isStandalone.value ? (openBlock(), createBlock(ExperimentSelectorModal_default, mergeProps({ key: 1 }, unref(appExperiment).selectorModal.value, {
3170
+ unref(appExperiment) && !isStandalone.value && unref(appExperiment).selectorModal.value.modelValue ? (openBlock(), createBlock(unref(ExperimentSelectorModal), mergeProps({ key: 1 }, unref(appExperiment).selectorModal.value, {
4669
3171
  "onUpdate:modelValue": _cache[16] || (_cache[16] = ($event) => $event ? unref(appExperiment).openModal() : unref(appExperiment).closeModal()),
4670
3172
  onSelect: _cache[17] || (_cache[17] = ($event) => unref(appExperiment).handleSelect($event)),
4671
3173
  onDeselect: _cache[18] || (_cache[18] = ($event) => unref(appExperiment).handleDetach())
@@ -16823,7 +15325,11 @@ var ExperimentDataViewer_default = /* @__PURE__ */ defineComponent({
16823
15325
  default: false
16824
15326
  },
16825
15327
  downloadJsonUrl: {},
16826
- downloadCsvUrl: {}
15328
+ downloadCsvUrl: {},
15329
+ autoFetch: {
15330
+ type: Boolean,
15331
+ default: true
15332
+ }
16827
15333
  },
16828
15334
  emits: [
16829
15335
  "open-plugin",
@@ -16836,7 +15342,7 @@ var ExperimentDataViewer_default = /* @__PURE__ */ defineComponent({
16836
15342
  const expData = useExperimentData();
16837
15343
  const hasPropData = computed(() => props.treeData && props.treeData.length > 0 || props.summaryData);
16838
15344
  watch(() => props.experimentId, (id) => {
16839
- if (id && !hasPropData.value) expData.fetch(id);
15345
+ if (props.autoFetch && id && !hasPropData.value) expData.fetch(id);
16840
15346
  }, { immediate: true });
16841
15347
  const mergedTreeData = computed(() => props.treeData?.length ? props.treeData : expData.treeData.value);
16842
15348
  const mergedTableData = computed(() => props.tableData?.length ? props.tableData : expData.tableData.value);
@@ -16916,22 +15422,24 @@ var ExperimentDataViewer_default = /* @__PURE__ */ defineComponent({
16916
15422
  default: withCtx(() => [createTextVNode(" Open in " + toDisplayString(__props.pluginName || "Plugin"), 1)]),
16917
15423
  _: 1
16918
15424
  })) : createCommentVNode("", true),
16919
- createVNode(BaseButton_default, {
15425
+ __props.downloadJsonUrl ? (openBlock(), createBlock(BaseButton_default, {
15426
+ key: 1,
16920
15427
  variant: "ghost",
16921
15428
  size: "sm",
16922
15429
  onClick: handleDownloadJson
16923
15430
  }, {
16924
15431
  default: withCtx(() => [..._cache[2] || (_cache[2] = [createTextVNode(" JSON ", -1)])]),
16925
15432
  _: 1
16926
- }),
16927
- createVNode(BaseButton_default, {
15433
+ })) : createCommentVNode("", true),
15434
+ __props.downloadCsvUrl ? (openBlock(), createBlock(BaseButton_default, {
15435
+ key: 2,
16928
15436
  variant: "ghost",
16929
15437
  size: "sm",
16930
15438
  onClick: handleDownloadCsv
16931
15439
  }, {
16932
15440
  default: withCtx(() => [..._cache[3] || (_cache[3] = [createTextVNode(" CSV ", -1)])]),
16933
15441
  _: 1
16934
- })
15442
+ })) : createCommentVNode("", true)
16935
15443
  ])]), createElementVNode("div", _hoisted_5$2, [isLoading.value ? (openBlock(), createElementBlock("div", _hoisted_6$2, [createElementVNode("div", _hoisted_7$1, [
16936
15444
  createVNode(Skeleton_default, {
16937
15445
  width: "40%",
@@ -17501,6 +16009,6 @@ var components_exports = /* @__PURE__ */ __exportAll({
17501
16009
  WellPlate: () => WellPlate_default
17502
16010
  });
17503
16011
  //#endregion
17504
- export { SampleLegend_default as $, ReagentEditor_default as A, SegmentedControl_default as At, ProgressBar_default as B, formatSequenceRemaining as C, AppToastContainer_default as Ct, ScientificNumber_default as D, Calendar_default as Dt, ChemicalFormula_default as E, DataFrame_default as Et, BioTemplateExperimentWorkspaceView_default as F, ControlWorkspaceView_default as G, Divider_default as H, BioTemplateRenderer_default as I, SampleSelector_default as J, ComponentBindingRenderer_default as K, ChartContainer_default as L, RackEditor_default as M, BaseTabs_default as Mt, BioTemplatePresetWorkspaceView_default as N, ColorSlider_default as Nt, ProtocolStepEditor_default as O, DropdownButton_default as Ot, BioTemplatePackWorkspaceView_default as P, BaseButton_default as Pt, PlateMapEditor_default as Q, Breadcrumb_default as R, formatSequenceEta as S, IconButton_default as St, sequenceSamplesRemaining as T, FormField_default as Tt, AppContainer_default as U, StatusIndicator_default as V, DoseDesignWorkspaceView_default as W, LoadingSpinner_default as X, AutoGroupModal_default as Y, ReagentList_default as Z, InstrumentStateBadge_default as _, ExperimentPopover_default as _t, ExperimentDataViewer_default as a, AppSidebar_default as at, estimateSequenceFinishDate as b, CollapsibleCard_default as bt, LcmsSequenceTable_default as c, StepWizard_default as ct, extractLcmsCommonPrefix as d, AppAvatarMenu_default as dt, WellPlate_default as et, extractLcmsSampleName as f, PluginIcon_default as ft, InstrumentStatusCard_default as g, Skeleton_default as gt, reconstructLcmsPlateCellsFromSequenceItems as h, EmptyState_default as ht, TimeRangeInput_default as i, AppLayout_default as it, GroupAssigner_default as j, BaseModal_default as jt, SampleHierarchyTree_default as k, BasePill_default as kt, DEFAULT_LCMS_SEQUENCE_COLUMNS as l, AppTopBar_default as lt, lcmsWellIdFromPosition as m, ExperimentCodeBadge_default as mt, FitPanel_default as n, DoseCalculator_default as nt, BatchProgressList_default as o, FormBuilder_default as ot, inferLcmsPlateTypeFromWellIds as p, ExperimentSelectorModal_default as pt, ScheduleCalendar_default as q, ResourceCard_default as r, PluginWorkspaceView_default as rt, AuditTrail_default as s, FormActions_default as st, components_exports as t, ExperimentTimeline_default as tt, basenameFromWindowsPath as u, AppPluginSwitcher_default as ut, InstrumentAlertLog_default as v, ConfirmDialog_default as vt, sequenceProgressPercent as w, AlertBox_default as wt, estimateSequenceRemainingSeconds as x, ThemeToggle_default as xt, SequenceProgressBar_default as y, SettingsModal_default as yt, Avatar_default as z };
16012
+ export { SampleLegend_default as $, ReagentEditor_default as A, ProgressBar_default as B, formatSequenceRemaining as C, ColorSlider_default as Ct, ScientificNumber_default as D, ChemicalFormula_default as E, BioTemplateExperimentWorkspaceView_default as F, ControlWorkspaceView_default as G, Divider_default as H, BioTemplateRenderer_default as I, SampleSelector_default as J, ComponentBindingRenderer_default as K, ChartContainer_default as L, RackEditor_default as M, BioTemplatePresetWorkspaceView_default as N, ProtocolStepEditor_default as O, BioTemplatePackWorkspaceView_default as P, PlateMapEditor_default as Q, Breadcrumb_default as R, formatSequenceEta as S, BaseTabs_default as St, sequenceSamplesRemaining as T, AppContainer_default as U, StatusIndicator_default as V, DoseDesignWorkspaceView_default as W, LoadingSpinner_default as X, AutoGroupModal_default as Y, ReagentList_default as Z, InstrumentStateBadge_default as _, AlertBox_default as _t, ExperimentDataViewer_default as a, AppSidebar_default as at, estimateSequenceFinishDate as b, DropdownButton_default as bt, LcmsSequenceTable_default as c, StepWizard_default as ct, extractLcmsCommonPrefix as d, AppAvatarMenu_default as dt, WellPlate_default as et, extractLcmsSampleName as f, PluginIcon_default as ft, InstrumentStatusCard_default as g, AppToastContainer_default as gt, reconstructLcmsPlateCellsFromSequenceItems as h, IconButton_default as ht, TimeRangeInput_default as i, AppLayout_default as it, GroupAssigner_default as j, SampleHierarchyTree_default as k, DEFAULT_LCMS_SEQUENCE_COLUMNS as l, AppTopBar_default as lt, lcmsWellIdFromPosition as m, ThemeToggle_default as mt, FitPanel_default as n, DoseCalculator_default as nt, BatchProgressList_default as o, FormBuilder_default as ot, inferLcmsPlateTypeFromWellIds as p, CollapsibleCard_default as pt, ScheduleCalendar_default as q, ResourceCard_default as r, PluginWorkspaceView_default as rt, AuditTrail_default as s, FormActions_default as st, components_exports as t, ExperimentTimeline_default as tt, basenameFromWindowsPath as u, AppPluginSwitcher_default as ut, InstrumentAlertLog_default as v, DataFrame_default as vt, sequenceProgressPercent as w, estimateSequenceRemainingSeconds as x, SegmentedControl_default as xt, SequenceProgressBar_default as y, Calendar_default as yt, Avatar_default as z };
17505
16013
 
17506
- //# sourceMappingURL=components-DtX3LDLq.js.map
16014
+ //# sourceMappingURL=components-CdjRzHI2.js.map