@morscherlab/mint-sdk 1.4.0-beta.10 → 1.4.0-beta.12

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 (73) hide show
  1. package/dist/{AlertBox-B2Bgr3ei.js → AlertBox-BdoZqANv.js} +2 -2
  2. package/dist/{AlertBox-B2Bgr3ei.js.map → AlertBox-BdoZqANv.js.map} +1 -1
  3. package/dist/{AppSidebar-mvm--GxN.js → AppSidebar-DGK5i-hJ.js} +7 -7
  4. package/dist/{AppSidebar-mvm--GxN.js.map → AppSidebar-DGK5i-hJ.js.map} +1 -1
  5. package/dist/{ExperimentPopover-5T1fAq2L.js → ExperimentPopover-CbD7BR_s.js} +2 -2
  6. package/dist/{ExperimentPopover-5T1fAq2L.js.map → ExperimentPopover-CbD7BR_s.js.map} +1 -1
  7. package/dist/{ExperimentSelectorModal-65peG4Up.js → ExperimentSelectorModal-BoofZZxF.js} +4 -4
  8. package/dist/{ExperimentSelectorModal-65peG4Up.js.map → ExperimentSelectorModal-BoofZZxF.js.map} +1 -1
  9. package/dist/{SegmentedControl-BtnnjWzs.js → SegmentedControl-BkwYOKpG.js} +2 -2
  10. package/dist/{SegmentedControl-BtnnjWzs.js.map → SegmentedControl-BkwYOKpG.js.map} +1 -1
  11. package/dist/{SettingsModal-DO3IZ7qz.js → SettingsModal-BXsjIVnm.js} +25 -24
  12. package/dist/SettingsModal-BXsjIVnm.js.map +1 -0
  13. package/dist/__tests__/styles/paletteTokens.test.d.ts +1 -0
  14. package/dist/__tests__/styles/v2AuditRules.test.d.ts +1 -0
  15. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +1 -1
  16. package/dist/{controlSchemaModel-B8CTXagP.js → controlSchemaModel-BF5g4wRC.js} +2 -2
  17. package/dist/{controlSchemaModel-B8CTXagP.js.map → controlSchemaModel-BF5g4wRC.js.map} +1 -1
  18. package/dist/{data-CgILxDLW.js → data-ihsBd9bs.js} +10 -10
  19. package/dist/{data-CgILxDLW.js.map → data-ihsBd9bs.js.map} +1 -1
  20. package/dist/data.js +7 -7
  21. package/dist/{experiment-43OJtH7R.js → experiment-DyO54FQB.js} +25 -61
  22. package/dist/experiment-DyO54FQB.js.map +1 -0
  23. package/dist/index.js +18 -18
  24. package/dist/{install-CsPFJSx3.js → install-CFgfRO64.js} +13 -13
  25. package/dist/{install-CsPFJSx3.js.map → install-CFgfRO64.js.map} +1 -1
  26. package/dist/install.js +1 -1
  27. package/dist/{lab-MHzp-_J8.js → lab-B-pLwc5U.js} +10 -10
  28. package/dist/{lab-MHzp-_J8.js.map → lab-B-pLwc5U.js.map} +1 -1
  29. package/dist/lab.js +4 -4
  30. package/dist/{records-B6gpM_3e.js → records-DnK_1Q_S.js} +2 -2
  31. package/dist/{records-B6gpM_3e.js.map → records-DnK_1Q_S.js.map} +1 -1
  32. package/dist/{runtime-8bs8EogX.js → runtime-pKfF_iql.js} +9 -9
  33. package/dist/{runtime-8bs8EogX.js.map → runtime-pKfF_iql.js.map} +1 -1
  34. package/dist/runtime.js +7 -7
  35. package/dist/{shell-CywENwBT.js → shell-BIH8Rc21.js} +4 -4
  36. package/dist/{shell-CywENwBT.js.map → shell-BIH8Rc21.js.map} +1 -1
  37. package/dist/shell.js +4 -4
  38. package/dist/stores/index.d.ts +1 -1
  39. package/dist/stores/index.js +2 -2
  40. package/dist/stores/settings.d.ts +4 -12
  41. package/dist/styles.css +165 -43
  42. package/dist/types/platform.d.ts +1 -1
  43. package/dist/{useExperimentSamples-DHnxKFAF.js → useExperimentSamples-BGN1dmcR.js} +4 -4
  44. package/dist/{useExperimentSamples-DHnxKFAF.js.map → useExperimentSamples-BGN1dmcR.js.map} +1 -1
  45. package/dist/{useListReorder-BitdUhxn.js → useListReorder-DPynGrCj.js} +3 -3
  46. package/dist/{useListReorder-BitdUhxn.js.map → useListReorder-DPynGrCj.js.map} +1 -1
  47. package/dist/{useRackEditor-DiwCt77M.js → useRackEditor-B2FrQA0p.js} +8 -8
  48. package/dist/{useRackEditor-DiwCt77M.js.map → useRackEditor-B2FrQA0p.js.map} +1 -1
  49. package/dist/{useRealtime-C3iy9QkU.js → useRealtime-yWjTTnc9.js} +2 -2
  50. package/dist/{useRealtime-C3iy9QkU.js.map → useRealtime-yWjTTnc9.js.map} +1 -1
  51. package/dist/{useRequest-D506eHi8.js → useRequest-Dqw12k2s.js} +3 -3
  52. package/dist/{useRequest-D506eHi8.js.map → useRequest-Dqw12k2s.js.map} +1 -1
  53. package/package.json +1 -1
  54. package/src/__tests__/components/SettingsModal.test.ts +9 -2
  55. package/src/__tests__/stores/settings.test.ts +21 -21
  56. package/src/__tests__/styles/paletteTokens.test.ts +44 -0
  57. package/src/__tests__/styles/v2AuditRules.test.ts +96 -0
  58. package/src/components/GeneratedResultRenderer.vue +3 -4
  59. package/src/components/SettingsModal.vue +7 -12
  60. package/src/stores/index.ts +0 -2
  61. package/src/stores/settings.ts +20 -50
  62. package/src/styles/components/app-layout.css +3 -2
  63. package/src/styles/components/app-top-bar.css +3 -3
  64. package/src/styles/components/dataframe.css +1 -1
  65. package/src/styles/components/modal.css +2 -2
  66. package/src/styles/components/number-input.css +1 -1
  67. package/src/styles/components/progress-bar.css +3 -3
  68. package/src/styles/components/section-card.css +4 -2
  69. package/src/styles/components/settings-modal.css +7 -2
  70. package/src/styles/variables.css +131 -15
  71. package/src/types/platform.ts +1 -1
  72. package/dist/SettingsModal-DO3IZ7qz.js.map +0 -1
  73. package/dist/experiment-43OJtH7R.js.map +0 -1
package/dist/runtime.js CHANGED
@@ -1,8 +1,8 @@
1
- import { i as AuthenticationRequiredError, o as useApi } from "./experiment-43OJtH7R.js";
2
- import { c as isTerminalJobStatus, d as normalizeJobState, f as resolveJobCapabilities, l as jobStatusLabel, o as resolveCurrentPluginId, s as isActiveJobStatus, u as normalizeJobPercent } from "./records-B6gpM_3e.js";
3
- import { A as createGeneratedAnalysisTransport, D as GeneratedPathInput_default, _ as getFieldRegistryEntry, j as useJobsEndpoint, v as getTypeDefault } from "./useListReorder-BitdUhxn.js";
4
- import { a as GeneratedPlotlyResult_default, c as downloadEndpoint, d as useEventStream, f as useSettingsEndpoint, i as GeneratedResultRenderer_default, l as pluginFormDataFromPayload, m as resolvePluginBaseUrl, o as createClient, p as buildEndpointUrl, u as uploadEndpoint } from "./useRackEditor-DiwCt77M.js";
5
- import { a as ComponentBindingRenderer_default, c as generatedJobFormSchema, f as useControlWorkspace, i as RuntimeUpdateNotice_default, l as normalizeGeneratedJobInput, n as PresenceAvatars_default, o as GeneratedPluginView_default, r as usePresence, s as generatedJobDefaults } from "./runtime-8bs8EogX.js";
6
- import { A as getDefaultControlView, C as controlBindings, D as controlsTo, S as useControlSchema, b as defineControls, d as useForm, l as useFormBuilder, u as evaluateCondition, x as getControlDefaults, y as defineControlComponentBindings } from "./AppSidebar-mvm--GxN.js";
7
- import { a as combinePluginJobSources, o as useJobCenter, r as useRealtime } from "./useRealtime-C3iy9QkU.js";
1
+ import { i as AuthenticationRequiredError, o as useApi } from "./experiment-DyO54FQB.js";
2
+ import { c as isTerminalJobStatus, d as normalizeJobState, f as resolveJobCapabilities, l as jobStatusLabel, o as resolveCurrentPluginId, s as isActiveJobStatus, u as normalizeJobPercent } from "./records-DnK_1Q_S.js";
3
+ import { A as createGeneratedAnalysisTransport, D as GeneratedPathInput_default, _ as getFieldRegistryEntry, j as useJobsEndpoint, v as getTypeDefault } from "./useListReorder-DPynGrCj.js";
4
+ import { a as GeneratedPlotlyResult_default, c as downloadEndpoint, d as useEventStream, f as useSettingsEndpoint, i as GeneratedResultRenderer_default, l as pluginFormDataFromPayload, m as resolvePluginBaseUrl, o as createClient, p as buildEndpointUrl, u as uploadEndpoint } from "./useRackEditor-B2FrQA0p.js";
5
+ import { a as ComponentBindingRenderer_default, c as generatedJobFormSchema, f as useControlWorkspace, i as RuntimeUpdateNotice_default, l as normalizeGeneratedJobInput, n as PresenceAvatars_default, o as GeneratedPluginView_default, r as usePresence, s as generatedJobDefaults } from "./runtime-pKfF_iql.js";
6
+ import { A as getDefaultControlView, C as controlBindings, D as controlsTo, S as useControlSchema, b as defineControls, d as useForm, l as useFormBuilder, u as evaluateCondition, x as getControlDefaults, y as defineControlComponentBindings } from "./AppSidebar-DGK5i-hJ.js";
7
+ import { a as combinePluginJobSources, o as useJobCenter, r as useRealtime } from "./useRealtime-yWjTTnc9.js";
8
8
  export { AuthenticationRequiredError, ComponentBindingRenderer_default as ComponentBindingRenderer, GeneratedPathInput_default as GeneratedPathInput, GeneratedPlotlyResult_default as GeneratedPlotlyResult, GeneratedPluginView_default as GeneratedPluginView, GeneratedResultRenderer_default as GeneratedResultRenderer, PresenceAvatars_default as PresenceAvatars, RuntimeUpdateNotice_default as RuntimeUpdateNotice, buildEndpointUrl, combinePluginJobSources, controlBindings, controlsTo, createClient, createGeneratedAnalysisTransport, defineControlComponentBindings, defineControls, downloadEndpoint, evaluateCondition, generatedJobDefaults, generatedJobFormSchema, getControlDefaults, getDefaultControlView, getFieldRegistryEntry, getTypeDefault, isActiveJobStatus, isTerminalJobStatus, jobStatusLabel, normalizeGeneratedJobInput, normalizeJobPercent, normalizeJobState, pluginFormDataFromPayload, resolveCurrentPluginId, resolveJobCapabilities, resolvePluginBaseUrl, uploadEndpoint, useApi, useControlSchema, useControlWorkspace, useEventStream, useForm, useFormBuilder, useJobCenter, useJobsEndpoint, usePresence, useRealtime, useSettingsEndpoint };
@@ -1,7 +1,7 @@
1
1
  import { i as useEventListener, o as __exportAll, r as useFocusTrap } from "./useDropdownState-8yWMu-7_.js";
2
- import { E as useMenuKeyboard, H as useListSelection, R as useRovingFocus, U as useSelectionLimit } from "./records-B6gpM_3e.js";
3
- import { B as compareSortValues, V as useSortedItems, i as useReorderAnnouncer, n as reorderList, r as useListReorder, t as REORDER_ANNOUNCER_STYLE } from "./useListReorder-BitdUhxn.js";
4
- import { _ as AppLayout_default, f as AppTopBar_default, t as AppSidebar_default, v as usePluginWorkspace } from "./AppSidebar-mvm--GxN.js";
2
+ import { E as useMenuKeyboard, H as useListSelection, R as useRovingFocus, U as useSelectionLimit } from "./records-DnK_1Q_S.js";
3
+ import { B as compareSortValues, V as useSortedItems, i as useReorderAnnouncer, n as reorderList, r as useListReorder, t as REORDER_ANNOUNCER_STYLE } from "./useListReorder-DPynGrCj.js";
4
+ import { _ as AppLayout_default, f as AppTopBar_default, t as AppSidebar_default, v as usePluginWorkspace } from "./AppSidebar-DGK5i-hJ.js";
5
5
  import { t as useDebouncedWatch } from "./useDebouncedWatch-BPwyl6eS.js";
6
6
  import { t as useExpansionSet } from "./useExpansionSet-CvoNMZJi.js";
7
7
  import { computed, createElementBlock, createElementVNode, defineComponent, normalizeClass, onBeforeUnmount, openBlock, shallowRef, toValue, watch } from "vue";
@@ -194,4 +194,4 @@ var shell_exports = /* @__PURE__ */ __exportAll({
194
194
  //#endregion
195
195
  export { useManualLayoutResize as a, resizedVerticalSplitPercent as i, resizedLeadingPanelWidth as n, LayoutResizeHandle_default as o, resizedTrailingPanelWidth as r, shell_exports as t };
196
196
 
197
- //# sourceMappingURL=shell-CywENwBT.js.map
197
+ //# sourceMappingURL=shell-BIH8Rc21.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shell-CywENwBT.js","names":[],"sources":["../src/components/LayoutResizeHandle.vue","../src/components/LayoutResizeHandle.vue","../src/composables/useManualLayoutResize.ts","../src/shell.ts"],"sourcesContent":["<script setup lang=\"ts\">\n/** Accessible pointer and keyboard handle for resizable workbench panes. */\ninterface Props {\n modelValue: number\n min: number\n max: number\n label: string\n orientation: 'vertical' | 'horizontal'\n edge?: 'left' | 'right'\n step?: number\n disabled?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n edge: undefined,\n step: 10,\n disabled: false,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: number]\n 'resize-start': [event: PointerEvent]\n}>()\n\nfunction update(value: number): void {\n emit('update:modelValue', Math.min(props.max, Math.max(props.min, value)))\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (props.disabled) return\n const decrement = props.orientation === 'vertical' ? 'ArrowLeft' : 'ArrowUp'\n const increment = props.orientation === 'vertical' ? 'ArrowRight' : 'ArrowDown'\n if (event.key === decrement) update(props.modelValue - props.step)\n else if (event.key === increment) update(props.modelValue + props.step)\n else if (event.key === 'Home') update(props.min)\n else if (event.key === 'End') update(props.max)\n else return\n event.preventDefault()\n}\n</script>\n\n<template>\n <div\n role=\"separator\"\n :tabindex=\"disabled ? -1 : 0\"\n :class=\"[\n 'mint-layout-resize-handle',\n `mint-layout-resize-handle--${orientation}`,\n edge ? `mint-layout-resize-handle--edge-${edge}` : '',\n ]\"\n :aria-label=\"label\"\n :aria-orientation=\"orientation\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n :aria-valuenow=\"modelValue\"\n :aria-disabled=\"disabled || undefined\"\n @pointerdown=\"!disabled && emit('resize-start', $event)\"\n @keydown=\"handleKeydown\"\n >\n <span class=\"mint-layout-resize-handle__bar\" aria-hidden=\"true\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Accessible pointer and keyboard handle for resizable workbench panes. */\ninterface Props {\n modelValue: number\n min: number\n max: number\n label: string\n orientation: 'vertical' | 'horizontal'\n edge?: 'left' | 'right'\n step?: number\n disabled?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n edge: undefined,\n step: 10,\n disabled: false,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: number]\n 'resize-start': [event: PointerEvent]\n}>()\n\nfunction update(value: number): void {\n emit('update:modelValue', Math.min(props.max, Math.max(props.min, value)))\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (props.disabled) return\n const decrement = props.orientation === 'vertical' ? 'ArrowLeft' : 'ArrowUp'\n const increment = props.orientation === 'vertical' ? 'ArrowRight' : 'ArrowDown'\n if (event.key === decrement) update(props.modelValue - props.step)\n else if (event.key === increment) update(props.modelValue + props.step)\n else if (event.key === 'Home') update(props.min)\n else if (event.key === 'End') update(props.max)\n else return\n event.preventDefault()\n}\n</script>\n\n<template>\n <div\n role=\"separator\"\n :tabindex=\"disabled ? -1 : 0\"\n :class=\"[\n 'mint-layout-resize-handle',\n `mint-layout-resize-handle--${orientation}`,\n edge ? `mint-layout-resize-handle--edge-${edge}` : '',\n ]\"\n :aria-label=\"label\"\n :aria-orientation=\"orientation\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n :aria-valuenow=\"modelValue\"\n :aria-disabled=\"disabled || undefined\"\n @pointerdown=\"!disabled && emit('resize-start', $event)\"\n @keydown=\"handleKeydown\"\n >\n <span class=\"mint-layout-resize-handle__bar\" aria-hidden=\"true\" />\n </div>\n</template>\n","import { computed, onBeforeUnmount, shallowRef, toValue, watch, type MaybeRefOrGetter } from 'vue'\n\nexport interface ResizePanelWidthConstraints {\n minWidth: number\n maxWidth: number\n mainMinWidth?: number\n layoutGap?: number\n}\n\nexport interface ResizePercentConstraints {\n minPercent: number\n maxPercent: number\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nfunction availablePanelWidth(\n containerWidth: number,\n constraints: ResizePanelWidthConstraints,\n): number {\n return Math.min(\n constraints.maxWidth,\n containerWidth - (constraints.mainMinWidth ?? 0) - (constraints.layoutGap ?? 0),\n )\n}\n\nexport function resizedLeadingPanelWidth(\n startWidth: number,\n deltaX: number,\n containerWidth: number,\n constraints: ResizePanelWidthConstraints,\n): number {\n return Math.round(clamp(\n startWidth + deltaX,\n constraints.minWidth,\n Math.max(constraints.minWidth, availablePanelWidth(containerWidth, constraints)),\n ))\n}\n\nexport function resizedTrailingPanelWidth(\n startWidth: number,\n deltaX: number,\n containerWidth: number,\n constraints: ResizePanelWidthConstraints,\n): number {\n return resizedLeadingPanelWidth(startWidth, -deltaX, containerWidth, constraints)\n}\n\nexport function resizedVerticalSplitPercent(\n startPercent: number,\n deltaY: number,\n containerHeight: number,\n constraints: ResizePercentConstraints,\n): number {\n if (containerHeight <= 0) return startPercent\n return Math.round(clamp(\n startPercent + (deltaY / containerHeight) * 100,\n constraints.minPercent,\n constraints.maxPercent,\n ))\n}\n\nexport interface ManualLayoutResizeContext<TKind extends string> {\n kind: TKind\n startValue: number\n deltaX: number\n deltaY: number\n containerRect: DOMRectReadOnly\n secondaryRect: DOMRectReadOnly | null\n}\n\nexport interface ManualLayoutResizeTarget<TKind extends string> {\n cursor?: string\n getContainerElement: () => HTMLElement | null\n getSecondaryElement?: () => HTMLElement | null\n getStartValue: () => number\n onResize: (context: ManualLayoutResizeContext<TKind>) => void\n}\n\n/** Coordinates pointer-driven resizing for one or more layout splitters. */\nexport function useManualLayoutResize<TKind extends string>(options: {\n enabled: MaybeRefOrGetter<boolean>\n resolveTarget: (kind: TKind) => ManualLayoutResizeTarget<TKind> | null\n}) {\n const activeResize = shallowRef<{\n kind: TKind\n startClientX: number\n startClientY: number\n startValue: number\n containerRect: DOMRectReadOnly\n secondaryRect: DOMRectReadOnly | null\n cursor: string\n } | null>(null)\n const isResizing = computed(() => activeResize.value !== null)\n let previousBodyCursor = ''\n let previousBodyUserSelect = ''\n\n function stopResize(): void {\n if (!activeResize.value) return\n activeResize.value = null\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('pointerup', stopResize)\n window.removeEventListener('pointercancel', stopResize)\n if (typeof document !== 'undefined') {\n document.body.style.cursor = previousBodyCursor\n document.body.style.userSelect = previousBodyUserSelect\n }\n }\n\n function handlePointerMove(event: PointerEvent): void {\n const state = activeResize.value\n if (!state) return\n options.resolveTarget(state.kind)?.onResize({\n kind: state.kind,\n startValue: state.startValue,\n deltaX: event.clientX - state.startClientX,\n deltaY: event.clientY - state.startClientY,\n containerRect: state.containerRect,\n secondaryRect: state.secondaryRect,\n })\n }\n\n function startResize(kind: TKind, event: PointerEvent): void {\n if (!toValue(options.enabled) || event.button !== 0) return\n const target = options.resolveTarget(kind)\n const containerRect = target?.getContainerElement()?.getBoundingClientRect()\n if (!target || !containerRect) return\n\n event.preventDefault()\n if (event.currentTarget instanceof HTMLElement) {\n event.currentTarget.setPointerCapture(event.pointerId)\n }\n const secondary = target.getSecondaryElement?.() ?? null\n activeResize.value = {\n kind,\n startClientX: event.clientX,\n startClientY: event.clientY,\n startValue: target.getStartValue(),\n containerRect,\n secondaryRect: secondary?.getBoundingClientRect() ?? null,\n cursor: target.cursor ?? 'col-resize',\n }\n\n if (typeof document !== 'undefined') {\n previousBodyCursor = document.body.style.cursor\n previousBodyUserSelect = document.body.style.userSelect\n document.body.style.cursor = activeResize.value.cursor\n document.body.style.userSelect = 'none'\n }\n window.addEventListener('pointermove', handlePointerMove)\n window.addEventListener('pointerup', stopResize)\n window.addEventListener('pointercancel', stopResize)\n }\n\n function isResizingKind(kind: TKind): boolean {\n return activeResize.value?.kind === kind\n }\n\n watch(() => toValue(options.enabled), enabled => { if (!enabled) stopResize() })\n onBeforeUnmount(stopResize)\n\n return { activeResize, isResizing, isResizingKind, startResize, stopResize }\n}\n","// Application shell components (`@morscherlab/mint-sdk/shell`).\n\n// Layout components\nexport { default as AppTopBar } from './components/AppTopBar.vue'\nexport { default as AppSidebar } from './components/AppSidebar.vue'\nexport { default as AppLayout } from './components/AppLayout.vue'\nexport { default as LayoutResizeHandle } from './components/LayoutResizeHandle.vue'\n\n// Headless interaction composables\nexport {\n useEventListener,\n type EventListenerEnabled,\n type EventFor,\n type EventListenerStop,\n type EventMapFor,\n type EventTargetGetter,\n type EventTargetLike,\n type UseEventListenerObjectOptions,\n type UseEventListenerOptions,\n} from './composables/useEventListener'\nexport {\n useDebouncedWatch,\n type DebouncedWatchCallback,\n type DebouncedWatchCleanup,\n type DebouncedWatchSource,\n type UseDebouncedWatchOptions,\n type UseDebouncedWatchReturn,\n} from './composables/useDebouncedWatch'\nexport {\n useFocusTrap,\n type UseFocusTrapOptions,\n type UseFocusTrapReturn,\n} from './composables/useFocusTrap'\nexport {\n useRovingFocus,\n type UseRovingFocusOptions,\n type UseRovingFocusReturn,\n} from './composables/useRovingFocus'\nexport {\n reorderList,\n useListReorder,\n useReorderAnnouncer,\n REORDER_ANNOUNCER_STYLE,\n type ListReorderMove,\n type UseListReorderOptions,\n type UseListReorderReturn,\n type UseReorderAnnouncerReturn,\n} from './composables/useListReorder'\nexport {\n useMenuKeyboard,\n type UseMenuKeyboardOptions,\n type UseMenuKeyboardReturn,\n} from './composables/useMenuKeyboard'\n\n// Layout, selection, expansion and sort primitives\nexport {\n resizedLeadingPanelWidth,\n resizedTrailingPanelWidth,\n resizedVerticalSplitPercent,\n useManualLayoutResize,\n type ManualLayoutResizeContext,\n type ManualLayoutResizeTarget,\n type ResizePanelWidthConstraints,\n type ResizePercentConstraints,\n} from './composables/useManualLayoutResize'\nexport {\n useSelectionLimit,\n type SelectionLimitSource,\n type UseSelectionLimitOptions,\n type UseSelectionLimitReturn,\n} from './composables/useSelectionLimit'\nexport {\n useListSelection,\n type ListSelectionSource,\n type ListSelectionValue,\n type UseListSelectionOptions,\n type UseListSelectionReturn,\n type WidenListSelectionValue,\n} from './composables/useListSelection'\nexport {\n useExpansionSet,\n type ExpansionSetSource,\n type UseExpansionSetOptions,\n type UseExpansionSetReturn,\n} from './composables/useExpansionSet'\nexport {\n compareSortValues,\n useSortedItems,\n type CompareSortValuesOptions,\n type SortComparator,\n type SortComparatorContext,\n type SortDescriptor,\n type SortedItemsSource,\n type SortOrder,\n type UseSortedItemsOptions,\n type UseSortedItemsReturn,\n} from './composables/useSortedItems'\nexport {\n usePluginWorkspace,\n type PluginWorkspaceSlotsLike,\n type UsePluginWorkspaceOptions,\n type UsePluginWorkspaceReturn,\n} from './composables/usePluginWorkspace'\n"],"mappings":"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"}
1
+ {"version":3,"file":"shell-BIH8Rc21.js","names":[],"sources":["../src/components/LayoutResizeHandle.vue","../src/components/LayoutResizeHandle.vue","../src/composables/useManualLayoutResize.ts","../src/shell.ts"],"sourcesContent":["<script setup lang=\"ts\">\n/** Accessible pointer and keyboard handle for resizable workbench panes. */\ninterface Props {\n modelValue: number\n min: number\n max: number\n label: string\n orientation: 'vertical' | 'horizontal'\n edge?: 'left' | 'right'\n step?: number\n disabled?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n edge: undefined,\n step: 10,\n disabled: false,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: number]\n 'resize-start': [event: PointerEvent]\n}>()\n\nfunction update(value: number): void {\n emit('update:modelValue', Math.min(props.max, Math.max(props.min, value)))\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (props.disabled) return\n const decrement = props.orientation === 'vertical' ? 'ArrowLeft' : 'ArrowUp'\n const increment = props.orientation === 'vertical' ? 'ArrowRight' : 'ArrowDown'\n if (event.key === decrement) update(props.modelValue - props.step)\n else if (event.key === increment) update(props.modelValue + props.step)\n else if (event.key === 'Home') update(props.min)\n else if (event.key === 'End') update(props.max)\n else return\n event.preventDefault()\n}\n</script>\n\n<template>\n <div\n role=\"separator\"\n :tabindex=\"disabled ? -1 : 0\"\n :class=\"[\n 'mint-layout-resize-handle',\n `mint-layout-resize-handle--${orientation}`,\n edge ? `mint-layout-resize-handle--edge-${edge}` : '',\n ]\"\n :aria-label=\"label\"\n :aria-orientation=\"orientation\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n :aria-valuenow=\"modelValue\"\n :aria-disabled=\"disabled || undefined\"\n @pointerdown=\"!disabled && emit('resize-start', $event)\"\n @keydown=\"handleKeydown\"\n >\n <span class=\"mint-layout-resize-handle__bar\" aria-hidden=\"true\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Accessible pointer and keyboard handle for resizable workbench panes. */\ninterface Props {\n modelValue: number\n min: number\n max: number\n label: string\n orientation: 'vertical' | 'horizontal'\n edge?: 'left' | 'right'\n step?: number\n disabled?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n edge: undefined,\n step: 10,\n disabled: false,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: number]\n 'resize-start': [event: PointerEvent]\n}>()\n\nfunction update(value: number): void {\n emit('update:modelValue', Math.min(props.max, Math.max(props.min, value)))\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (props.disabled) return\n const decrement = props.orientation === 'vertical' ? 'ArrowLeft' : 'ArrowUp'\n const increment = props.orientation === 'vertical' ? 'ArrowRight' : 'ArrowDown'\n if (event.key === decrement) update(props.modelValue - props.step)\n else if (event.key === increment) update(props.modelValue + props.step)\n else if (event.key === 'Home') update(props.min)\n else if (event.key === 'End') update(props.max)\n else return\n event.preventDefault()\n}\n</script>\n\n<template>\n <div\n role=\"separator\"\n :tabindex=\"disabled ? -1 : 0\"\n :class=\"[\n 'mint-layout-resize-handle',\n `mint-layout-resize-handle--${orientation}`,\n edge ? `mint-layout-resize-handle--edge-${edge}` : '',\n ]\"\n :aria-label=\"label\"\n :aria-orientation=\"orientation\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n :aria-valuenow=\"modelValue\"\n :aria-disabled=\"disabled || undefined\"\n @pointerdown=\"!disabled && emit('resize-start', $event)\"\n @keydown=\"handleKeydown\"\n >\n <span class=\"mint-layout-resize-handle__bar\" aria-hidden=\"true\" />\n </div>\n</template>\n","import { computed, onBeforeUnmount, shallowRef, toValue, watch, type MaybeRefOrGetter } from 'vue'\n\nexport interface ResizePanelWidthConstraints {\n minWidth: number\n maxWidth: number\n mainMinWidth?: number\n layoutGap?: number\n}\n\nexport interface ResizePercentConstraints {\n minPercent: number\n maxPercent: number\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nfunction availablePanelWidth(\n containerWidth: number,\n constraints: ResizePanelWidthConstraints,\n): number {\n return Math.min(\n constraints.maxWidth,\n containerWidth - (constraints.mainMinWidth ?? 0) - (constraints.layoutGap ?? 0),\n )\n}\n\nexport function resizedLeadingPanelWidth(\n startWidth: number,\n deltaX: number,\n containerWidth: number,\n constraints: ResizePanelWidthConstraints,\n): number {\n return Math.round(clamp(\n startWidth + deltaX,\n constraints.minWidth,\n Math.max(constraints.minWidth, availablePanelWidth(containerWidth, constraints)),\n ))\n}\n\nexport function resizedTrailingPanelWidth(\n startWidth: number,\n deltaX: number,\n containerWidth: number,\n constraints: ResizePanelWidthConstraints,\n): number {\n return resizedLeadingPanelWidth(startWidth, -deltaX, containerWidth, constraints)\n}\n\nexport function resizedVerticalSplitPercent(\n startPercent: number,\n deltaY: number,\n containerHeight: number,\n constraints: ResizePercentConstraints,\n): number {\n if (containerHeight <= 0) return startPercent\n return Math.round(clamp(\n startPercent + (deltaY / containerHeight) * 100,\n constraints.minPercent,\n constraints.maxPercent,\n ))\n}\n\nexport interface ManualLayoutResizeContext<TKind extends string> {\n kind: TKind\n startValue: number\n deltaX: number\n deltaY: number\n containerRect: DOMRectReadOnly\n secondaryRect: DOMRectReadOnly | null\n}\n\nexport interface ManualLayoutResizeTarget<TKind extends string> {\n cursor?: string\n getContainerElement: () => HTMLElement | null\n getSecondaryElement?: () => HTMLElement | null\n getStartValue: () => number\n onResize: (context: ManualLayoutResizeContext<TKind>) => void\n}\n\n/** Coordinates pointer-driven resizing for one or more layout splitters. */\nexport function useManualLayoutResize<TKind extends string>(options: {\n enabled: MaybeRefOrGetter<boolean>\n resolveTarget: (kind: TKind) => ManualLayoutResizeTarget<TKind> | null\n}) {\n const activeResize = shallowRef<{\n kind: TKind\n startClientX: number\n startClientY: number\n startValue: number\n containerRect: DOMRectReadOnly\n secondaryRect: DOMRectReadOnly | null\n cursor: string\n } | null>(null)\n const isResizing = computed(() => activeResize.value !== null)\n let previousBodyCursor = ''\n let previousBodyUserSelect = ''\n\n function stopResize(): void {\n if (!activeResize.value) return\n activeResize.value = null\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('pointerup', stopResize)\n window.removeEventListener('pointercancel', stopResize)\n if (typeof document !== 'undefined') {\n document.body.style.cursor = previousBodyCursor\n document.body.style.userSelect = previousBodyUserSelect\n }\n }\n\n function handlePointerMove(event: PointerEvent): void {\n const state = activeResize.value\n if (!state) return\n options.resolveTarget(state.kind)?.onResize({\n kind: state.kind,\n startValue: state.startValue,\n deltaX: event.clientX - state.startClientX,\n deltaY: event.clientY - state.startClientY,\n containerRect: state.containerRect,\n secondaryRect: state.secondaryRect,\n })\n }\n\n function startResize(kind: TKind, event: PointerEvent): void {\n if (!toValue(options.enabled) || event.button !== 0) return\n const target = options.resolveTarget(kind)\n const containerRect = target?.getContainerElement()?.getBoundingClientRect()\n if (!target || !containerRect) return\n\n event.preventDefault()\n if (event.currentTarget instanceof HTMLElement) {\n event.currentTarget.setPointerCapture(event.pointerId)\n }\n const secondary = target.getSecondaryElement?.() ?? null\n activeResize.value = {\n kind,\n startClientX: event.clientX,\n startClientY: event.clientY,\n startValue: target.getStartValue(),\n containerRect,\n secondaryRect: secondary?.getBoundingClientRect() ?? null,\n cursor: target.cursor ?? 'col-resize',\n }\n\n if (typeof document !== 'undefined') {\n previousBodyCursor = document.body.style.cursor\n previousBodyUserSelect = document.body.style.userSelect\n document.body.style.cursor = activeResize.value.cursor\n document.body.style.userSelect = 'none'\n }\n window.addEventListener('pointermove', handlePointerMove)\n window.addEventListener('pointerup', stopResize)\n window.addEventListener('pointercancel', stopResize)\n }\n\n function isResizingKind(kind: TKind): boolean {\n return activeResize.value?.kind === kind\n }\n\n watch(() => toValue(options.enabled), enabled => { if (!enabled) stopResize() })\n onBeforeUnmount(stopResize)\n\n return { activeResize, isResizing, isResizingKind, startResize, stopResize }\n}\n","// Application shell components (`@morscherlab/mint-sdk/shell`).\n\n// Layout components\nexport { default as AppTopBar } from './components/AppTopBar.vue'\nexport { default as AppSidebar } from './components/AppSidebar.vue'\nexport { default as AppLayout } from './components/AppLayout.vue'\nexport { default as LayoutResizeHandle } from './components/LayoutResizeHandle.vue'\n\n// Headless interaction composables\nexport {\n useEventListener,\n type EventListenerEnabled,\n type EventFor,\n type EventListenerStop,\n type EventMapFor,\n type EventTargetGetter,\n type EventTargetLike,\n type UseEventListenerObjectOptions,\n type UseEventListenerOptions,\n} from './composables/useEventListener'\nexport {\n useDebouncedWatch,\n type DebouncedWatchCallback,\n type DebouncedWatchCleanup,\n type DebouncedWatchSource,\n type UseDebouncedWatchOptions,\n type UseDebouncedWatchReturn,\n} from './composables/useDebouncedWatch'\nexport {\n useFocusTrap,\n type UseFocusTrapOptions,\n type UseFocusTrapReturn,\n} from './composables/useFocusTrap'\nexport {\n useRovingFocus,\n type UseRovingFocusOptions,\n type UseRovingFocusReturn,\n} from './composables/useRovingFocus'\nexport {\n reorderList,\n useListReorder,\n useReorderAnnouncer,\n REORDER_ANNOUNCER_STYLE,\n type ListReorderMove,\n type UseListReorderOptions,\n type UseListReorderReturn,\n type UseReorderAnnouncerReturn,\n} from './composables/useListReorder'\nexport {\n useMenuKeyboard,\n type UseMenuKeyboardOptions,\n type UseMenuKeyboardReturn,\n} from './composables/useMenuKeyboard'\n\n// Layout, selection, expansion and sort primitives\nexport {\n resizedLeadingPanelWidth,\n resizedTrailingPanelWidth,\n resizedVerticalSplitPercent,\n useManualLayoutResize,\n type ManualLayoutResizeContext,\n type ManualLayoutResizeTarget,\n type ResizePanelWidthConstraints,\n type ResizePercentConstraints,\n} from './composables/useManualLayoutResize'\nexport {\n useSelectionLimit,\n type SelectionLimitSource,\n type UseSelectionLimitOptions,\n type UseSelectionLimitReturn,\n} from './composables/useSelectionLimit'\nexport {\n useListSelection,\n type ListSelectionSource,\n type ListSelectionValue,\n type UseListSelectionOptions,\n type UseListSelectionReturn,\n type WidenListSelectionValue,\n} from './composables/useListSelection'\nexport {\n useExpansionSet,\n type ExpansionSetSource,\n type UseExpansionSetOptions,\n type UseExpansionSetReturn,\n} from './composables/useExpansionSet'\nexport {\n compareSortValues,\n useSortedItems,\n type CompareSortValuesOptions,\n type SortComparator,\n type SortComparatorContext,\n type SortDescriptor,\n type SortedItemsSource,\n type SortOrder,\n type UseSortedItemsOptions,\n type UseSortedItemsReturn,\n} from './composables/useSortedItems'\nexport {\n usePluginWorkspace,\n type PluginWorkspaceSlotsLike,\n type UsePluginWorkspaceOptions,\n type UsePluginWorkspaceReturn,\n} from './composables/usePluginWorkspace'\n"],"mappings":"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"}
package/dist/shell.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { i as useEventListener, r as useFocusTrap } from "./useDropdownState-8yWMu-7_.js";
2
- import { E as useMenuKeyboard, H as useListSelection, R as useRovingFocus, U as useSelectionLimit } from "./records-B6gpM_3e.js";
3
- import { B as compareSortValues, V as useSortedItems, i as useReorderAnnouncer, n as reorderList, r as useListReorder, t as REORDER_ANNOUNCER_STYLE } from "./useListReorder-BitdUhxn.js";
4
- import { _ as AppLayout_default, f as AppTopBar_default, t as AppSidebar_default, v as usePluginWorkspace } from "./AppSidebar-mvm--GxN.js";
2
+ import { E as useMenuKeyboard, H as useListSelection, R as useRovingFocus, U as useSelectionLimit } from "./records-DnK_1Q_S.js";
3
+ import { B as compareSortValues, V as useSortedItems, i as useReorderAnnouncer, n as reorderList, r as useListReorder, t as REORDER_ANNOUNCER_STYLE } from "./useListReorder-DPynGrCj.js";
4
+ import { _ as AppLayout_default, f as AppTopBar_default, t as AppSidebar_default, v as usePluginWorkspace } from "./AppSidebar-DGK5i-hJ.js";
5
5
  import { t as useDebouncedWatch } from "./useDebouncedWatch-BPwyl6eS.js";
6
6
  import { t as useExpansionSet } from "./useExpansionSet-CvoNMZJi.js";
7
- import { a as useManualLayoutResize, i as resizedVerticalSplitPercent, n as resizedLeadingPanelWidth, o as LayoutResizeHandle_default, r as resizedTrailingPanelWidth } from "./shell-CywENwBT.js";
7
+ import { a as useManualLayoutResize, i as resizedVerticalSplitPercent, n as resizedLeadingPanelWidth, o as LayoutResizeHandle_default, r as resizedTrailingPanelWidth } from "./shell-BIH8Rc21.js";
8
8
  export { AppLayout_default as AppLayout, AppSidebar_default as AppSidebar, AppTopBar_default as AppTopBar, LayoutResizeHandle_default as LayoutResizeHandle, REORDER_ANNOUNCER_STYLE, compareSortValues, reorderList, resizedLeadingPanelWidth, resizedTrailingPanelWidth, resizedVerticalSplitPercent, useDebouncedWatch, useEventListener, useExpansionSet, useFocusTrap, useListReorder, useListSelection, useManualLayoutResize, useMenuKeyboard, usePluginWorkspace, useReorderAnnouncer, useRovingFocus, useSelectionLimit, useSortedItems };
@@ -1,3 +1,3 @@
1
1
  export { useAuthStore } from './auth';
2
- export { useSettingsStore, tryUseSettingsStore, colorPalettes, paletteCssVariables, tableDensityToSize, PALETTE_CSS_VARIABLES, type SettingsState, } from './settings';
2
+ export { useSettingsStore, tryUseSettingsStore, colorPalettes, tableDensityToSize, type SettingsState, } from './settings';
3
3
  export { useExperimentStore } from './experiment';
@@ -1,3 +1,3 @@
1
- import { c as colorPalettes, d as tryUseSettingsStore, f as useSettingsStore, l as paletteCssVariables, s as PALETTE_CSS_VARIABLES, t as useExperimentStore, u as tableDensityToSize } from "../experiment-43OJtH7R.js";
1
+ import { c as tableDensityToSize, l as tryUseSettingsStore, s as colorPalettes, t as useExperimentStore, u as useSettingsStore } from "../experiment-DyO54FQB.js";
2
2
  import { r as useAuthStore } from "../auth-SliLnFre.js";
3
- export { PALETTE_CSS_VARIABLES, colorPalettes, paletteCssVariables, tableDensityToSize, tryUseSettingsStore, useAuthStore, useExperimentStore, useSettingsStore };
3
+ export { colorPalettes, tableDensityToSize, tryUseSettingsStore, useAuthStore, useExperimentStore, useSettingsStore };
@@ -17,20 +17,13 @@ export interface SettingsState {
17
17
  colorPalette: ColorPalette;
18
18
  tableDensity: TableDensity;
19
19
  }
20
+ /**
21
+ * Accent palettes. `styles/variables.css` holds each palette's light and dark
22
+ * tokens under `[data-palette]`; the store only writes the attribute.
23
+ */
20
24
  export declare const colorPalettes: Record<ColorPalette, {
21
25
  name: string;
22
- hues: [number, number];
23
26
  }>;
24
- /**
25
- * Custom properties a non-default palette overrides on `<html>`.
26
- *
27
- * The saturation/lightness pairs are lifted from the original indigo/orange
28
- * tokens in `styles/variables.css` so only the hue moves; the `default`
29
- * palette writes nothing at all and the stylesheet values stand.
30
- */
31
- export declare const PALETTE_CSS_VARIABLES: readonly ["--color-primary", "--color-primary-hover", "--color-primary-soft", "--color-cta", "--color-cta-hover"];
32
- /** Build the `<html>` custom-property overrides for a palette. */
33
- export declare function paletteCssVariables(palette: ColorPalette): Record<string, string>;
34
27
  /** Map a table density onto the `size` prop shared by the SDK table components. */
35
28
  export declare function tableDensityToSize(density: TableDensity): 'sm' | 'md' | 'lg';
36
29
  export declare const useSettingsStore: import('pinia').SetupStoreDefinition<"mint-settings", {
@@ -49,7 +42,6 @@ export declare const useSettingsStore: import('pinia').SetupStoreDefinition<"min
49
42
  applyDensity: () => void;
50
43
  persistSettings: () => void;
51
44
  resetToDefaults: () => void;
52
- getPaletteHues: () => [number, number];
53
45
  getTableSize: () => "sm" | "md" | "lg";
54
46
  isDark: () => boolean;
55
47
  getApiBaseUrl: () => string;
package/dist/styles.css CHANGED
@@ -48,36 +48,35 @@
48
48
  margin: 0 auto;
49
49
  }
50
50
 
51
- .mint-generated-result[data-v-d4b8e2aa] {
51
+ .mint-generated-result[data-v-f242a75c] {
52
52
  width: 100%;
53
53
  }
54
- .mint-generated-result__text[data-v-d4b8e2aa],
55
- .mint-generated-result__json[data-v-d4b8e2aa] {
54
+ .mint-generated-result__text[data-v-f242a75c],
55
+ .mint-generated-result__json[data-v-f242a75c] {
56
56
  margin: 0;
57
57
  color: var(--text-primary);
58
58
  }
59
- .mint-generated-result__text[data-v-d4b8e2aa] {
59
+ .mint-generated-result__text[data-v-f242a75c] {
60
60
  max-width: 72ch;
61
61
  white-space: pre-wrap;
62
62
  line-height: 1.65;
63
63
  }
64
- .mint-generated-result__json[data-v-d4b8e2aa] {
64
+ .mint-generated-result__json[data-v-f242a75c] {
65
65
  overflow: auto;
66
- padding: 1rem;
67
- border: 1px solid var(--border-color);
68
- border-radius: 0.75rem;
69
- background: var(--bg-secondary);
66
+ padding: 0.75rem 1rem;
67
+ border-radius: var(--radius-md);
68
+ background: var(--bg-tertiary);
70
69
  font-size: 0.8125rem;
71
70
  line-height: 1.55;
72
71
  white-space: pre-wrap;
73
72
  }
74
- .mint-generated-result__image[data-v-d4b8e2aa] {
73
+ .mint-generated-result__image[data-v-f242a75c] {
75
74
  display: block;
76
75
  max-width: 100%;
77
76
  height: auto;
78
77
  margin: 0 auto;
79
78
  }
80
- .mint-generated-result__artifact[data-v-d4b8e2aa] {
79
+ .mint-generated-result__artifact[data-v-f242a75c] {
81
80
  display: flex;
82
81
  align-items: center;
83
82
  justify-content: space-between;
@@ -303,7 +302,7 @@
303
302
 
304
303
 
305
304
 
306
-
305
+ @layer theme, base, components, utilities;
307
306
  /* MINT SDK Styles - Main entry point
308
307
  * This file combines all SDK styles for proper bundling
309
308
  */
@@ -315,6 +314,9 @@
315
314
  * @import '@morscherlab/mint-sdk/styles';
316
315
  */
317
316
 
317
+ /* Tailwind v4's layer order, declared first so the SDK's base and utilities
318
+ layers sort the same way with or without Tailwind in the host. */
319
+
318
320
  /* ==========================================================================
319
321
  CSS Variables - Light Mode
320
322
  ========================================================================== */
@@ -357,13 +359,8 @@
357
359
  where --text-secondary would drop to ~4.35:1. */
358
360
  --text-secondary-strong: #475569;
359
361
 
360
- /* Brand colors — one teal accent: teal-600 fills, teal-700 hover + ink,
361
- teal-800 pressed. White on #0D9488 is 3.74:1, a known AA exception. */
362
- --color-primary: #0D9488;
363
- --color-primary-hover: #0F766E;
364
- --color-primary-pressed: #115E59;
365
- --color-primary-soft: rgba(13, 148, 136, 0.10);
366
- --color-primary-border: #99F6E4;
362
+ /* Brand colors: the accent (--color-primary*) comes from the palette
363
+ blocks below the dark block (html[data-palette], default teal). */
367
364
  /* Fixed teal scale, the same in both themes. */
368
365
  --color-primary-50: #F0FDFA;
369
366
  --color-primary-100: #CCFBF1;
@@ -445,6 +442,8 @@
445
442
  --form-height-md: 2rem;
446
443
  --form-height-lg: 2.5rem;
447
444
  --mint-gutter: 0.5rem;
445
+ /* Distance from the outermost cards to the window edge, in every density. */
446
+ --mint-page-inset: 1rem;
448
447
 
449
448
  /* Semantic colors */
450
449
  --mint-success: #10B981;
@@ -479,7 +478,7 @@
479
478
  /* Soft focus rings — 3px translucent. Used by all form primitives
480
479
  post-0.16 visual refresh. Solid variants above kept for legacy
481
480
  components that haven't migrated yet. */
482
- --focus-ring-soft: 0 0 0 3px rgba(13, 148, 136, 0.18);
481
+ --focus-ring-soft: 0 0 0 3px color-mix(in srgb, var(--color-primary) 18%, transparent);
483
482
  /* Red is perceptually brighter than teal at equal alpha; drop 2pp to keep visual weight matched. */
484
483
  --focus-ring-soft-error: 0 0 0 3px rgba(239, 68, 68, 0.18);
485
484
 
@@ -517,12 +516,7 @@ html.dark {
517
516
  --border-light: #172033;
518
517
  --border-strong: #334155;
519
518
 
520
- /* Brand colors - Dark mode (CTA, purple and entity aliases follow) */
521
- --color-primary: #2DD4BF;
522
- --color-primary-hover: #5EEAD4;
523
- --color-primary-pressed: #99F6E4;
524
- --color-primary-soft: rgba(45, 212, 191, 0.12);
525
- --color-primary-border: rgba(45, 212, 191, 0.35);
519
+ /* Brand colors - Dark mode: the accent comes from the palette blocks below. */
526
520
  /* Dark ink on the light accent fill (10.1:1 on #2DD4BF). */
527
521
  --text-on-accent: #0B1120;
528
522
  --color-experiment-hover: #E2E8F0;
@@ -558,7 +552,7 @@ html.dark {
558
552
 
559
553
  /* Focus ring - dark mode offset uses bg-primary instead of white */
560
554
  --focus-ring-offset: 0 0 0 2px var(--bg-primary), 0 0 0 4px var(--color-primary);
561
- --focus-ring-soft: 0 0 0 3px rgba(45, 212, 191, 0.22);
555
+ --focus-ring-soft: 0 0 0 3px color-mix(in srgb, var(--color-primary) 22%, transparent);
562
556
  --focus-ring-soft-error: 0 0 0 3px rgba(248, 113, 113, 0.26);
563
557
 
564
558
  /* Legacy aliases */
@@ -568,6 +562,122 @@ html.dark {
568
562
  color-scheme: dark;
569
563
  }
570
564
 
565
+ /* Accent palettes (Settings → Color palette). The settings store writes
566
+ html[data-palette]; the palette swatches set the same attribute on their
567
+ strip to preview a palette. Each palette is one accent in both themes: white
568
+ text on the light-mode fill, dark text (--text-on-accent) on the dark-mode
569
+ fill. Hues come from the biology plot-style palettes. */
570
+
571
+ /* Teal (default): teal-600 fill, teal-700 hover + ink, teal-800 pressed.
572
+ White on #0D9488 is 3.74:1, a known AA exception. */
573
+ :root,
574
+ [data-palette="default"] {
575
+ --color-primary: #0D9488;
576
+ --color-primary-hover: #0F766E;
577
+ --color-primary-pressed: #115E59;
578
+ --color-primary-soft: rgba(13, 148, 136, 0.10);
579
+ --color-primary-border: #99F6E4;
580
+ }
581
+ html.dark,
582
+ html.dark [data-palette="default"] {
583
+ --color-primary: #2DD4BF;
584
+ --color-primary-hover: #5EEAD4;
585
+ --color-primary-pressed: #99F6E4;
586
+ --color-primary-soft: rgba(45, 212, 191, 0.12);
587
+ --color-primary-border: rgba(45, 212, 191, 0.35);
588
+ }
589
+
590
+ /* Colour-blind safe: Okabe-Ito blue accent, and Okabe-Ito bluish green,
591
+ vermilion and orange for status, so success and error differ for every
592
+ colour-vision type. White on #0072B2 is 5.19:1. */
593
+ :root[data-palette="colorblind"],
594
+ [data-palette="colorblind"] {
595
+ --color-primary: #0072B2;
596
+ --color-primary-hover: #005F94;
597
+ --color-primary-pressed: #004C77;
598
+ --color-primary-soft: rgba(0, 114, 178, 0.10);
599
+ --color-primary-border: #B3D5EA;
600
+ --mint-success: #009E73;
601
+ --mint-success-hover: #00805D;
602
+ --mint-success-bg: rgba(0, 158, 115, 0.1);
603
+ --mint-success-border: rgba(0, 158, 115, 0.3);
604
+ --mint-error: #D55E00;
605
+ --mint-error-hover: #B34E00;
606
+ --mint-error-bg: rgba(213, 94, 0, 0.1);
607
+ --mint-error-border: rgba(213, 94, 0, 0.3);
608
+ --mint-warning: #E69F00;
609
+ --mint-warning-hover: #C78800;
610
+ --mint-warning-bg: rgba(230, 159, 0, 0.1);
611
+ --mint-warning-border: rgba(230, 159, 0, 0.3);
612
+ --mint-warning-text: #8F5F00;
613
+ }
614
+ html.dark[data-palette="colorblind"],
615
+ html.dark [data-palette="colorblind"] {
616
+ --color-primary: #56B4E9;
617
+ --color-primary-hover: #7CC5EE;
618
+ --color-primary-pressed: #A3D6F3;
619
+ --color-primary-soft: rgba(86, 180, 233, 0.14);
620
+ --color-primary-border: rgba(86, 180, 233, 0.38);
621
+ --mint-success-bg: rgba(0, 158, 115, 0.15);
622
+ --mint-error-bg: rgba(213, 94, 0, 0.15);
623
+ --mint-warning-bg: rgba(230, 159, 0, 0.15);
624
+ --mint-warning-text: #FCD34D;
625
+ }
626
+
627
+ /* Purple: plot-style purple #8781bd, deepened so white text is 5.15:1. */
628
+ :root[data-palette="purple"],
629
+ [data-palette="purple"] {
630
+ --color-primary: #6B64B0;
631
+ --color-primary-hover: #5A539E;
632
+ --color-primary-pressed: #4A448A;
633
+ --color-primary-soft: rgba(107, 100, 176, 0.10);
634
+ --color-primary-border: #D3D0EC;
635
+ }
636
+ html.dark[data-palette="purple"],
637
+ html.dark [data-palette="purple"] {
638
+ --color-primary: #A9A3DB;
639
+ --color-primary-hover: #C2BDE7;
640
+ --color-primary-pressed: #D8D4F1;
641
+ --color-primary-soft: rgba(169, 163, 219, 0.14);
642
+ --color-primary-border: rgba(169, 163, 219, 0.38);
643
+ }
644
+
645
+ /* Ocean: plot-style ocean ramp, #2171B5 fill (white 5.13:1), #6BAED6 dark. */
646
+ :root[data-palette="ocean"],
647
+ [data-palette="ocean"] {
648
+ --color-primary: #2171B5;
649
+ --color-primary-hover: #1B5F99;
650
+ --color-primary-pressed: #164E7E;
651
+ --color-primary-soft: rgba(33, 113, 181, 0.10);
652
+ --color-primary-border: #BBD7EE;
653
+ }
654
+ html.dark[data-palette="ocean"],
655
+ html.dark [data-palette="ocean"] {
656
+ --color-primary: #6BAED6;
657
+ --color-primary-hover: #8EC2E2;
658
+ --color-primary-pressed: #B0D5EC;
659
+ --color-primary-soft: rgba(107, 174, 214, 0.14);
660
+ --color-primary-border: rgba(107, 174, 214, 0.38);
661
+ }
662
+
663
+ /* Forest: plot-style forest_clay, #2F6B4F fill (white 6.29:1), #7AA874 dark. */
664
+ :root[data-palette="forest"],
665
+ [data-palette="forest"] {
666
+ --color-primary: #2F6B4F;
667
+ --color-primary-hover: #275A42;
668
+ --color-primary-pressed: #1F4935;
669
+ --color-primary-soft: rgba(47, 107, 79, 0.10);
670
+ --color-primary-border: #BFD8C6;
671
+ }
672
+ html.dark[data-palette="forest"],
673
+ html.dark [data-palette="forest"] {
674
+ --color-primary: #7AA874;
675
+ --color-primary-hover: #95BC90;
676
+ --color-primary-pressed: #B1CFAD;
677
+ --color-primary-soft: rgba(122, 168, 116, 0.14);
678
+ --color-primary-border: rgba(122, 168, 116, 0.38);
679
+ }
680
+
571
681
  /* Comfortable density (html[data-density], written by the settings store):
572
682
  the pre-v2 control heights and a wider gutter. */
573
683
  [data-density="comfortable"] {
@@ -654,6 +764,9 @@ button, input, select, textarea {
654
764
  /* ==========================================================================
655
765
  MINT Utility Classes (for Tailwind v4 compatibility)
656
766
  ========================================================================== */
767
+ /* In Tailwind's utilities layer: unlayered, these beat every layered rule, so a
768
+ host's responsive variant (`lg:flex-row`) lost to the SDK's `.flex-col`. */
769
+ @layer utilities {
657
770
  .bg-bg-hover {
658
771
  background-color: var(--bg-tertiary);
659
772
  }
@@ -1029,6 +1142,7 @@ button, input, select, textarea {
1029
1142
  .max-w-sm {
1030
1143
  max-width: 24rem;
1031
1144
  }
1145
+ } /* @layer utilities */
1032
1146
 
1033
1147
  /* ==========================================================================
1034
1148
  Reduced Motion
@@ -1490,10 +1604,11 @@ button, input, select, textarea {
1490
1604
  }
1491
1605
 
1492
1606
  /* Floating variant: all sections appear as separate cards on a background,
1493
- spaced by the density gutter (8px, 12px comfortable). */
1607
+ 16px from the window edge and spaced by the density gutter (8px, 12px
1608
+ comfortable). */
1494
1609
  .mint-layout--floating {
1495
1610
  background-color: var(--bg-primary);
1496
- padding: var(--mint-gutter);
1611
+ padding: var(--mint-page-inset);
1497
1612
  gap: var(--mint-gutter);
1498
1613
  }
1499
1614
 
@@ -2267,10 +2382,10 @@ button, input, select, textarea {
2267
2382
  padding: 0 0.375rem 0 0;
2268
2383
  }
2269
2384
 
2270
- /* Variant: card - flat floating card, inset by the layout gutter */
2385
+ /* Variant: card - flat floating card, inset 16px from the window edge */
2271
2386
  .mint-topbar--card {
2272
- width: calc(100% - 2 * var(--mint-gutter));
2273
- margin: var(--mint-gutter) var(--mint-gutter) 0;
2387
+ width: calc(100% - 2 * var(--mint-page-inset));
2388
+ margin: var(--mint-page-inset) var(--mint-page-inset) 0;
2274
2389
  padding: 0.375rem 0.5rem 0.375rem 0.625rem;
2275
2390
  border-radius: var(--radius-lg);
2276
2391
  border: 1px solid var(--border-color);
@@ -4815,7 +4930,7 @@ button, input, select, textarea {
4815
4930
  width: 2.5rem;
4816
4931
  height: 3px;
4817
4932
  background-color: var(--border-color);
4818
- border-radius: 9999px;
4933
+ border-radius: var(--radius-sm);
4819
4934
  margin: 0.5rem auto 0;
4820
4935
  flex-shrink: 0;
4821
4936
  }
@@ -4863,7 +4978,7 @@ button, input, select, textarea {
4863
4978
  width: 1.75rem;
4864
4979
  height: 1.75rem;
4865
4980
  padding: 0;
4866
- border-radius: 0.4375rem;
4981
+ border-radius: var(--radius-md);
4867
4982
  color: var(--text-secondary);
4868
4983
  background: none;
4869
4984
  border: none;
@@ -5477,7 +5592,7 @@ button, input, select, textarea {
5477
5592
  /* Horizontal padding matches BaseInput canonical scale (10/12/16) so FormField's
5478
5593
  12px label indent aligns with the numeric text across all input types. */
5479
5594
  .mint-number-input__input--sm { padding: 0.25rem 0.625rem; font-size: 0.8125rem; }
5480
- .mint-number-input__input--md { padding: 0.375rem 0.75rem; font-size: 0.75rem; }
5595
+ .mint-number-input__input--md { padding: 0.375rem 0.75rem; font-size: 0.875rem; }
5481
5596
  .mint-number-input__input--lg { padding: 0.5rem 1rem; font-size: 1rem; }
5482
5597
 
5483
5598
  /* ---------- Unit suffix ---------- */
@@ -6310,7 +6425,9 @@ button, input, select, textarea {
6310
6425
  gap: 0.625rem;
6311
6426
  box-sizing: border-box;
6312
6427
  min-height: 2.5rem;
6313
- padding: 0.375rem 0.625rem 0.375rem 0.75rem;
6428
+ /* 4px block padding: a 28px header control plus padding plus the 1px rule
6429
+ stays inside the 40px strip (6px made it 41px). */
6430
+ padding: 0.25rem 0.625rem 0.25rem 0.75rem;
6314
6431
  border-bottom: 1px solid var(--border-color);
6315
6432
  flex-shrink: 0;
6316
6433
  }
@@ -6407,7 +6524,7 @@ button.mint-section-card__row:hover {
6407
6524
  /* Comfortable density gives the header and rows back their height. */
6408
6525
  [data-density="comfortable"] .mint-section-card__header {
6409
6526
  min-height: 2.75rem;
6410
- padding: 0.5rem 0.75rem 0.5rem 0.875rem;
6527
+ padding: 0.25rem 0.75rem 0.25rem 0.875rem;
6411
6528
  }
6412
6529
 
6413
6530
  [data-density="comfortable"] .mint-section-card__row {
@@ -11204,7 +11321,7 @@ html.dark .mint-pill--soft {
11204
11321
  }
11205
11322
 
11206
11323
  .mint-dataframe__row:last-child .mint-dataframe__td {
11207
- border-bottom: none;
11324
+ border-bottom: none !important;
11208
11325
  }
11209
11326
 
11210
11327
  /* Empty / error placeholder host (content comes from EmptyState) */
@@ -11763,13 +11880,13 @@ html.dark .mint-dataframe__loading {
11763
11880
  }
11764
11881
 
11765
11882
  /* ========================================================================
11766
- Rail variant (default) — single filled track, pill ends
11883
+ Rail variant (default) — single filled track, square-ish ends (v2: no capsules)
11767
11884
  ======================================================================== */
11768
11885
 
11769
11886
  .mint-progress__track {
11770
11887
  width: 100%;
11771
11888
  background-color: var(--bg-tertiary);
11772
- border-radius: 9999px; /* pill ends — spec */
11889
+ border-radius: var(--radius-sm);
11773
11890
  overflow: hidden;
11774
11891
  }
11775
11892
 
@@ -11779,7 +11896,7 @@ html.dark .mint-dataframe__loading {
11779
11896
 
11780
11897
  .mint-progress__bar {
11781
11898
  height: 100%;
11782
- border-radius: 9999px;
11899
+ border-radius: var(--radius-sm);
11783
11900
  transition: width 0.3s ease;
11784
11901
  }
11785
11902
 
@@ -12835,6 +12952,12 @@ html.dark .mint-stale-banner {
12835
12952
  border-bottom-color: var(--border-color);
12836
12953
  }
12837
12954
 
12955
+ /* The pane ends after the last group's last row: no closing hairline there,
12956
+ it would sit on the footer rule with nothing between them. */
12957
+ .mint-settings-modal__group:last-of-type > .mint-settings-modal__group-grid > .mint-settings-modal__row:last-child {
12958
+ border-bottom: none;
12959
+ }
12960
+
12838
12961
  /* The field cell anchors the ↺ reset, which sits just left of the control (5d).
12839
12962
  --_settings-control-w is the control's width; stacked fields (text, custom slots)
12840
12963
  keep 0 and put the reset at the right end of their label line. */
@@ -13453,10 +13576,9 @@ html.dark .mint-stale-banner {
13453
13576
  .mint-settings-modal__density-preview {
13454
13577
  --_density-row: 2.125rem;
13455
13578
 
13579
+ /* A hairline table in the setting row, not a bordered box inside the modal. */
13456
13580
  grid-column: 1 / -1;
13457
13581
  overflow: hidden;
13458
- border: 1px solid var(--border-color);
13459
- border-radius: var(--radius-md);
13460
13582
  font-size: 0.75rem;
13461
13583
  }
13462
13584
 
@@ -50,5 +50,5 @@ export type PlatformContext = Partial<Omit<PlatformFrontendContext, 'plugin'>> &
50
50
  theme: ThemeMode;
51
51
  };
52
52
  export type ThemeMode = 'light' | 'dark' | 'system';
53
- export type ColorPalette = 'default' | 'colorblind' | 'viridis' | 'pastel';
53
+ export type ColorPalette = 'default' | 'colorblind' | 'purple' | 'ocean' | 'forest';
54
54
  export type TableDensity = 'compact' | 'normal' | 'comfortable';
@@ -1,6 +1,6 @@
1
- import { o as useApi, r as readErrorMessage } from "./experiment-43OJtH7R.js";
2
- import { _ as APP_EXPERIMENT_KEY, a as parseExperimentId, t as isRecord } from "./records-B6gpM_3e.js";
3
- import { t as useRequest } from "./useRequest-D506eHi8.js";
1
+ import { o as useApi, r as readErrorMessage } from "./experiment-DyO54FQB.js";
2
+ import { _ as APP_EXPERIMENT_KEY, a as parseExperimentId, t as isRecord } from "./records-DnK_1Q_S.js";
3
+ import { t as useRequest } from "./useRequest-Dqw12k2s.js";
4
4
  import { computed, inject, ref, shallowRef, toValue, watch } from "vue";
5
5
  //#region src/composables/experimentDesignData.ts
6
6
  function isPlatformDesignDataResponse(value) {
@@ -363,4 +363,4 @@ function useExperimentSamples(options = {}) {
363
363
  //#endregion
364
364
  export { useFileImport as a, extractSampleNamesFromDesignData as c, readFileAsText as i, extractSampleOptionsFromDesignData as l, detectDelimiter as n, validateImportFile as o, parseDelimitedText as r, useExperimentData as s, useExperimentSamples as t, unwrapExperimentDesignData as u };
365
365
 
366
- //# sourceMappingURL=useExperimentSamples-DHnxKFAF.js.map
366
+ //# sourceMappingURL=useExperimentSamples-BGN1dmcR.js.map