@morscherlab/mint-sdk 1.5.0-beta.2 → 1.5.0-beta.4

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 (118) hide show
  1. package/dist/{AlertBox-CIhqsWbN.js → AlertBox-CexONPhA.js} +2 -2
  2. package/dist/{AlertBox-CIhqsWbN.js.map → AlertBox-CexONPhA.js.map} +1 -1
  3. package/dist/{AppSidebar-BDrd7Kwn.js → AppSidebar-FxlF5_dI.js} +55 -40
  4. package/dist/AppSidebar-FxlF5_dI.js.map +1 -0
  5. package/dist/{ConfirmDialog-CjWoxAD1.js → ConfirmDialog-D9QXFpsy.js} +2 -2
  6. package/dist/ConfirmDialog-D9QXFpsy.js.map +1 -0
  7. package/dist/{ExperimentPopover-BM92LlrQ.js → ExperimentPopover-Bbd6RaoH.js} +3 -3
  8. package/dist/{ExperimentPopover-BM92LlrQ.js.map → ExperimentPopover-Bbd6RaoH.js.map} +1 -1
  9. package/dist/{ExperimentSelectorModal-LsB1ABmh.js → ExperimentSelectorModal-CUkKmgfr.js} +35 -6
  10. package/dist/ExperimentSelectorModal-CUkKmgfr.js.map +1 -0
  11. package/dist/{SegmentedControl-Dz41vAFM.js → SegmentedControl-C-sckoJZ.js} +2 -2
  12. package/dist/{SegmentedControl-Dz41vAFM.js.map → SegmentedControl-C-sckoJZ.js.map} +1 -1
  13. package/dist/{SettingsModal-C-MSR-bk.js → SettingsModal-BIC0dAYc.js} +6 -6
  14. package/dist/{SettingsModal-C-MSR-bk.js.map → SettingsModal-BIC0dAYc.js.map} +1 -1
  15. package/dist/components/FormBuilder.vue.d.ts +1 -1
  16. package/dist/components/PluginIcon.vue.d.ts +2 -2
  17. package/dist/components/SectionCard.vue.d.ts +13 -1
  18. package/dist/components/SettingsModal.vue.d.ts +1 -1
  19. package/dist/components/internal/FormSchemaInternal.vue.d.ts +9 -9
  20. package/dist/components/internal/FormSectionRenderer.vue.d.ts +4 -4
  21. package/dist/composables/useExperimentSelector.d.ts +2 -0
  22. package/dist/composables/useOnboarding.d.ts +1 -1
  23. package/dist/{controlSchemaModel-BbXbMgc6.js → controlSchemaModel-C_XqpkgE.js} +2 -2
  24. package/dist/{controlSchemaModel-BbXbMgc6.js.map → controlSchemaModel-C_XqpkgE.js.map} +1 -1
  25. package/dist/{data-LzdkEZJ-.js → data-CfY7o8QC.js} +9 -9
  26. package/dist/{data-LzdkEZJ-.js.map → data-CfY7o8QC.js.map} +1 -1
  27. package/dist/data.js +7 -7
  28. package/dist/index.d.ts +0 -1
  29. package/dist/index.js +14 -19
  30. package/dist/index.js.map +1 -1
  31. package/dist/{install-UTqrAgHe.js → install-QF3Sh82O.js} +15 -39
  32. package/dist/install-QF3Sh82O.js.map +1 -0
  33. package/dist/install.js +1 -1
  34. package/dist/{lab-CbdDLAVr.js → lab-BcX5JBSY.js} +34 -112
  35. package/dist/lab-BcX5JBSY.js.map +1 -0
  36. package/dist/lab.js +4 -4
  37. package/dist/{records-CWRztE5M.js → records-BAymyHAn.js} +10 -110
  38. package/dist/records-BAymyHAn.js.map +1 -0
  39. package/dist/{runtime-DrL6lKAb.js → runtime-DngeJtdq.js} +82 -45
  40. package/dist/runtime-DngeJtdq.js.map +1 -0
  41. package/dist/runtime.js +6 -6
  42. package/dist/{shell-Ch7cJnjo.js → shell-CWZi97nW.js} +4 -4
  43. package/dist/{shell-Ch7cJnjo.js.map → shell-CWZi97nW.js.map} +1 -1
  44. package/dist/shell.js +4 -4
  45. package/dist/styles.css +181 -125
  46. package/dist/styles.d.ts +1 -0
  47. package/dist/types/index.d.ts +1 -1
  48. package/dist/types/instrument.d.ts +5 -17
  49. package/dist/{useExperimentSamples-Cz2v3V_q.js → useExperimentSamples-DEDAKa2E.js} +3 -3
  50. package/dist/{useExperimentSamples-Cz2v3V_q.js.map → useExperimentSamples-DEDAKa2E.js.map} +1 -1
  51. package/dist/{useListReorder-QqJc1dpX.js → useListReorder-W1bzK_bo.js} +15 -3
  52. package/dist/useListReorder-W1bzK_bo.js.map +1 -0
  53. package/dist/{useRackEditor-BHGM1Ngz.js → useRackEditor-Bmtuo0aj.js} +155 -26
  54. package/dist/useRackEditor-Bmtuo0aj.js.map +1 -0
  55. package/dist/{useRealtime-CNQbrS01.js → useRealtime-jOetF2mM.js} +3 -3
  56. package/dist/{useRealtime-CNQbrS01.js.map → useRealtime-jOetF2mM.js.map} +1 -1
  57. package/dist/{useRequest-Bfsh7gIm.js → useRequest-D9-3BS-3.js} +2 -2
  58. package/dist/{useRequest-Bfsh7gIm.js.map → useRequest-D9-3BS-3.js.map} +1 -1
  59. package/package.json +7 -4
  60. package/src/__tests__/components/AppTopBarOnboarding.test.ts +10 -0
  61. package/src/__tests__/components/ConfirmDialog.test.ts +2 -2
  62. package/src/__tests__/components/ExperimentSelectorModal.test.ts +16 -0
  63. package/src/__tests__/components/SectionCard.test.ts +33 -0
  64. package/src/__tests__/components/deprecationTags.test.ts +4 -18
  65. package/src/__tests__/composables/useJobsEndpoint.test.ts +50 -0
  66. package/src/__tests__/composables/useOnboarding.test.ts +2 -2
  67. package/src/__tests__/docs/frontendDocsCatalog.test.ts +3 -3
  68. package/src/components/AppSidebar.vue +2 -2
  69. package/src/components/CollapsibleCard.vue +1 -1
  70. package/src/components/ConfirmDialog.vue +1 -1
  71. package/src/components/ExperimentSelectorModal.vue +35 -0
  72. package/src/components/FileUploader.vue +3 -35
  73. package/src/components/GeneratedPluginView.vue +35 -81
  74. package/src/components/GeneratedResultRenderer.vue +2 -1
  75. package/src/components/InstrumentStatusPanels.vue +3 -3
  76. package/src/components/PlotlyChart.vue +1 -1
  77. package/src/components/PluginIcon.story.vue +2 -2
  78. package/src/components/PluginIcon.vue +2 -2
  79. package/src/components/SectionCard.vue +42 -6
  80. package/src/components/internal/AppTopBarOnboardingInternal.vue +30 -14
  81. package/src/composables/index.ts +1 -2
  82. package/src/composables/useExperimentSelector.ts +4 -0
  83. package/src/composables/useJobsEndpoint.ts +15 -4
  84. package/src/composables/useOnboarding.ts +3 -3
  85. package/src/generated-ui/main.ts +3 -1
  86. package/src/index.ts +0 -3
  87. package/src/styles/components/alert-box.css +1 -1
  88. package/src/styles/components/app-sidebar.css +5 -5
  89. package/src/styles/components/button.css +3 -3
  90. package/src/styles/components/checkbox.css +1 -1
  91. package/src/styles/components/collapsible-card.css +1 -1
  92. package/src/styles/components/confirm-dialog.css +2 -2
  93. package/src/styles/components/file-uploader.css +3 -3
  94. package/src/styles/components/icon-button.css +3 -3
  95. package/src/styles/components/loading-spinner.css +1 -1
  96. package/src/styles/components/onboarding.css +39 -0
  97. package/src/styles/components/pill.css +1 -1
  98. package/src/styles/components/plugin-icon.css +2 -2
  99. package/src/styles/components/presence-avatars.css +4 -4
  100. package/src/styles/components/progress-bar.css +1 -1
  101. package/src/styles/components/section-card.css +65 -6
  102. package/src/styles/components/sequence-input.css +1 -1
  103. package/src/styles/components/slider.css +1 -1
  104. package/src/styles/components/toggle.css +1 -1
  105. package/src/styles/variables.css +10 -4
  106. package/src/types/index.ts +0 -1
  107. package/src/types/instrument.ts +5 -18
  108. package/dist/AppSidebar-BDrd7Kwn.js.map +0 -1
  109. package/dist/ConfirmDialog-CjWoxAD1.js.map +0 -1
  110. package/dist/ExperimentSelectorModal-LsB1ABmh.js.map +0 -1
  111. package/dist/deprecatedRootExports.d.ts +0 -191
  112. package/dist/install-UTqrAgHe.js.map +0 -1
  113. package/dist/lab-CbdDLAVr.js.map +0 -1
  114. package/dist/records-CWRztE5M.js.map +0 -1
  115. package/dist/runtime-DrL6lKAb.js.map +0 -1
  116. package/dist/useListReorder-QqJc1dpX.js.map +0 -1
  117. package/dist/useRackEditor-BHGM1Ngz.js.map +0 -1
  118. package/src/deprecatedRootExports.ts +0 -226
package/dist/data.js CHANGED
@@ -1,10 +1,10 @@
1
- import { C as formatExperimentDate, S as experimentIdFromRoute, _ as APP_EXPERIMENT_KEY, b as SORT_OPTIONS, c as SecretInput_default, s as TagsInput_default, u as pluginSecrets_exports, v as useAppExperiment, w as resolveExperimentCode, x as datePresetToISO, y as DATE_PRESET_OPTIONS } from "./records-CWRztE5M.js";
2
- import { a as normalizeSearchQuery, i as candidateMatchesSearch, o as useTextSearch } from "./AlertBox-CIhqsWbN.js";
3
- import { i as JobsStatusTray_default } from "./useRealtime-CNQbrS01.js";
4
- import { r as useExperimentSelector, t as ExperimentSelectorModal_default } from "./ExperimentSelectorModal-LsB1ABmh.js";
1
+ import { C as formatExperimentDate, S as experimentIdFromRoute, _ as APP_EXPERIMENT_KEY, b as SORT_OPTIONS, c as SecretInput_default, s as TagsInput_default, u as pluginSecrets_exports, v as useAppExperiment, w as resolveExperimentCode, x as datePresetToISO, y as DATE_PRESET_OPTIONS } from "./records-BAymyHAn.js";
2
+ import { a as normalizeSearchQuery, i as candidateMatchesSearch, o as useTextSearch } from "./AlertBox-CexONPhA.js";
3
+ import { i as JobsStatusTray_default } from "./useRealtime-jOetF2mM.js";
4
+ import { r as useExperimentSelector, t as ExperimentSelectorModal_default } from "./ExperimentSelectorModal-CUkKmgfr.js";
5
5
  import { t as experimentStatus_exports } from "./experimentStatus-DCn2QKG7.js";
6
6
  import { t as ANALYSIS_FILE_ARTIFACT_SCHEMA } from "./analysisArtifactTypes-Cy3D0Ipg.js";
7
- import { _ as ArtifactSaveDialog_default, a as usePlatformFilePickerAdapter, c as encodePlatformPickerPath, d as StaleFormBanner_default, f as VersionConflictDialog_default, g as ExperimentCodeBadge_default, h as FilePicker_default, i as useFileBrowser, l as fieldNameLabel, m as AuditTrail_default, n as buildAnalysisArtifactTargetQuery, o as createFilePickerAdapter, p as BatchProgressList_default, r as parseAnalysisArtifactTarget, s as decodePlatformPickerPath, u as useVersionedSave, v as ArtifactSelectorModal_default, y as useArtifacts } from "./data-LzdkEZJ-.js";
8
- import { t as ExperimentPopover_default } from "./ExperimentPopover-BM92LlrQ.js";
9
- import { a as readTableFileAsCsv, c as useExperimentData, d as unwrapExperimentDesignData, i as readFileAsText, l as extractSampleNamesFromDesignData, n as detectDelimiter, o as useFileImport, r as parseDelimitedText, s as validateImportFile, t as useExperimentSamples, u as extractSampleOptionsFromDesignData } from "./useExperimentSamples-Cz2v3V_q.js";
7
+ import { _ as ArtifactSaveDialog_default, a as usePlatformFilePickerAdapter, c as encodePlatformPickerPath, d as StaleFormBanner_default, f as VersionConflictDialog_default, g as ExperimentCodeBadge_default, h as FilePicker_default, i as useFileBrowser, l as fieldNameLabel, m as AuditTrail_default, n as buildAnalysisArtifactTargetQuery, o as createFilePickerAdapter, p as BatchProgressList_default, r as parseAnalysisArtifactTarget, s as decodePlatformPickerPath, u as useVersionedSave, v as ArtifactSelectorModal_default, y as useArtifacts } from "./data-CfY7o8QC.js";
8
+ import { t as ExperimentPopover_default } from "./ExperimentPopover-Bbd6RaoH.js";
9
+ import { a as readTableFileAsCsv, c as useExperimentData, d as unwrapExperimentDesignData, i as readFileAsText, l as extractSampleNamesFromDesignData, n as detectDelimiter, o as useFileImport, r as parseDelimitedText, s as validateImportFile, t as useExperimentSamples, u as extractSampleOptionsFromDesignData } from "./useExperimentSamples-DEDAKa2E.js";
10
10
  export { ANALYSIS_FILE_ARTIFACT_SCHEMA, APP_EXPERIMENT_KEY, ArtifactSaveDialog_default as ArtifactSaveDialog, ArtifactSelectorModal_default as ArtifactSelectorModal, AuditTrail_default as AuditTrail, BatchProgressList_default as BatchProgressList, DATE_PRESET_OPTIONS, ExperimentCodeBadge_default as ExperimentCodeBadge, ExperimentPopover_default as ExperimentPopover, ExperimentSelectorModal_default as ExperimentSelectorModal, FilePicker_default as FilePicker, JobsStatusTray_default as JobsStatusTray, SORT_OPTIONS, SecretInput_default as SecretInput, StaleFormBanner_default as StaleFormBanner, TagsInput_default as TagsInput, VersionConflictDialog_default as VersionConflictDialog, buildAnalysisArtifactTargetQuery, candidateMatchesSearch, createFilePickerAdapter, datePresetToISO, decodePlatformPickerPath, detectDelimiter, encodePlatformPickerPath, experimentIdFromRoute, experimentStatus_exports as experimentStatus, extractSampleNamesFromDesignData, extractSampleOptionsFromDesignData, fieldNameLabel, formatExperimentDate, normalizeSearchQuery, parseAnalysisArtifactTarget, parseDelimitedText, pluginSecrets_exports as pluginSecret, readFileAsText, readTableFileAsCsv, resolveExperimentCode, unwrapExperimentDesignData, useAppExperiment, useArtifacts, useExperimentData, useExperimentSamples, useExperimentSelector, useFileBrowser, useFileImport, usePlatformFilePickerAdapter, useTextSearch, useVersionedSave, validateImportFile };
package/dist/index.d.ts CHANGED
@@ -3,5 +3,4 @@ export { MINTSdk, default } from './install';
3
3
  export * from './components';
4
4
  export * from './composables';
5
5
  export * from './stores';
6
- export * from './deprecatedRootExports';
7
6
  export type * from './types';
package/dist/index.js CHANGED
@@ -1,24 +1,19 @@
1
1
  import { a as BaseButton_default, n as BaseModal_default } from "./useDropdownState-uFIz6Yv8.js";
2
2
  import { c as tableDensityToSize, d as MintApiError, f as mintApiErrorFromResponse, l as tryUseSettingsStore, s as colorPalettes, t as useExperimentStore, u as useSettingsStore } from "./experiment-DyO54FQB.js";
3
- import { B as Tooltip_default, C as formatExperimentDate, H as useListSelection, I as FormField_default, K as BaseInput_default, L as EmptyState_default, T as FileUploader_default, U as useSelectionLimit, V as BaseSelect_default, _ as APP_EXPERIMENT_KEY, b as SORT_OPTIONS, d as isActiveJobStatus, f as isTerminalJobStatus, g as resolveJobCapabilities, h as normalizeJobState, i as getInjectedPlatformContext, m as normalizeJobPercent, o as resolveCurrentPluginId, p as jobStatusLabel, r as Skeleton_default, v as useAppExperiment, w as resolveExperimentCode, x as datePresetToISO, y as DATE_PRESET_OPTIONS, z as BaseCheckbox_default } from "./records-CWRztE5M.js";
4
- import { B as compareSortValues, H as BaseSlider_default, I as defineDataFrame, M as usePlatform, N as NumberInput_default, P as DatePicker_default, R as definePluginWorkspaceView, S as useSequenceUtils, U as BaseRadioGroup_default, V as useSortedItems, _ as getTypeDefault, g as getFieldRegistryEntry, y as useConcentrationUnits } from "./useListReorder-QqJc1dpX.js";
5
- import { D as BaseTabs_default, E as BasePill_default, a as useReagentSeries, b as ProgressBar_default, h as useProtocolTemplates, i as generateDilutionSeries, n as DEFAULT_PRESETS, r as DEFAULT_UNITS, v as useSampleGroups, y as SectionCard_default } from "./lab-CbdDLAVr.js";
6
- import { t as SegmentedControl_default } from "./SegmentedControl-Dz41vAFM.js";
7
- import { a as AppContainer_default, i as Divider_default, n as FormBuilder_default, o as Calendar_default, r as Breadcrumb_default, t as MINTSdk } from "./install-UTqrAgHe.js";
8
- import { r as LoadingSpinner_default, t as AlertBox_default } from "./AlertBox-CIhqsWbN.js";
9
- import { C as hexToHsl, D as DataFrame_default, E as sampleTypeMarker, S as deriveShade, _ as mintPlotlyTemplate, r as useScheduleDrag, s as downloadBlob, t as useRackEditor, w as hslToHex } from "./useRackEditor-BHGM1Ngz.js";
10
- import { c as generatedJobFormSchema, d as PluginWorkspaceView_default, f as useControlWorkspace, g as useToast, h as AppToastContainer_default, l as normalizeGeneratedJobInput, s as generatedJobDefaults, u as Avatar_default } from "./runtime-DrL6lKAb.js";
11
- import { n as ActionMenu_default, t as useRequest } from "./useRequest-Bfsh7gIm.js";
12
- import { C as usePluginWorkspace, D as useControlSchema, E as getControlDefaults, F as getDefaultControlView, I as CollapsibleCard_default, L as ThemeToggle_default, R as useTheme, T as defineControls, d as useForm, l as useFormBuilder, p as providePluginIdentity, u as evaluateCondition, w as defineControlComponentBindings, y as PluginIcon_default } from "./AppSidebar-BDrd7Kwn.js";
3
+ import { B as Tooltip_default, I as FormField_default, K as BaseInput_default, L as EmptyState_default, T as FileUploader_default, V as BaseSelect_default, i as getInjectedPlatformContext, r as Skeleton_default, z as BaseCheckbox_default } from "./records-BAymyHAn.js";
4
+ import { H as BaseSlider_default, I as defineDataFrame, M as usePlatform, N as NumberInput_default, P as DatePicker_default, R as definePluginWorkspaceView, U as BaseRadioGroup_default } from "./useListReorder-W1bzK_bo.js";
5
+ import { E as BaseTabs_default, T as BasePill_default, y as ProgressBar_default } from "./lab-BcX5JBSY.js";
6
+ import { t as SegmentedControl_default } from "./SegmentedControl-C-sckoJZ.js";
7
+ import { a as Calendar_default, i as Divider_default, n as FormBuilder_default, r as Breadcrumb_default, t as MINTSdk } from "./install-QF3Sh82O.js";
8
+ import { r as LoadingSpinner_default, t as AlertBox_default } from "./AlertBox-CexONPhA.js";
9
+ import { D as SectionCard_default, O as DataFrame_default, s as downloadBlob } from "./useRackEditor-Bmtuo0aj.js";
10
+ import { _ as useToast, d as AppContainer_default, f as PluginWorkspaceView_default, g as AppToastContainer_default, u as Avatar_default } from "./runtime-DngeJtdq.js";
11
+ import { n as ActionMenu_default, t as useRequest } from "./useRequest-D9-3BS-3.js";
12
+ import { I as CollapsibleCard_default, L as ThemeToggle_default, R as useTheme, p as providePluginIdentity, y as PluginIcon_default } from "./AppSidebar-FxlF5_dI.js";
13
13
  import { r as useAuthStore } from "./auth-SliLnFre.js";
14
- import { t as defineControlModel } from "./controlSchemaModel-BbXbMgc6.js";
15
- import { t as ConfirmDialog_default } from "./ConfirmDialog-CjWoxAD1.js";
16
- import { t as SettingsModal_default } from "./SettingsModal-C-MSR-bk.js";
17
- import { r as useExperimentSelector } from "./ExperimentSelectorModal-LsB1ABmh.js";
18
- import { i as useFileBrowser, n as buildAnalysisArtifactTargetQuery, r as parseAnalysisArtifactTarget } from "./data-LzdkEZJ-.js";
19
- import { d as unwrapExperimentDesignData, i as readFileAsText, l as extractSampleNamesFromDesignData, n as detectDelimiter, o as useFileImport, s as validateImportFile, t as useExperimentSamples, u as extractSampleOptionsFromDesignData } from "./useExperimentSamples-Cz2v3V_q.js";
20
- import { t as useExpansionSet } from "./useExpansionSet-CvoNMZJi.js";
21
- import { a as useManualLayoutResize, i as resizedVerticalSplitPercent, n as resizedLeadingPanelWidth, r as resizedTrailingPanelWidth } from "./shell-Ch7cJnjo.js";
14
+ import { t as defineControlModel } from "./controlSchemaModel-C_XqpkgE.js";
15
+ import { t as ConfirmDialog_default } from "./ConfirmDialog-D9QXFpsy.js";
16
+ import { t as SettingsModal_default } from "./SettingsModal-BIC0dAYc.js";
22
17
  import "./stores/index.js";
23
18
  import { computed } from "vue";
24
19
  //#region src/composables/useExperiment.ts
@@ -69,6 +64,6 @@ function resolvePluginFrontendBase(fallbackBase = "/") {
69
64
  return normalizePluginRoutePrefix(context.plugin?.route_prefix) ?? fallbackBase;
70
65
  }
71
66
  //#endregion
72
- export { APP_EXPERIMENT_KEY, ActionMenu_default as ActionMenu, AlertBox_default as AlertBox, AppContainer_default as AppContainer, AppToastContainer_default as AppToastContainer, Avatar_default as Avatar, BaseButton_default as BaseButton, BaseCheckbox_default as BaseCheckbox, BaseInput_default as BaseInput, BaseModal_default as BaseModal, BasePill_default as BasePill, BaseRadioGroup_default as BaseRadioGroup, BaseSelect_default as BaseSelect, BaseSlider_default as BaseSlider, BaseTabs_default as BaseTabs, Breadcrumb_default as Breadcrumb, Calendar_default as Calendar, CollapsibleCard_default as CollapsibleCard, ConfirmDialog_default as ConfirmDialog, DATE_PRESET_OPTIONS, DEFAULT_PRESETS, DEFAULT_UNITS, DataFrame_default as DataFrame, DatePicker_default as DatePicker, Divider_default as Divider, EmptyState_default as EmptyState, FileUploader_default as FileUploader, FormBuilder_default as FormBuilder, FormField_default as FormField, LoadingSpinner_default as LoadingSpinner, MINTSdk, MINTSdk as default, MintApiError, NumberInput_default as NumberInput, PluginIcon_default as PluginIcon, PluginWorkspaceView_default as PluginWorkspaceView, ProgressBar_default as ProgressBar, SORT_OPTIONS, SectionCard_default as SectionCard, SegmentedControl_default as SegmentedControl, SettingsModal_default as SettingsModal, Skeleton_default as Skeleton, ThemeToggle_default as ThemeToggle, Tooltip_default as Tooltip, buildAnalysisArtifactTargetQuery, colorPalettes, compareSortValues, datePresetToISO, defineControlComponentBindings, defineControlModel, defineControls, defineDataFrame, definePluginWorkspaceView, deriveShade, detectDelimiter, downloadBlob, evaluateCondition, extractSampleNamesFromDesignData, extractSampleOptionsFromDesignData, formatExperimentDate, generateDilutionSeries, generatedJobDefaults, generatedJobFormSchema, getControlDefaults, getDefaultControlView, getFieldRegistryEntry, getTypeDefault, hexToHsl, hslToHex, isActiveJobStatus, isTerminalJobStatus, jobStatusLabel, mintApiErrorFromResponse, mintPlotlyTemplate, normalizeGeneratedJobInput, normalizeJobPercent, normalizeJobState, parseAnalysisArtifactTarget, providePluginIdentity, readFileAsText, resizedLeadingPanelWidth, resizedTrailingPanelWidth, resizedVerticalSplitPercent, resolveCurrentPluginId, resolveExperimentCode, resolveJobCapabilities, resolvePluginFrontendBase, sampleTypeMarker, tableDensityToSize, tryUseSettingsStore, unwrapExperimentDesignData, useAppExperiment, useAuthStore, useConcentrationUnits, useControlSchema, useControlWorkspace, useExpansionSet, useExperiment, useExperimentSamples, useExperimentSelector, useExperimentStore, useFileBrowser, useFileImport, useForm, useFormBuilder, useListSelection, useManualLayoutResize, usePlatform, usePluginWorkspace, useProtocolTemplates, useRackEditor, useReagentSeries, useRequest, useSampleGroups, useScheduleDrag, useSelectionLimit, useSequenceUtils, useSettingsStore, useSortedItems, useTheme, useToast, validateImportFile };
67
+ export { ActionMenu_default as ActionMenu, AlertBox_default as AlertBox, AppContainer_default as AppContainer, AppToastContainer_default as AppToastContainer, Avatar_default as Avatar, BaseButton_default as BaseButton, BaseCheckbox_default as BaseCheckbox, BaseInput_default as BaseInput, BaseModal_default as BaseModal, BasePill_default as BasePill, BaseRadioGroup_default as BaseRadioGroup, BaseSelect_default as BaseSelect, BaseSlider_default as BaseSlider, BaseTabs_default as BaseTabs, Breadcrumb_default as Breadcrumb, Calendar_default as Calendar, CollapsibleCard_default as CollapsibleCard, ConfirmDialog_default as ConfirmDialog, DataFrame_default as DataFrame, DatePicker_default as DatePicker, Divider_default as Divider, EmptyState_default as EmptyState, FileUploader_default as FileUploader, FormBuilder_default as FormBuilder, FormField_default as FormField, LoadingSpinner_default as LoadingSpinner, MINTSdk, MINTSdk as default, MintApiError, NumberInput_default as NumberInput, PluginIcon_default as PluginIcon, PluginWorkspaceView_default as PluginWorkspaceView, ProgressBar_default as ProgressBar, SectionCard_default as SectionCard, SegmentedControl_default as SegmentedControl, SettingsModal_default as SettingsModal, Skeleton_default as Skeleton, ThemeToggle_default as ThemeToggle, Tooltip_default as Tooltip, colorPalettes, defineControlModel, defineDataFrame, definePluginWorkspaceView, downloadBlob, mintApiErrorFromResponse, providePluginIdentity, resolvePluginFrontendBase, tableDensityToSize, tryUseSettingsStore, useAuthStore, useExperiment, useExperimentStore, usePlatform, useRequest, useSettingsStore, useTheme, useToast };
73
68
 
74
69
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/composables/useExperiment.ts","../src/composables/pluginFrontendBase.ts"],"sourcesContent":["import { computed, type ComputedRef } from 'vue'\nimport { useExperimentStore } from '../stores/experiment'\nimport type { ExperimentSummary } from '../types'\n\n/** Load state of the current experiment record. */\nexport type ExperimentLoadStatus = 'idle' | 'loading' | 'ready' | 'error'\n\nexport interface UseExperimentReturn {\n /** Id of the current experiment; `null` when none is selected. */\n id: ComputedRef<number | null>\n /** Record of the current experiment, once the platform returned it. */\n current: ComputedRef<ExperimentSummary | null>\n /** `idle` with no selection, then `loading`, `ready` or `error`. */\n status: ComputedRef<ExperimentLoadStatus>\n /** Message of the last failed load, or `null`. */\n error: ComputedRef<string | null>\n /** Read the current experiment again. The selection does not change. */\n refresh: () => Promise<void>\n}\n\n/**\n * Read the experiment the plugin page works on.\n *\n * The platform selects the experiment and keeps it in step with the URL; this\n * composable only reads it. Watch `id` to respond to a change. In standalone\n * mode no experiment is selected and `id` stays `null`.\n *\n * @example\n * ```typescript\n * const experiment = useExperiment()\n * watch(experiment.id, (id) => { if (id !== null) void load(id) }, { immediate: true })\n * ```\n */\nexport function useExperiment(): UseExperimentReturn {\n const store = useExperimentStore()\n const id = computed(() => store.currentId)\n\n return {\n id,\n current: computed(() => store.current),\n status: computed(() => {\n if (store.currentId === null) return 'idle'\n if (store.isResolving) return 'loading'\n return store.error ? 'error' : 'ready'\n }),\n error: computed(() => store.error),\n refresh: store.refresh,\n }\n}\n","import { getInjectedPlatformContext } from './platformContextHelpers'\n\nfunction normalizePluginRoutePrefix(prefix: string | undefined): string | undefined {\n const candidate = prefix?.trim()\n if (!candidate) return undefined\n\n const path = candidate.split('/').filter(Boolean).join('/')\n return path ? `/${path}/` : '/'\n}\n\n/**\n * Resolve the Vue Router base for a plugin frontend.\n *\n * Integrated plugins use the platform-injected mount prefix. Standalone and\n * development builds retain the caller's Vite base unchanged.\n */\nexport function resolvePluginFrontendBase(fallbackBase: string = '/'): string {\n const context = getInjectedPlatformContext()\n if (!context?.isIntegrated) return fallbackBase\n\n return normalizePluginRoutePrefix(context.plugin?.route_prefix) ?? fallbackBase\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,SAAgB,gBAAqC;CACnD,MAAM,QAAQ,mBAAmB;CAGjC,OAAO;EACL,IAHS,eAAe,MAAM,SAG9B;EACA,SAAS,eAAe,MAAM,OAAO;EACrC,QAAQ,eAAe;GACrB,IAAI,MAAM,cAAc,MAAM,OAAO;GACrC,IAAI,MAAM,aAAa,OAAO;GAC9B,OAAO,MAAM,QAAQ,UAAU;EACjC,CAAC;EACD,OAAO,eAAe,MAAM,KAAK;EACjC,SAAS,MAAM;CACjB;AACF;;;AC9CA,SAAS,2BAA2B,QAAgD;CAClF,MAAM,YAAY,QAAQ,KAAK;CAC/B,IAAI,CAAC,WAAW,OAAO,KAAA;CAEvB,MAAM,OAAO,UAAU,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAC1D,OAAO,OAAO,IAAI,KAAK,KAAK;AAC9B;;;;;;;AAQA,SAAgB,0BAA0B,eAAuB,KAAa;CAC5E,MAAM,UAAU,2BAA2B;CAC3C,IAAI,CAAC,SAAS,cAAc,OAAO;CAEnC,OAAO,2BAA2B,QAAQ,QAAQ,YAAY,KAAK;AACrE"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/composables/useExperiment.ts","../src/composables/pluginFrontendBase.ts"],"sourcesContent":["import { computed, type ComputedRef } from 'vue'\nimport { useExperimentStore } from '../stores/experiment'\nimport type { ExperimentSummary } from '../types'\n\n/** Load state of the current experiment record. */\nexport type ExperimentLoadStatus = 'idle' | 'loading' | 'ready' | 'error'\n\nexport interface UseExperimentReturn {\n /** Id of the current experiment; `null` when none is selected. */\n id: ComputedRef<number | null>\n /** Record of the current experiment, once the platform returned it. */\n current: ComputedRef<ExperimentSummary | null>\n /** `idle` with no selection, then `loading`, `ready` or `error`. */\n status: ComputedRef<ExperimentLoadStatus>\n /** Message of the last failed load, or `null`. */\n error: ComputedRef<string | null>\n /** Read the current experiment again. The selection does not change. */\n refresh: () => Promise<void>\n}\n\n/**\n * Read the experiment the plugin page works on.\n *\n * The platform selects the experiment and keeps it in step with the URL; this\n * composable only reads it. Watch `id` to respond to a change. In standalone\n * mode no experiment is selected and `id` stays `null`.\n *\n * @example\n * ```typescript\n * const experiment = useExperiment()\n * watch(experiment.id, (id) => { if (id !== null) void load(id) }, { immediate: true })\n * ```\n */\nexport function useExperiment(): UseExperimentReturn {\n const store = useExperimentStore()\n const id = computed(() => store.currentId)\n\n return {\n id,\n current: computed(() => store.current),\n status: computed(() => {\n if (store.currentId === null) return 'idle'\n if (store.isResolving) return 'loading'\n return store.error ? 'error' : 'ready'\n }),\n error: computed(() => store.error),\n refresh: store.refresh,\n }\n}\n","import { getInjectedPlatformContext } from './platformContextHelpers'\n\nfunction normalizePluginRoutePrefix(prefix: string | undefined): string | undefined {\n const candidate = prefix?.trim()\n if (!candidate) return undefined\n\n const path = candidate.split('/').filter(Boolean).join('/')\n return path ? `/${path}/` : '/'\n}\n\n/**\n * Resolve the Vue Router base for a plugin frontend.\n *\n * Integrated plugins use the platform-injected mount prefix. Standalone and\n * development builds retain the caller's Vite base unchanged.\n */\nexport function resolvePluginFrontendBase(fallbackBase: string = '/'): string {\n const context = getInjectedPlatformContext()\n if (!context?.isIntegrated) return fallbackBase\n\n return normalizePluginRoutePrefix(context.plugin?.route_prefix) ?? fallbackBase\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,SAAgB,gBAAqC;CACnD,MAAM,QAAQ,mBAAmB;CAGjC,OAAO;EACL,IAHS,eAAe,MAAM,SAG9B;EACA,SAAS,eAAe,MAAM,OAAO;EACrC,QAAQ,eAAe;GACrB,IAAI,MAAM,cAAc,MAAM,OAAO;GACrC,IAAI,MAAM,aAAa,OAAO;GAC9B,OAAO,MAAM,QAAQ,UAAU;EACjC,CAAC;EACD,OAAO,eAAe,MAAM,KAAK;EACjC,SAAS,MAAM;CACjB;AACF;;;AC9CA,SAAS,2BAA2B,QAAgD;CAClF,MAAM,YAAY,QAAQ,KAAK;CAC/B,IAAI,CAAC,WAAW,OAAO,KAAA;CAEvB,MAAM,OAAO,UAAU,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAC1D,OAAO,OAAO,IAAI,KAAK,KAAK;AAC9B;;;;;;;AAQA,SAAgB,0BAA0B,eAAuB,KAAa;CAC5E,MAAM,UAAU,2BAA2B;CAC3C,IAAI,CAAC,SAAS,cAAc,OAAO;CAEnC,OAAO,2BAA2B,QAAQ,QAAQ,YAAY,KAAK;AACrE"}
@@ -1,17 +1,17 @@
1
1
  import { a as BaseButton_default, n as BaseModal_default, o as __exportAll } from "./useDropdownState-uFIz6Yv8.js";
2
- import { B as Tooltip_default, I as FormField_default, K as BaseInput_default, L as EmptyState_default, T as FileUploader_default, V as BaseSelect_default, r as Skeleton_default, z as BaseCheckbox_default } from "./records-CWRztE5M.js";
3
- import { H as BaseSlider_default, N as NumberInput_default, P as DatePicker_default, U as BaseRadioGroup_default } from "./useListReorder-QqJc1dpX.js";
4
- import { D as BaseTabs_default, E as BasePill_default, b as ProgressBar_default, t as lab_exports, y as SectionCard_default } from "./lab-CbdDLAVr.js";
5
- import { t as SegmentedControl_default } from "./SegmentedControl-Dz41vAFM.js";
6
- import { r as LoadingSpinner_default, t as AlertBox_default } from "./AlertBox-CIhqsWbN.js";
7
- import { D as DataFrame_default } from "./useRackEditor-BHGM1Ngz.js";
8
- import { d as PluginWorkspaceView_default, h as AppToastContainer_default, t as runtime_exports, u as Avatar_default } from "./runtime-DrL6lKAb.js";
9
- import { n as ActionMenu_default } from "./useRequest-Bfsh7gIm.js";
10
- import { E as getControlDefaults, I as CollapsibleCard_default, L as ThemeToggle_default, N as controlsToFormSchema, n as FormSchemaInternal_default, x as normalizeLabelItemInput, y as PluginIcon_default } from "./AppSidebar-BDrd7Kwn.js";
11
- import { t as ConfirmDialog_default } from "./ConfirmDialog-CjWoxAD1.js";
12
- import { t as SettingsModal_default } from "./SettingsModal-C-MSR-bk.js";
13
- import { t as data_exports } from "./data-LzdkEZJ-.js";
14
- import { t as shell_exports } from "./shell-Ch7cJnjo.js";
2
+ import { B as Tooltip_default, I as FormField_default, K as BaseInput_default, L as EmptyState_default, T as FileUploader_default, V as BaseSelect_default, r as Skeleton_default, z as BaseCheckbox_default } from "./records-BAymyHAn.js";
3
+ import { H as BaseSlider_default, N as NumberInput_default, P as DatePicker_default, U as BaseRadioGroup_default } from "./useListReorder-W1bzK_bo.js";
4
+ import { E as BaseTabs_default, T as BasePill_default, t as lab_exports, y as ProgressBar_default } from "./lab-BcX5JBSY.js";
5
+ import { t as SegmentedControl_default } from "./SegmentedControl-C-sckoJZ.js";
6
+ import { r as LoadingSpinner_default, t as AlertBox_default } from "./AlertBox-CexONPhA.js";
7
+ import { D as SectionCard_default, O as DataFrame_default } from "./useRackEditor-Bmtuo0aj.js";
8
+ import { d as AppContainer_default, f as PluginWorkspaceView_default, g as AppToastContainer_default, t as runtime_exports, u as Avatar_default } from "./runtime-DngeJtdq.js";
9
+ import { n as ActionMenu_default } from "./useRequest-D9-3BS-3.js";
10
+ import { E as getControlDefaults, I as CollapsibleCard_default, L as ThemeToggle_default, N as controlsToFormSchema, n as FormSchemaInternal_default, x as normalizeLabelItemInput, y as PluginIcon_default } from "./AppSidebar-FxlF5_dI.js";
11
+ import { t as ConfirmDialog_default } from "./ConfirmDialog-D9QXFpsy.js";
12
+ import { t as SettingsModal_default } from "./SettingsModal-BIC0dAYc.js";
13
+ import { t as data_exports } from "./data-CfY7o8QC.js";
14
+ import { t as shell_exports } from "./shell-CWZi97nW.js";
15
15
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createTextVNode, defineComponent, guardReactiveProps, normalizeClass, normalizeProps, normalizeStyle, openBlock, ref, renderList, renderSlot, toDisplayString, watch, withCtx } from "vue";
16
16
  //#region src/components/Calendar.vue?vue&type=script&setup=true&lang.ts
17
17
  var _hoisted_1$2 = { class: "mint-calendar" };
@@ -325,30 +325,6 @@ var Calendar_default = /* @__PURE__ */ defineComponent({
325
325
  }
326
326
  });
327
327
  //#endregion
328
- //#region src/components/AppContainer.vue
329
- var AppContainer_default = /* @__PURE__ */ defineComponent({
330
- __name: "AppContainer",
331
- props: {
332
- scrollable: {
333
- type: Boolean,
334
- default: false
335
- },
336
- direction: {},
337
- gap: { default: "1rem" }
338
- },
339
- setup(__props) {
340
- /** Content card with optional scroll lock, or a transparent flex layout shell with configurable direction and gap. */
341
- const props = __props;
342
- const isLayout = computed(() => !!props.direction);
343
- return (_ctx, _cache) => {
344
- return openBlock(), createElementBlock("div", {
345
- class: normalizeClass(["mint-container", isLayout.value ? ["mint-container--layout", __props.direction === "row" ? "mint-container--row" : "mint-container--column"] : ["mint-container--card", __props.scrollable ? "mint-container--scrollable" : ""]]),
346
- style: normalizeStyle(isLayout.value ? { gap: __props.gap } : void 0)
347
- }, [renderSlot(_ctx.$slots, "default")], 6);
348
- };
349
- }
350
- });
351
- //#endregion
352
328
  //#region src/components/Divider.vue?vue&type=script&setup=true&lang.ts
353
329
  var _hoisted_1$1 = {
354
330
  key: 0,
@@ -664,6 +640,6 @@ var MINTSdk = { install(app) {
664
640
  for (const [name, component] of Object.entries(components)) if (component && typeof component === "object" && ("setup" in component || "render" in component || "__name" in component)) app.component(name, component);
665
641
  } };
666
642
  //#endregion
667
- export { AppContainer_default as a, Divider_default as i, FormBuilder_default as n, Calendar_default as o, Breadcrumb_default as r, MINTSdk as t };
643
+ export { Calendar_default as a, Divider_default as i, FormBuilder_default as n, Breadcrumb_default as r, MINTSdk as t };
668
644
 
669
- //# sourceMappingURL=install-UTqrAgHe.js.map
645
+ //# sourceMappingURL=install-QF3Sh82O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-QF3Sh82O.js","names":["$slots"],"sources":["../src/components/Calendar.vue","../src/components/Calendar.vue","../src/components/Divider.vue","../src/components/Divider.vue","../src/components/Breadcrumb.vue","../src/components/Breadcrumb.vue","../src/components/FormBuilder.vue","../src/components/FormBuilder.vue","../src/components/index.ts","../src/install.ts"],"sourcesContent":["<script setup lang=\"ts\">\n/** Month calendar for single date, multi-date, or range selection with markers and navigation. */\nimport { ref, computed, watch } from 'vue'\nimport type { CalendarSelectionMode, CalendarMarker, CalendarDayContext } from '../types'\n\n/**\n * Calendar - Month calendar with date selection, range selection, and custom markers.\n *\n * @example\n * ```vue\n * <!-- Single date selection -->\n * <Calendar v-model=\"selectedDate\" />\n *\n * <!-- Range selection -->\n * <Calendar v-model=\"dateRange\" selection-mode=\"range\" />\n *\n * <!-- With markers -->\n * <Calendar :markers=\"[{ date: '2024-01-15', color: '#ff0000', label: 'Event' }]\" />\n * ```\n */\ninterface Props {\n /** Selected date(s) - type depends on selectionMode */\n modelValue?: Date | Date[] | { start: Date; end: Date } | null\n /** Selection behavior mode */\n selectionMode?: CalendarSelectionMode\n /** Display month (0-11) */\n month?: number\n /** Display year */\n year?: number\n /** Always show 6 weeks (42 days) */\n fixedWeeks?: boolean\n /** First day of week (0=Sunday, 1=Monday, etc.) */\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6\n /** Show days from adjacent months */\n showOutsideDays?: boolean\n /** Show month navigation buttons */\n showNavigation?: boolean\n /** Visual markers on specific dates */\n markers?: CalendarMarker[]\n /** Earliest selectable date */\n minDate?: Date | string\n /** Latest selectable date */\n maxDate?: Date | string\n /** Explicitly disabled dates */\n disabledDates?: Array<Date | string>\n /** Custom disabled date logic */\n isDateDisabled?: (date: Date) => boolean\n /** Locale for date formatting */\n locale?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n selectionMode: 'single',\n fixedWeeks: true,\n weekStartsOn: 1,\n showOutsideDays: true,\n showNavigation: true,\n markers: () => [],\n disabledDates: () => [],\n locale: 'en-US',\n})\n\n/**\n * @event update:modelValue - Emitted when date selection changes (v-model support)\n * @event update:month - Emitted when displayed month changes\n * @event update:year - Emitted when displayed year changes\n * @event day-click - Emitted when a day is clicked, includes day context\n * @event navigate - Emitted when month navigation occurs\n */\nconst emit = defineEmits<{\n 'update:modelValue': [value: Date | Date[] | { start: Date; end: Date } | null]\n 'update:month': [month: number]\n 'update:year': [year: number]\n 'day-click': [context: CalendarDayContext]\n navigate: [direction: 'prev' | 'next', month: number, year: number]\n}>()\n\nconst today = new Date()\ntoday.setHours(0, 0, 0, 0)\n\nconst currentMonth = ref(props.month ?? today.getMonth())\nconst currentYear = ref(props.year ?? today.getFullYear())\n\n// Range hover tracking\nconst hoveredDate = ref<Date | null>(null)\n\nwatch(() => props.month, (val) => { if (val !== undefined) currentMonth.value = val })\nwatch(() => props.year, (val) => { if (val !== undefined) currentYear.value = val })\n\nconst monthLabel = computed(() => {\n const date = new Date(currentYear.value, currentMonth.value, 1)\n return date.toLocaleDateString(props.locale, { month: 'long', year: 'numeric' })\n})\n\nconst weekDayLabels = computed(() => {\n const labels: string[] = []\n // Use Jan 7, 2024 (Sunday) as reference, then offset by weekStartsOn\n const base = new Date(2024, 0, 7 + props.weekStartsOn)\n for (let i = 0; i < 7; i++) {\n const d = new Date(base)\n d.setDate(d.getDate() + i)\n labels.push(d.toLocaleDateString(props.locale, { weekday: 'short' }))\n }\n return labels\n})\n\nfunction toDateKey(d: Date): string {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`\n}\n\nfunction parseDate(val: Date | string): Date {\n if (val instanceof Date) return val\n const d = new Date(val + 'T00:00:00')\n return d\n}\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n}\n\nconst disabledDateSet = computed(() => {\n const set = new Set<string>()\n for (const d of props.disabledDates) {\n const parsed = parseDate(d)\n set.add(toDateKey(parsed))\n }\n return set\n})\n\nconst markerMap = computed(() => {\n const map = new Map<string, CalendarMarker[]>()\n for (const marker of props.markers) {\n const date = parseDate(marker.date)\n const key = toDateKey(date)\n const markers = map.get(key)\n if (markers) {\n markers.push(marker)\n } else {\n map.set(key, [marker])\n }\n }\n return map\n})\n\nfunction isDateSelected(date: Date): boolean {\n const val = props.modelValue\n if (!val) return false\n if (val instanceof Date) return isSameDay(date, val)\n if (Array.isArray(val)) return val.some(d => isSameDay(date, d))\n if ('start' in val && 'end' in val) {\n return isSameDay(date, val.start) || isSameDay(date, val.end)\n }\n return false\n}\n\nfunction isInRange(date: Date): boolean {\n if (props.selectionMode !== 'range') return false\n const val = props.modelValue\n if (!val || !('start' in (val as object))) return false\n const range = val as { start: Date; end: Date }\n\n const t = date.getTime()\n const start = range.start?.getTime()\n if (!start) return false\n\n // If hovering during selection (before end is set)\n if (!range.end && hoveredDate.value) {\n const hov = hoveredDate.value.getTime()\n const [lo, hi] = start <= hov ? [start, hov] : [hov, start]\n return t > lo && t < hi\n }\n\n // Complete range\n if (range.end) {\n const end = range.end.getTime()\n return t > start && t < end\n }\n\n return false\n}\n\nfunction isDisabled(date: Date): boolean {\n if (disabledDateSet.value.has(toDateKey(date))) return true\n if (props.isDateDisabled?.(date)) return true\n if (props.minDate) {\n const min = parseDate(props.minDate)\n if (date < min) return true\n }\n if (props.maxDate) {\n const max = parseDate(props.maxDate)\n if (date > max) return true\n }\n return false\n}\n\nconst calendarDays = computed<CalendarDayContext[]>(() => {\n const first = new Date(currentYear.value, currentMonth.value, 1)\n const startDow = first.getDay()\n const offset = (startDow - props.weekStartsOn + 7) % 7\n\n const totalCells = props.fixedWeeks ? 42 : (() => {\n const daysInMonth = new Date(currentYear.value, currentMonth.value + 1, 0).getDate()\n const needed = offset + daysInMonth\n return Math.ceil(needed / 7) * 7\n })()\n\n const days: CalendarDayContext[] = []\n for (let i = 0; i < totalCells; i++) {\n const date = new Date(currentYear.value, currentMonth.value, 1 - offset + i)\n date.setHours(0, 0, 0, 0)\n const key = toDateKey(date)\n days.push({\n date,\n dayOfMonth: date.getDate(),\n isToday: isSameDay(date, today),\n isSelected: isDateSelected(date),\n isInRange: isInRange(date),\n isDisabled: isDisabled(date),\n isOutsideMonth: date.getMonth() !== currentMonth.value,\n markers: markerMap.value.get(key) ?? [],\n })\n }\n return days\n})\n\n// Range selection state\nconst rangeStart = ref<Date | null>(null)\n\nfunction handleDayClick(day: CalendarDayContext) {\n if (day.isDisabled) return\n if (!props.showOutsideDays && day.isOutsideMonth) return\n\n emit('day-click', day)\n\n if (props.selectionMode === 'none') return\n\n if (props.selectionMode === 'single') {\n emit('update:modelValue', day.date)\n } else if (props.selectionMode === 'multiple') {\n const current = (props.modelValue as Date[] | undefined) ?? []\n const idx = current.findIndex(d => isSameDay(d, day.date))\n if (idx >= 0) {\n const next = [...current]\n next.splice(idx, 1)\n emit('update:modelValue', next)\n } else {\n emit('update:modelValue', [...current, day.date])\n }\n } else if (props.selectionMode === 'range') {\n if (!rangeStart.value) {\n rangeStart.value = day.date\n } else {\n const start = rangeStart.value\n const end = day.date\n rangeStart.value = null\n const ordered = start.getTime() <= end.getTime()\n ? { start, end }\n : { start: end, end: start }\n emit('update:modelValue', ordered)\n }\n }\n}\n\nfunction handleDayHover(day: CalendarDayContext) {\n if (props.selectionMode === 'range' && rangeStart.value) {\n hoveredDate.value = day.date\n }\n}\n\nfunction prevMonth() {\n if (currentMonth.value === 0) {\n currentMonth.value = 11\n currentYear.value--\n emit('update:year', currentYear.value)\n } else {\n currentMonth.value--\n }\n emit('update:month', currentMonth.value)\n emit('navigate', 'prev', currentMonth.value, currentYear.value)\n}\n\nfunction nextMonth() {\n if (currentMonth.value === 11) {\n currentMonth.value = 0\n currentYear.value++\n emit('update:year', currentYear.value)\n } else {\n currentMonth.value++\n }\n emit('update:month', currentMonth.value)\n emit('navigate', 'next', currentMonth.value, currentYear.value)\n}\n</script>\n\n<template>\n <div class=\"mint-calendar\">\n <div v-if=\"showNavigation\" class=\"mint-calendar__header\">\n <button type=\"button\" class=\"mint-calendar__nav-btn\" aria-label=\"Previous month\" @click=\"prevMonth\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n </button>\n <slot name=\"header\" :month=\"currentMonth\" :year=\"currentYear\" :prev-month=\"prevMonth\" :next-month=\"nextMonth\">\n <span class=\"mint-calendar__title\">{{ monthLabel }}</span>\n </slot>\n <button type=\"button\" class=\"mint-calendar__nav-btn\" aria-label=\"Next month\" @click=\"nextMonth\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n </button>\n </div>\n\n <div class=\"mint-calendar__weekdays\">\n <span\n v-for=\"(label, i) in weekDayLabels\"\n :key=\"i\"\n class=\"mint-calendar__weekday\"\n >\n <slot name=\"week-day\" :day-name=\"label\" :index=\"i\">{{ label }}</slot>\n </span>\n </div>\n\n <div class=\"mint-calendar__grid\">\n <button\n v-for=\"(day, i) in calendarDays\"\n :key=\"i\"\n type=\"button\"\n :disabled=\"day.isDisabled\"\n :class=\"[\n 'mint-calendar__day',\n {\n 'mint-calendar__day--today': day.isToday,\n 'mint-calendar__day--selected': day.isSelected,\n 'mint-calendar__day--in-range': day.isInRange,\n 'mint-calendar__day--disabled': day.isDisabled,\n 'mint-calendar__day--outside': day.isOutsideMonth,\n 'mint-calendar__day--interactive': selectionMode !== 'none' && !day.isDisabled,\n },\n ]\"\n @click=\"handleDayClick(day)\"\n @mouseenter=\"handleDayHover(day)\"\n >\n <slot name=\"day-content\" :day=\"day\">\n <span class=\"mint-calendar__day-number\">{{ day.dayOfMonth }}</span>\n <div v-if=\"day.markers.length > 0\" class=\"mint-calendar__markers\">\n <span\n v-for=\"(marker, mi) in day.markers.slice(0, 3)\"\n :key=\"mi\"\n :class=\"[\n 'mint-calendar__marker',\n `mint-calendar__marker--${marker.type ?? 'dot'}`,\n ]\"\n :style=\"marker.color ? { '--marker-color': marker.color } : {}\"\n :title=\"marker.label\"\n />\n </div>\n </slot>\n </button>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Month calendar for single date, multi-date, or range selection with markers and navigation. */\nimport { ref, computed, watch } from 'vue'\nimport type { CalendarSelectionMode, CalendarMarker, CalendarDayContext } from '../types'\n\n/**\n * Calendar - Month calendar with date selection, range selection, and custom markers.\n *\n * @example\n * ```vue\n * <!-- Single date selection -->\n * <Calendar v-model=\"selectedDate\" />\n *\n * <!-- Range selection -->\n * <Calendar v-model=\"dateRange\" selection-mode=\"range\" />\n *\n * <!-- With markers -->\n * <Calendar :markers=\"[{ date: '2024-01-15', color: '#ff0000', label: 'Event' }]\" />\n * ```\n */\ninterface Props {\n /** Selected date(s) - type depends on selectionMode */\n modelValue?: Date | Date[] | { start: Date; end: Date } | null\n /** Selection behavior mode */\n selectionMode?: CalendarSelectionMode\n /** Display month (0-11) */\n month?: number\n /** Display year */\n year?: number\n /** Always show 6 weeks (42 days) */\n fixedWeeks?: boolean\n /** First day of week (0=Sunday, 1=Monday, etc.) */\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6\n /** Show days from adjacent months */\n showOutsideDays?: boolean\n /** Show month navigation buttons */\n showNavigation?: boolean\n /** Visual markers on specific dates */\n markers?: CalendarMarker[]\n /** Earliest selectable date */\n minDate?: Date | string\n /** Latest selectable date */\n maxDate?: Date | string\n /** Explicitly disabled dates */\n disabledDates?: Array<Date | string>\n /** Custom disabled date logic */\n isDateDisabled?: (date: Date) => boolean\n /** Locale for date formatting */\n locale?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n selectionMode: 'single',\n fixedWeeks: true,\n weekStartsOn: 1,\n showOutsideDays: true,\n showNavigation: true,\n markers: () => [],\n disabledDates: () => [],\n locale: 'en-US',\n})\n\n/**\n * @event update:modelValue - Emitted when date selection changes (v-model support)\n * @event update:month - Emitted when displayed month changes\n * @event update:year - Emitted when displayed year changes\n * @event day-click - Emitted when a day is clicked, includes day context\n * @event navigate - Emitted when month navigation occurs\n */\nconst emit = defineEmits<{\n 'update:modelValue': [value: Date | Date[] | { start: Date; end: Date } | null]\n 'update:month': [month: number]\n 'update:year': [year: number]\n 'day-click': [context: CalendarDayContext]\n navigate: [direction: 'prev' | 'next', month: number, year: number]\n}>()\n\nconst today = new Date()\ntoday.setHours(0, 0, 0, 0)\n\nconst currentMonth = ref(props.month ?? today.getMonth())\nconst currentYear = ref(props.year ?? today.getFullYear())\n\n// Range hover tracking\nconst hoveredDate = ref<Date | null>(null)\n\nwatch(() => props.month, (val) => { if (val !== undefined) currentMonth.value = val })\nwatch(() => props.year, (val) => { if (val !== undefined) currentYear.value = val })\n\nconst monthLabel = computed(() => {\n const date = new Date(currentYear.value, currentMonth.value, 1)\n return date.toLocaleDateString(props.locale, { month: 'long', year: 'numeric' })\n})\n\nconst weekDayLabels = computed(() => {\n const labels: string[] = []\n // Use Jan 7, 2024 (Sunday) as reference, then offset by weekStartsOn\n const base = new Date(2024, 0, 7 + props.weekStartsOn)\n for (let i = 0; i < 7; i++) {\n const d = new Date(base)\n d.setDate(d.getDate() + i)\n labels.push(d.toLocaleDateString(props.locale, { weekday: 'short' }))\n }\n return labels\n})\n\nfunction toDateKey(d: Date): string {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`\n}\n\nfunction parseDate(val: Date | string): Date {\n if (val instanceof Date) return val\n const d = new Date(val + 'T00:00:00')\n return d\n}\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n}\n\nconst disabledDateSet = computed(() => {\n const set = new Set<string>()\n for (const d of props.disabledDates) {\n const parsed = parseDate(d)\n set.add(toDateKey(parsed))\n }\n return set\n})\n\nconst markerMap = computed(() => {\n const map = new Map<string, CalendarMarker[]>()\n for (const marker of props.markers) {\n const date = parseDate(marker.date)\n const key = toDateKey(date)\n const markers = map.get(key)\n if (markers) {\n markers.push(marker)\n } else {\n map.set(key, [marker])\n }\n }\n return map\n})\n\nfunction isDateSelected(date: Date): boolean {\n const val = props.modelValue\n if (!val) return false\n if (val instanceof Date) return isSameDay(date, val)\n if (Array.isArray(val)) return val.some(d => isSameDay(date, d))\n if ('start' in val && 'end' in val) {\n return isSameDay(date, val.start) || isSameDay(date, val.end)\n }\n return false\n}\n\nfunction isInRange(date: Date): boolean {\n if (props.selectionMode !== 'range') return false\n const val = props.modelValue\n if (!val || !('start' in (val as object))) return false\n const range = val as { start: Date; end: Date }\n\n const t = date.getTime()\n const start = range.start?.getTime()\n if (!start) return false\n\n // If hovering during selection (before end is set)\n if (!range.end && hoveredDate.value) {\n const hov = hoveredDate.value.getTime()\n const [lo, hi] = start <= hov ? [start, hov] : [hov, start]\n return t > lo && t < hi\n }\n\n // Complete range\n if (range.end) {\n const end = range.end.getTime()\n return t > start && t < end\n }\n\n return false\n}\n\nfunction isDisabled(date: Date): boolean {\n if (disabledDateSet.value.has(toDateKey(date))) return true\n if (props.isDateDisabled?.(date)) return true\n if (props.minDate) {\n const min = parseDate(props.minDate)\n if (date < min) return true\n }\n if (props.maxDate) {\n const max = parseDate(props.maxDate)\n if (date > max) return true\n }\n return false\n}\n\nconst calendarDays = computed<CalendarDayContext[]>(() => {\n const first = new Date(currentYear.value, currentMonth.value, 1)\n const startDow = first.getDay()\n const offset = (startDow - props.weekStartsOn + 7) % 7\n\n const totalCells = props.fixedWeeks ? 42 : (() => {\n const daysInMonth = new Date(currentYear.value, currentMonth.value + 1, 0).getDate()\n const needed = offset + daysInMonth\n return Math.ceil(needed / 7) * 7\n })()\n\n const days: CalendarDayContext[] = []\n for (let i = 0; i < totalCells; i++) {\n const date = new Date(currentYear.value, currentMonth.value, 1 - offset + i)\n date.setHours(0, 0, 0, 0)\n const key = toDateKey(date)\n days.push({\n date,\n dayOfMonth: date.getDate(),\n isToday: isSameDay(date, today),\n isSelected: isDateSelected(date),\n isInRange: isInRange(date),\n isDisabled: isDisabled(date),\n isOutsideMonth: date.getMonth() !== currentMonth.value,\n markers: markerMap.value.get(key) ?? [],\n })\n }\n return days\n})\n\n// Range selection state\nconst rangeStart = ref<Date | null>(null)\n\nfunction handleDayClick(day: CalendarDayContext) {\n if (day.isDisabled) return\n if (!props.showOutsideDays && day.isOutsideMonth) return\n\n emit('day-click', day)\n\n if (props.selectionMode === 'none') return\n\n if (props.selectionMode === 'single') {\n emit('update:modelValue', day.date)\n } else if (props.selectionMode === 'multiple') {\n const current = (props.modelValue as Date[] | undefined) ?? []\n const idx = current.findIndex(d => isSameDay(d, day.date))\n if (idx >= 0) {\n const next = [...current]\n next.splice(idx, 1)\n emit('update:modelValue', next)\n } else {\n emit('update:modelValue', [...current, day.date])\n }\n } else if (props.selectionMode === 'range') {\n if (!rangeStart.value) {\n rangeStart.value = day.date\n } else {\n const start = rangeStart.value\n const end = day.date\n rangeStart.value = null\n const ordered = start.getTime() <= end.getTime()\n ? { start, end }\n : { start: end, end: start }\n emit('update:modelValue', ordered)\n }\n }\n}\n\nfunction handleDayHover(day: CalendarDayContext) {\n if (props.selectionMode === 'range' && rangeStart.value) {\n hoveredDate.value = day.date\n }\n}\n\nfunction prevMonth() {\n if (currentMonth.value === 0) {\n currentMonth.value = 11\n currentYear.value--\n emit('update:year', currentYear.value)\n } else {\n currentMonth.value--\n }\n emit('update:month', currentMonth.value)\n emit('navigate', 'prev', currentMonth.value, currentYear.value)\n}\n\nfunction nextMonth() {\n if (currentMonth.value === 11) {\n currentMonth.value = 0\n currentYear.value++\n emit('update:year', currentYear.value)\n } else {\n currentMonth.value++\n }\n emit('update:month', currentMonth.value)\n emit('navigate', 'next', currentMonth.value, currentYear.value)\n}\n</script>\n\n<template>\n <div class=\"mint-calendar\">\n <div v-if=\"showNavigation\" class=\"mint-calendar__header\">\n <button type=\"button\" class=\"mint-calendar__nav-btn\" aria-label=\"Previous month\" @click=\"prevMonth\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n </button>\n <slot name=\"header\" :month=\"currentMonth\" :year=\"currentYear\" :prev-month=\"prevMonth\" :next-month=\"nextMonth\">\n <span class=\"mint-calendar__title\">{{ monthLabel }}</span>\n </slot>\n <button type=\"button\" class=\"mint-calendar__nav-btn\" aria-label=\"Next month\" @click=\"nextMonth\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n </button>\n </div>\n\n <div class=\"mint-calendar__weekdays\">\n <span\n v-for=\"(label, i) in weekDayLabels\"\n :key=\"i\"\n class=\"mint-calendar__weekday\"\n >\n <slot name=\"week-day\" :day-name=\"label\" :index=\"i\">{{ label }}</slot>\n </span>\n </div>\n\n <div class=\"mint-calendar__grid\">\n <button\n v-for=\"(day, i) in calendarDays\"\n :key=\"i\"\n type=\"button\"\n :disabled=\"day.isDisabled\"\n :class=\"[\n 'mint-calendar__day',\n {\n 'mint-calendar__day--today': day.isToday,\n 'mint-calendar__day--selected': day.isSelected,\n 'mint-calendar__day--in-range': day.isInRange,\n 'mint-calendar__day--disabled': day.isDisabled,\n 'mint-calendar__day--outside': day.isOutsideMonth,\n 'mint-calendar__day--interactive': selectionMode !== 'none' && !day.isDisabled,\n },\n ]\"\n @click=\"handleDayClick(day)\"\n @mouseenter=\"handleDayHover(day)\"\n >\n <slot name=\"day-content\" :day=\"day\">\n <span class=\"mint-calendar__day-number\">{{ day.dayOfMonth }}</span>\n <div v-if=\"day.markers.length > 0\" class=\"mint-calendar__markers\">\n <span\n v-for=\"(marker, mi) in day.markers.slice(0, 3)\"\n :key=\"mi\"\n :class=\"[\n 'mint-calendar__marker',\n `mint-calendar__marker--${marker.type ?? 'dot'}`,\n ]\"\n :style=\"marker.color ? { '--marker-color': marker.color } : {}\"\n :title=\"marker.label\"\n />\n </div>\n </slot>\n </button>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Horizontal or vertical rule with optional inline text label at center or left. */\ninterface Props {\n vertical?: boolean\n label?: string\n align?: 'center' | 'left'\n spacing?: 'sm' | 'md' | 'lg'\n}\n\nwithDefaults(defineProps<Props>(), {\n vertical: false,\n label: undefined,\n align: 'center',\n spacing: 'md',\n})\n</script>\n\n<template>\n <div\n v-if=\"vertical\"\n :class=\"[\n 'mint-divider',\n 'mint-divider--vertical',\n `mint-divider--${spacing}`,\n ]\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n />\n <div\n v-else\n :class=\"[\n 'mint-divider',\n `mint-divider--${spacing}`,\n label ? `mint-divider--labeled mint-divider--${align}` : '',\n ]\"\n role=\"separator\"\n aria-orientation=\"horizontal\"\n >\n <template v-if=\"label\">\n <span v-if=\"align === 'center'\" class=\"mint-divider__line\" />\n <span class=\"mint-divider__label\">{{ label }}</span>\n <span class=\"mint-divider__line\" />\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Horizontal or vertical rule with optional inline text label at center or left. */\ninterface Props {\n vertical?: boolean\n label?: string\n align?: 'center' | 'left'\n spacing?: 'sm' | 'md' | 'lg'\n}\n\nwithDefaults(defineProps<Props>(), {\n vertical: false,\n label: undefined,\n align: 'center',\n spacing: 'md',\n})\n</script>\n\n<template>\n <div\n v-if=\"vertical\"\n :class=\"[\n 'mint-divider',\n 'mint-divider--vertical',\n `mint-divider--${spacing}`,\n ]\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n />\n <div\n v-else\n :class=\"[\n 'mint-divider',\n `mint-divider--${spacing}`,\n label ? `mint-divider--labeled mint-divider--${align}` : '',\n ]\"\n role=\"separator\"\n aria-orientation=\"horizontal\"\n >\n <template v-if=\"label\">\n <span v-if=\"align === 'center'\" class=\"mint-divider__line\" />\n <span class=\"mint-divider__label\">{{ label }}</span>\n <span class=\"mint-divider__line\" />\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Renders a breadcrumb trail where ancestors are links or emit-based buttons and the last item is the current page. */\nimport { computed, ref, watch } from 'vue'\nimport type { BreadcrumbItem, BreadcrumbItemInput } from '../types'\nimport { normalizeLabelItemInput } from '../utils/items'\n\ninterface Props {\n items: BreadcrumbItemInput[]\n separator?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n separator: '/',\n})\n\nconst emit = defineEmits<{\n navigate: [item: BreadcrumbItem]\n}>()\n\nconst normalizedItems = computed<BreadcrumbItem[]>(() =>\n props.items.map(normalizeLabelItemInput)\n)\n\n/** Trails longer than this collapse their middle into \"…\" (4e). */\nconst MAX_VISIBLE = 4\n\nconst expanded = ref(false)\n\n// A new trail (navigation) starts collapsed again; keyed on labels so a parent\n// re-render with an equal inline array does not collapse it.\nwatch(() => normalizedItems.value.map(item => item.label).join('\\u0000'), () => {\n expanded.value = false\n})\n\n/** Visible segments with their index in the full trail; `null` marks the collapsed \"…\". */\nconst segments = computed<({ item: BreadcrumbItem; index: number } | null)[]>(() => {\n const all = normalizedItems.value.map((item, index) => ({ item, index }))\n if (expanded.value || all.length <= MAX_VISIBLE) return all\n return [all[0], null, ...all.slice(-2)]\n})\n\nconst hiddenCount = computed(() => normalizedItems.value.length - 3)\n\n/** ID-like segments (EXP-042) render mono. */\nfunction isIdLabel(label: string): boolean {\n return /^[A-Z]+-\\d+$/.test(label)\n}\n\nfunction handleClick(item: BreadcrumbItem) {\n if (!item.href) {\n emit('navigate', item)\n }\n}\n</script>\n\n<template>\n <nav class=\"mint-breadcrumb\" aria-label=\"Breadcrumb\">\n <ol class=\"mint-breadcrumb__list\">\n <li\n v-for=\"(segment, position) in segments\"\n :key=\"segment ? segment.index : 'ellipsis'\"\n class=\"mint-breadcrumb__item\"\n >\n <button\n v-if=\"!segment\"\n type=\"button\"\n class=\"mint-breadcrumb__link mint-breadcrumb__ellipsis\"\n :aria-label=\"`Show ${hiddenCount} hidden levels`\"\n :aria-expanded=\"false\"\n @click=\"expanded = true\"\n >\n …\n </button>\n <slot v-else name=\"item\" :item=\"segment.item\" :index=\"segment.index\" :is-last=\"segment.index === normalizedItems.length - 1\">\n <a\n v-if=\"segment.item.href && segment.index !== normalizedItems.length - 1\"\n :href=\"segment.item.href\"\n :class=\"['mint-breadcrumb__link', { 'mint-breadcrumb__segment--id': isIdLabel(segment.item.label) }]\"\n >\n {{ segment.item.label }}\n </a>\n <button\n v-else-if=\"segment.index !== normalizedItems.length - 1\"\n :class=\"['mint-breadcrumb__link', { 'mint-breadcrumb__segment--id': isIdLabel(segment.item.label) }]\"\n @click=\"handleClick(segment.item)\"\n >\n {{ segment.item.label }}\n </button>\n <span\n v-else\n :class=\"['mint-breadcrumb__current', { 'mint-breadcrumb__segment--id': isIdLabel(segment.item.label) }]\"\n aria-current=\"page\"\n >\n {{ segment.item.label }}\n </span>\n </slot>\n <span\n v-if=\"position !== segments.length - 1\"\n class=\"mint-breadcrumb__separator\"\n aria-hidden=\"true\"\n >\n <slot name=\"separator\">\n <svg v-if=\"separator === '/'\" class=\"mint-breadcrumb__chevron\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n <template v-else>{{ separator }}</template>\n </slot>\n </span>\n </li>\n </ol>\n </nav>\n</template>\n","<script setup lang=\"ts\">\n/** Renders a breadcrumb trail where ancestors are links or emit-based buttons and the last item is the current page. */\nimport { computed, ref, watch } from 'vue'\nimport type { BreadcrumbItem, BreadcrumbItemInput } from '../types'\nimport { normalizeLabelItemInput } from '../utils/items'\n\ninterface Props {\n items: BreadcrumbItemInput[]\n separator?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n separator: '/',\n})\n\nconst emit = defineEmits<{\n navigate: [item: BreadcrumbItem]\n}>()\n\nconst normalizedItems = computed<BreadcrumbItem[]>(() =>\n props.items.map(normalizeLabelItemInput)\n)\n\n/** Trails longer than this collapse their middle into \"…\" (4e). */\nconst MAX_VISIBLE = 4\n\nconst expanded = ref(false)\n\n// A new trail (navigation) starts collapsed again; keyed on labels so a parent\n// re-render with an equal inline array does not collapse it.\nwatch(() => normalizedItems.value.map(item => item.label).join('\\u0000'), () => {\n expanded.value = false\n})\n\n/** Visible segments with their index in the full trail; `null` marks the collapsed \"…\". */\nconst segments = computed<({ item: BreadcrumbItem; index: number } | null)[]>(() => {\n const all = normalizedItems.value.map((item, index) => ({ item, index }))\n if (expanded.value || all.length <= MAX_VISIBLE) return all\n return [all[0], null, ...all.slice(-2)]\n})\n\nconst hiddenCount = computed(() => normalizedItems.value.length - 3)\n\n/** ID-like segments (EXP-042) render mono. */\nfunction isIdLabel(label: string): boolean {\n return /^[A-Z]+-\\d+$/.test(label)\n}\n\nfunction handleClick(item: BreadcrumbItem) {\n if (!item.href) {\n emit('navigate', item)\n }\n}\n</script>\n\n<template>\n <nav class=\"mint-breadcrumb\" aria-label=\"Breadcrumb\">\n <ol class=\"mint-breadcrumb__list\">\n <li\n v-for=\"(segment, position) in segments\"\n :key=\"segment ? segment.index : 'ellipsis'\"\n class=\"mint-breadcrumb__item\"\n >\n <button\n v-if=\"!segment\"\n type=\"button\"\n class=\"mint-breadcrumb__link mint-breadcrumb__ellipsis\"\n :aria-label=\"`Show ${hiddenCount} hidden levels`\"\n :aria-expanded=\"false\"\n @click=\"expanded = true\"\n >\n …\n </button>\n <slot v-else name=\"item\" :item=\"segment.item\" :index=\"segment.index\" :is-last=\"segment.index === normalizedItems.length - 1\">\n <a\n v-if=\"segment.item.href && segment.index !== normalizedItems.length - 1\"\n :href=\"segment.item.href\"\n :class=\"['mint-breadcrumb__link', { 'mint-breadcrumb__segment--id': isIdLabel(segment.item.label) }]\"\n >\n {{ segment.item.label }}\n </a>\n <button\n v-else-if=\"segment.index !== normalizedItems.length - 1\"\n :class=\"['mint-breadcrumb__link', { 'mint-breadcrumb__segment--id': isIdLabel(segment.item.label) }]\"\n @click=\"handleClick(segment.item)\"\n >\n {{ segment.item.label }}\n </button>\n <span\n v-else\n :class=\"['mint-breadcrumb__current', { 'mint-breadcrumb__segment--id': isIdLabel(segment.item.label) }]\"\n aria-current=\"page\"\n >\n {{ segment.item.label }}\n </span>\n </slot>\n <span\n v-if=\"position !== segments.length - 1\"\n class=\"mint-breadcrumb__separator\"\n aria-hidden=\"true\"\n >\n <slot name=\"separator\">\n <svg v-if=\"separator === '/'\" class=\"mint-breadcrumb__chevron\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n <template v-else>{{ separator }}</template>\n </slot>\n </span>\n </li>\n </ol>\n </nav>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Generated form for a control model built with `defineControlModel()`.\n *\n * The control model holds the controls, sections, columns, the submit / cancel\n * bar (`actions`) and `enhancements` (dynamic options, validators, a submit\n * handler and field callbacks). Bind the values with `v-model`; the `submit`\n * event carries only the values of the visible fields.\n *\n * Exposes `form`, `validate`, `reset`, `updateSchema`, `goNext`, `goBack`,\n * `goToStep`, and `builder` for imperative control via template refs.\n *\n * Slots:\n * - `field:<name>` — override a single field's input component\n * - `section:<id>` — replace an entire section body\n * - `section:<id>:after` — inject content after a section\n * - `actions` — replace the default action bar when the model sets `actions`\n *\n * @example Recommended\n * ```vue\n * <FormBuilder v-model=\"values\" :spec=\"formModel\" />\n * ```\n */\nimport { computed, ref } from 'vue'\nimport type { FormSchema } from '../types/form-builder'\nimport {\n controlsToFormSchema,\n getControlDefaults,\n type ControlModelBinding,\n} from '../composables/useControlSchema'\nimport FormSchemaInternal from './internal/FormSchemaInternal.vue'\n\ninterface Props {\n /** Control model built with defineControlModel(). Optional: without it the form is empty. */\n spec?: ControlModelBinding\n modelValue?: Record<string, unknown>\n loading?: boolean\n disabled?: boolean\n size?: 'sm' | 'md' | 'lg'\n readonly?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n spec: undefined,\n modelValue: undefined,\n loading: false,\n disabled: false,\n size: undefined,\n readonly: false,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [data: Record<string, unknown>]\n submit: [data: Record<string, unknown>]\n cancel: []\n}>()\n\nconst schema = computed<FormSchema>(() =>\n props.spec ? controlsToFormSchema(props.spec.controls, props.spec.controlOptions) : { sections: [] },\n)\n\nconst defaults = computed<Record<string, unknown>>(() => ({\n ...(props.spec ? getControlDefaults(props.spec.controls) : {}),\n ...(props.spec?.controlOptions.initialValues ?? {}),\n}))\n\nconst inner = ref<InstanceType<typeof FormSchemaInternal> | null>(null)\n\ndefineExpose({\n get form() { return inner.value?.form },\n get builder() { return inner.value?.builder },\n validate: () => inner.value?.validate(),\n reset: (...args: Parameters<InstanceType<typeof FormSchemaInternal>['reset']>) => inner.value?.reset(...args),\n updateSchema: (...args: Parameters<InstanceType<typeof FormSchemaInternal>['updateSchema']>) => inner.value?.updateSchema(...args),\n goNext: () => inner.value?.goNext(),\n goBack: () => inner.value?.goBack(),\n goToStep: (step: number) => inner.value?.goToStep(step),\n})\n</script>\n\n<template>\n <FormSchemaInternal\n ref=\"inner\"\n :schema=\"schema\"\n :defaults=\"defaults\"\n :model-value=\"modelValue\"\n :enhancements=\"spec?.controlOptions.enhancements\"\n :loading=\"loading\"\n :disabled=\"disabled\"\n :size=\"size\"\n :readonly=\"readonly\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n @submit=\"emit('submit', $event)\"\n @cancel=\"emit('cancel')\"\n >\n <template v-for=\"(_, name) in $slots\" #[name]=\"slotProps\">\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\n </template>\n </FormSchemaInternal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Generated form for a control model built with `defineControlModel()`.\n *\n * The control model holds the controls, sections, columns, the submit / cancel\n * bar (`actions`) and `enhancements` (dynamic options, validators, a submit\n * handler and field callbacks). Bind the values with `v-model`; the `submit`\n * event carries only the values of the visible fields.\n *\n * Exposes `form`, `validate`, `reset`, `updateSchema`, `goNext`, `goBack`,\n * `goToStep`, and `builder` for imperative control via template refs.\n *\n * Slots:\n * - `field:<name>` — override a single field's input component\n * - `section:<id>` — replace an entire section body\n * - `section:<id>:after` — inject content after a section\n * - `actions` — replace the default action bar when the model sets `actions`\n *\n * @example Recommended\n * ```vue\n * <FormBuilder v-model=\"values\" :spec=\"formModel\" />\n * ```\n */\nimport { computed, ref } from 'vue'\nimport type { FormSchema } from '../types/form-builder'\nimport {\n controlsToFormSchema,\n getControlDefaults,\n type ControlModelBinding,\n} from '../composables/useControlSchema'\nimport FormSchemaInternal from './internal/FormSchemaInternal.vue'\n\ninterface Props {\n /** Control model built with defineControlModel(). Optional: without it the form is empty. */\n spec?: ControlModelBinding\n modelValue?: Record<string, unknown>\n loading?: boolean\n disabled?: boolean\n size?: 'sm' | 'md' | 'lg'\n readonly?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n spec: undefined,\n modelValue: undefined,\n loading: false,\n disabled: false,\n size: undefined,\n readonly: false,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [data: Record<string, unknown>]\n submit: [data: Record<string, unknown>]\n cancel: []\n}>()\n\nconst schema = computed<FormSchema>(() =>\n props.spec ? controlsToFormSchema(props.spec.controls, props.spec.controlOptions) : { sections: [] },\n)\n\nconst defaults = computed<Record<string, unknown>>(() => ({\n ...(props.spec ? getControlDefaults(props.spec.controls) : {}),\n ...(props.spec?.controlOptions.initialValues ?? {}),\n}))\n\nconst inner = ref<InstanceType<typeof FormSchemaInternal> | null>(null)\n\ndefineExpose({\n get form() { return inner.value?.form },\n get builder() { return inner.value?.builder },\n validate: () => inner.value?.validate(),\n reset: (...args: Parameters<InstanceType<typeof FormSchemaInternal>['reset']>) => inner.value?.reset(...args),\n updateSchema: (...args: Parameters<InstanceType<typeof FormSchemaInternal>['updateSchema']>) => inner.value?.updateSchema(...args),\n goNext: () => inner.value?.goNext(),\n goBack: () => inner.value?.goBack(),\n goToStep: (step: number) => inner.value?.goToStep(step),\n})\n</script>\n\n<template>\n <FormSchemaInternal\n ref=\"inner\"\n :schema=\"schema\"\n :defaults=\"defaults\"\n :model-value=\"modelValue\"\n :enhancements=\"spec?.controlOptions.enhancements\"\n :loading=\"loading\"\n :disabled=\"disabled\"\n :size=\"size\"\n :readonly=\"readonly\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n @submit=\"emit('submit', $event)\"\n @cancel=\"emit('cancel')\"\n >\n <template v-for=\"(_, name) in $slots\" #[name]=\"slotProps\">\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\n </template>\n </FormSchemaInternal>\n</template>\n","// Components exported from the package root. Lab, shell, data and runtime\n// components are exported from their subpath entries (`src/lab.ts`, ...).\n\n// Base components\nexport { default as BaseButton } from './BaseButton.vue'\nexport { default as BaseInput } from './BaseInput.vue'\nexport { default as BaseSelect } from './BaseSelect.vue'\nexport { default as BaseCheckbox } from './BaseCheckbox.vue'\nexport { default as BaseRadioGroup } from './BaseRadioGroup.vue'\nexport { default as BaseSlider } from './BaseSlider.vue'\nexport { default as BaseTabs } from './BaseTabs.vue'\nexport { default as BaseModal } from './BaseModal.vue'\nexport { default as SegmentedControl } from './SegmentedControl.vue'\nexport { default as BasePill } from './BasePill.vue'\nexport { default as Calendar } from './Calendar.vue'\nexport { default as DataFrame } from './DataFrame.vue'\n\n// Form components\nexport { default as FormField } from './FormField.vue'\nexport { default as DatePicker } from './DatePicker.vue'\nexport { default as NumberInput } from './NumberInput.vue'\nexport { default as FileUploader } from './FileUploader.vue'\n\n// Feedback components\nexport { default as AlertBox } from './AlertBox.vue'\nexport { default as AppToastContainer } from './AppToastContainer.vue'\n\n// Action components\nexport { default as ActionMenu } from './ActionMenu.vue'\nexport { default as ThemeToggle } from './ThemeToggle.vue'\n\n// Layout components\nexport { default as CollapsibleCard } from './CollapsibleCard.vue'\nexport { default as PluginWorkspaceView } from './PluginWorkspaceView.vue'\nexport { default as AppContainer } from './AppContainer.vue'\nexport { default as PluginIcon } from './PluginIcon.vue'\n\n// Utility components\nexport { default as Skeleton } from './Skeleton.vue'\nexport { default as LoadingSpinner } from './LoadingSpinner.vue'\nexport { default as Divider } from './Divider.vue'\nexport { default as ProgressBar } from './ProgressBar.vue'\nexport { default as Avatar } from './Avatar.vue'\nexport { default as EmptyState } from './EmptyState.vue'\nexport { default as Breadcrumb } from './Breadcrumb.vue'\nexport { default as Tooltip } from './Tooltip.vue'\nexport { default as ConfirmDialog } from './ConfirmDialog.vue'\nexport { default as SettingsModal } from './SettingsModal.vue'\n\n// Scientific input components\n\n// Form builder components\nexport { default as FormBuilder } from './FormBuilder.vue'\n\n// Scheduling / booking components\nexport { default as SectionCard } from './SectionCard.vue'\n","import * as rootComponents from './components'\nimport * as dataComponents from './data'\nimport * as labComponents from './lab'\nimport * as runtimeComponents from './runtime'\nimport * as shellComponents from './shell'\n\nconst components = {\n ...rootComponents,\n ...labComponents,\n ...shellComponents,\n ...dataComponents,\n ...runtimeComponents,\n}\n\ntype ComponentRegistryApp = {\n component: (name: string, component: any) => unknown\n}\n\nexport interface MINTSdkPlugin {\n install(app: ComponentRegistryApp): void\n}\n\n/**\n * Vue plugin that registers all MINT SDK components globally, including the\n * components of the `lab`, `shell`, `data` and `runtime` subpaths.\n *\n * @example\n * ```typescript\n * import { createApp } from 'vue'\n * import { MINTSdk } from '@morscherlab/mint-sdk'\n * import '@morscherlab/mint-sdk/styles'\n *\n * const app = createApp(App)\n * app.use(MINTSdk)\n * ```\n */\nexport const MINTSdk: MINTSdkPlugin = {\n install(app) {\n for (const [name, component] of Object.entries(components)) {\n // Check if it's a valid Vue component (has setup, render, or template)\n if (\n component &&\n typeof component === 'object' &&\n ('setup' in component || 'render' in component || '__name' in component)\n ) {\n app.component(name, component)\n }\n }\n },\n}\n\nexport default MINTSdk\n"],"mappings":"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"}
package/dist/install.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as MINTSdk } from "./install-UTqrAgHe.js";
1
+ import { t as MINTSdk } from "./install-QF3Sh82O.js";
2
2
  export { MINTSdk, MINTSdk as default };
@@ -1,22 +1,22 @@
1
1
  import { a as BaseButton_default, n as BaseModal_default, o as __exportAll } from "./useDropdownState-uFIz6Yv8.js";
2
2
  import { o as useApi } from "./experiment-DyO54FQB.js";
3
- import { D as compareTime, G as normalizeOptionInput, H as useListSelection, I as FormField_default, K as BaseInput_default, O as durationMinutes, P as time_exports, R as useRovingFocus, V as BaseSelect_default, z as BaseCheckbox_default } from "./records-CWRztE5M.js";
4
- import { C as FormulaInput_default, D as _plugin_vue_export_helper_default, L as definePlateEditor, N as NumberInput_default, P as DatePicker_default, S as useSequenceUtils, T as renderFormulaParts, a as StepWizard_default, b as MoleculeInput_default, i as useReorderAnnouncer, m as recordValue, r as useListReorder, v as ConcentrationInput_default, w as formula_exports, x as SequenceInput_default, y as useConcentrationUnits, z as defineWellPlate } from "./useListReorder-QqJc1dpX.js";
5
- import { t as SegmentedControl_default } from "./SegmentedControl-Dz41vAFM.js";
6
- import { n as DataStateInternal_default, o as useTextSearch, r as LoadingSpinner_default, t as AlertBox_default } from "./AlertBox-CIhqsWbN.js";
7
- import { C as hexToHsl, E as sampleTypeMarker, S as deriveShade, T as WellPlate_default, _ as mintPlotlyTemplate, b as PlateEditor_default, g as ChartContainer_default, h as PlotlyChart_default, i as GeneratedResultRenderer_default, n as ScheduleCalendar_default, r as useScheduleDrag, t as useRackEditor, v as DoseCalculator_default, w as hslToHex, x as SAMPLE_GROUP_TOKENS, y as dose_exports } from "./useRackEditor-BHGM1Ngz.js";
8
- import { n as ActionMenu_default } from "./useRequest-Bfsh7gIm.js";
9
- import { t as defineControlModel } from "./controlSchemaModel-BbXbMgc6.js";
10
- import { d as unwrapExperimentDesignData, i as readFileAsText, t as useExperimentSamples } from "./useExperimentSamples-Cz2v3V_q.js";
3
+ import { D as compareTime, G as normalizeOptionInput, H as useListSelection, I as FormField_default, K as BaseInput_default, O as durationMinutes, P as time_exports, R as useRovingFocus, V as BaseSelect_default, z as BaseCheckbox_default } from "./records-BAymyHAn.js";
4
+ import { C as FormulaInput_default, D as _plugin_vue_export_helper_default, L as definePlateEditor, N as NumberInput_default, P as DatePicker_default, S as useSequenceUtils, T as renderFormulaParts, a as StepWizard_default, b as MoleculeInput_default, i as useReorderAnnouncer, m as recordValue, r as useListReorder, v as ConcentrationInput_default, w as formula_exports, x as SequenceInput_default, y as useConcentrationUnits, z as defineWellPlate } from "./useListReorder-W1bzK_bo.js";
5
+ import { t as SegmentedControl_default } from "./SegmentedControl-C-sckoJZ.js";
6
+ import { n as DataStateInternal_default, o as useTextSearch, r as LoadingSpinner_default, t as AlertBox_default } from "./AlertBox-CexONPhA.js";
7
+ import { C as hexToHsl, D as SectionCard_default, E as sampleTypeMarker, S as deriveShade, T as WellPlate_default, _ as mintPlotlyTemplate, b as PlateEditor_default, g as ChartContainer_default, h as PlotlyChart_default, i as GeneratedResultRenderer_default, n as ScheduleCalendar_default, r as useScheduleDrag, t as useRackEditor, v as DoseCalculator_default, w as hslToHex, x as SAMPLE_GROUP_TOKENS, y as dose_exports } from "./useRackEditor-Bmtuo0aj.js";
8
+ import { n as ActionMenu_default } from "./useRequest-D9-3BS-3.js";
9
+ import { t as defineControlModel } from "./controlSchemaModel-C_XqpkgE.js";
10
+ import { d as unwrapExperimentDesignData, i as readFileAsText, t as useExperimentSamples } from "./useExperimentSamples-DEDAKa2E.js";
11
11
  import { t as useExpansionSet } from "./useExpansionSet-CvoNMZJi.js";
12
12
  import { Fragment, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, h, mergeProps, nextTick, normalizeClass, normalizeStyle, onMounted, openBlock, ref, renderList, renderSlot, resolveComponent, resolveDynamicComponent, toDisplayString, toHandlers, toValue, unref, useId, vModelText, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
13
13
  import { Layers, RotateCcw, WandSparkles } from "lucide-vue-next";
14
14
  //#region src/components/BaseTabs.vue?vue&type=script&setup=true&lang.ts
15
- var _hoisted_1$17 = {
15
+ var _hoisted_1$16 = {
16
16
  class: "mint-tabs mint-tabs--underline",
17
17
  role: "tablist"
18
18
  };
19
- var _hoisted_2$17 = [
19
+ var _hoisted_2$16 = [
20
20
  "id",
21
21
  "aria-selected",
22
22
  "aria-disabled",
@@ -24,8 +24,8 @@ var _hoisted_2$17 = [
24
24
  "tabindex",
25
25
  "onClick"
26
26
  ];
27
- var _hoisted_3$14 = { class: "mint-tab__content" };
28
- var _hoisted_4$13 = {
27
+ var _hoisted_3$13 = { class: "mint-tab__content" };
28
+ var _hoisted_4$12 = {
29
29
  key: 0,
30
30
  class: "mint-tab__icon mint-tab__icon--svg",
31
31
  viewBox: "0 0 24 24",
@@ -36,8 +36,8 @@ var _hoisted_4$13 = {
36
36
  "stroke-linejoin": "round",
37
37
  "aria-hidden": "true"
38
38
  };
39
- var _hoisted_5$12 = ["d"];
40
- var _hoisted_6$9 = ["d"];
39
+ var _hoisted_5$11 = ["d"];
40
+ var _hoisted_6$8 = ["d"];
41
41
  var _hoisted_7$8 = {
42
42
  key: 1,
43
43
  class: "mint-tab__icon"
@@ -87,7 +87,7 @@ var BaseTabs_default = /* @__PURE__ */ defineComponent({
87
87
  getElement: (id) => tabButtonRefs.get(id)
88
88
  });
89
89
  return (_ctx, _cache) => {
90
- return openBlock(), createElementBlock("div", _hoisted_1$17, [(openBlock(true), createElementBlock(Fragment, null, renderList(normalizedTabs.value, (tab) => {
90
+ return openBlock(), createElementBlock("div", _hoisted_1$16, [(openBlock(true), createElementBlock(Fragment, null, renderList(normalizedTabs.value, (tab) => {
91
91
  return openBlock(), createElementBlock("button", {
92
92
  id: `mint-tab-${tab.id}`,
93
93
  key: tab.id,
@@ -106,30 +106,30 @@ var BaseTabs_default = /* @__PURE__ */ defineComponent({
106
106
  ]),
107
107
  onClick: ($event) => selectTab(tab.id),
108
108
  onKeydown: _cache[0] || (_cache[0] = (...args) => unref(handleKeydown) && unref(handleKeydown)(...args))
109
- }, [createElementVNode("span", _hoisted_3$14, [
110
- isSvgIcon(tab.icon) ? (openBlock(), createElementBlock("svg", _hoisted_4$13, [Array.isArray(tab.icon) ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(tab.icon, (d, index) => {
109
+ }, [createElementVNode("span", _hoisted_3$13, [
110
+ isSvgIcon(tab.icon) ? (openBlock(), createElementBlock("svg", _hoisted_4$12, [Array.isArray(tab.icon) ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(tab.icon, (d, index) => {
111
111
  return openBlock(), createElementBlock("path", {
112
112
  key: index,
113
113
  d
114
- }, null, 8, _hoisted_5$12);
114
+ }, null, 8, _hoisted_5$11);
115
115
  }), 128)) : (openBlock(), createElementBlock("path", {
116
116
  key: 1,
117
117
  d: tab.icon
118
- }, null, 8, _hoisted_6$9))])) : tab.icon ? (openBlock(), createElementBlock("span", _hoisted_7$8, toDisplayString(tab.icon), 1)) : createCommentVNode("", true),
118
+ }, null, 8, _hoisted_6$8))])) : tab.icon ? (openBlock(), createElementBlock("span", _hoisted_7$8, toDisplayString(tab.icon), 1)) : createCommentVNode("", true),
119
119
  createTextVNode(" " + toDisplayString(tab.label) + " ", 1),
120
120
  tab.badge !== void 0 ? (openBlock(), createElementBlock("span", _hoisted_8$8, toDisplayString(tab.badge), 1)) : createCommentVNode("", true)
121
- ])], 42, _hoisted_2$17);
121
+ ])], 42, _hoisted_2$16);
122
122
  }), 128))]);
123
123
  };
124
124
  }
125
125
  });
126
126
  //#endregion
127
127
  //#region src/components/BasePill.vue?vue&type=script&setup=true&lang.ts
128
- var _hoisted_1$16 = {
128
+ var _hoisted_1$15 = {
129
129
  key: 1,
130
130
  class: "mint-pill__icon"
131
131
  };
132
- var _hoisted_2$16 = { class: "mint-pill__label" };
132
+ var _hoisted_2$15 = { class: "mint-pill__label" };
133
133
  //#endregion
134
134
  //#region src/components/BasePill.vue
135
135
  var BasePill_default = /* @__PURE__ */ defineComponent({
@@ -193,8 +193,8 @@ var BasePill_default = /* @__PURE__ */ defineComponent({
193
193
  class: normalizeClass(["mint-pill__dot", { "mint-pill__dot--pulse": __props.pulse }]),
194
194
  "aria-hidden": "true"
195
195
  }, null, 2)) : createCommentVNode("", true),
196
- __props.icon ? (openBlock(), createElementBlock("span", _hoisted_1$16, [renderSlot(_ctx.$slots, "icon")])) : createCommentVNode("", true),
197
- createElementVNode("span", _hoisted_2$16, [renderSlot(_ctx.$slots, "default")]),
196
+ __props.icon ? (openBlock(), createElementBlock("span", _hoisted_1$15, [renderSlot(_ctx.$slots, "icon")])) : createCommentVNode("", true),
197
+ createElementVNode("span", _hoisted_2$15, [renderSlot(_ctx.$slots, "default")]),
198
198
  __props.removable && !__props.disabled ? (openBlock(), createElementBlock("button", {
199
199
  key: 2,
200
200
  type: "button",
@@ -374,20 +374,20 @@ function updateWellsFromDoseResults(source) {
374
374
  }
375
375
  //#endregion
376
376
  //#region src/components/ProgressBar.vue?vue&type=script&setup=true&lang.ts
377
- var _hoisted_1$15 = { class: "mint-progress" };
378
- var _hoisted_2$15 = {
377
+ var _hoisted_1$14 = { class: "mint-progress" };
378
+ var _hoisted_2$14 = {
379
379
  key: 0,
380
380
  class: "mint-progress__header"
381
381
  };
382
- var _hoisted_3$13 = {
382
+ var _hoisted_3$12 = {
383
383
  key: 0,
384
384
  class: "mint-progress__label"
385
385
  };
386
- var _hoisted_4$12 = {
386
+ var _hoisted_4$11 = {
387
387
  key: 1,
388
388
  class: "mint-progress__value"
389
389
  };
390
- var _hoisted_5$11 = [
390
+ var _hoisted_5$10 = [
391
391
  "aria-valuenow",
392
392
  "aria-valuemin",
393
393
  "aria-valuemax",
@@ -421,7 +421,7 @@ var ProgressBar_default = /* @__PURE__ */ defineComponent({
421
421
  return { width: `${clampedValue.value}%` };
422
422
  });
423
423
  return (_ctx, _cache) => {
424
- return openBlock(), createElementBlock("div", _hoisted_1$15, [__props.label || __props.showValue ? (openBlock(), createElementBlock("div", _hoisted_2$15, [__props.label ? (openBlock(), createElementBlock("span", _hoisted_3$13, toDisplayString(__props.label), 1)) : createCommentVNode("", true), __props.showValue && !__props.indeterminate ? (openBlock(), createElementBlock("span", _hoisted_4$12, toDisplayString(clampedValue.value) + "%", 1)) : createCommentVNode("", true)])) : createCommentVNode("", true), createElementVNode("div", {
424
+ return openBlock(), createElementBlock("div", _hoisted_1$14, [__props.label || __props.showValue ? (openBlock(), createElementBlock("div", _hoisted_2$14, [__props.label ? (openBlock(), createElementBlock("span", _hoisted_3$12, toDisplayString(__props.label), 1)) : createCommentVNode("", true), __props.showValue && !__props.indeterminate ? (openBlock(), createElementBlock("span", _hoisted_4$11, toDisplayString(clampedValue.value) + "%", 1)) : createCommentVNode("", true)])) : createCommentVNode("", true), createElementVNode("div", {
425
425
  class: normalizeClass(["mint-progress__track", `mint-progress__track--${__props.size}`]),
426
426
  role: "progressbar",
427
427
  "aria-valuenow": __props.indeterminate ? void 0 : clampedValue.value,
@@ -435,85 +435,7 @@ var ProgressBar_default = /* @__PURE__ */ defineComponent({
435
435
  __props.indeterminate ? "mint-progress__bar--indeterminate" : ""
436
436
  ]),
437
437
  style: normalizeStyle(barStyle.value)
438
- }, null, 6)], 10, _hoisted_5$11)]);
439
- };
440
- }
441
- });
442
- //#endregion
443
- //#region src/components/SectionCard.vue?vue&type=script&setup=true&lang.ts
444
- var _hoisted_1$14 = {
445
- class: "mint-section-card__icon",
446
- viewBox: "0 0 24 24",
447
- fill: "none",
448
- stroke: "currentColor",
449
- "stroke-width": "2",
450
- "stroke-linecap": "round",
451
- "stroke-linejoin": "round",
452
- "aria-hidden": "true"
453
- };
454
- var _hoisted_2$14 = ["d"];
455
- var _hoisted_3$12 = {
456
- key: 1,
457
- class: "mint-section-card__count"
458
- };
459
- var _hoisted_4$11 = {
460
- key: 0,
461
- class: "mint-section-card__toolbar"
462
- };
463
- var _hoisted_5$10 = { class: "mint-section-card__body" };
464
- var _hoisted_6$8 = {
465
- key: 1,
466
- class: "mint-section-card__footer"
467
- };
468
- //#endregion
469
- //#region src/components/SectionCard.vue
470
- var SectionCard_default = /* @__PURE__ */ defineComponent({
471
- __name: "SectionCard",
472
- props: {
473
- title: {},
474
- count: { default: void 0 },
475
- icon: { default: void 0 },
476
- accent: { default: "primary" },
477
- uppercase: {
478
- type: Boolean,
479
- default: false
480
- },
481
- divider: { default: "strong" },
482
- fill: {
483
- type: Boolean,
484
- default: false
485
- }
486
- },
487
- setup(__props) {
488
- /** One-card page region from the MINT 1.1 card system: 12px radius, the
489
- * single --card-shadow token, a header strip (icon chip, title, mono count,
490
- * actions), and hairline-separated content — no card-in-card. */
491
- const props = __props;
492
- const iconPaths = computed(() => props.icon === void 0 ? [] : Array.isArray(props.icon) ? props.icon : [props.icon]);
493
- const headerClasses = computed(() => ["mint-section-card__header", props.divider === "light" ? "mint-section-card__header--divider-light" : ""]);
494
- const titleClasses = computed(() => ["mint-section-card__title", props.uppercase ? "mint-section-card__title--uppercase" : ""]);
495
- const cardClasses = computed(() => ["mint-section-card", props.fill ? "mint-section-card--fill" : ""]);
496
- return (_ctx, _cache) => {
497
- return openBlock(), createElementBlock("section", { class: normalizeClass(cardClasses.value) }, [
498
- createElementVNode("div", { class: normalizeClass(headerClasses.value) }, [
499
- iconPaths.value.length ? (openBlock(), createElementBlock("span", {
500
- key: 0,
501
- class: normalizeClass(["mint-section-card__icon-chip", `mint-section-card__icon-chip--${__props.accent}`])
502
- }, [(openBlock(), createElementBlock("svg", _hoisted_1$14, [(openBlock(true), createElementBlock(Fragment, null, renderList(iconPaths.value, (d, i) => {
503
- return openBlock(), createElementBlock("path", {
504
- key: i,
505
- d
506
- }, null, 8, _hoisted_2$14);
507
- }), 128))]))], 2)) : createCommentVNode("", true),
508
- createElementVNode("h2", { class: normalizeClass(titleClasses.value) }, toDisplayString(__props.title), 3),
509
- __props.count !== void 0 ? (openBlock(), createElementBlock("span", _hoisted_3$12, toDisplayString(__props.count), 1)) : createCommentVNode("", true),
510
- _cache[0] || (_cache[0] = createElementVNode("div", { class: "mint-section-card__spacer" }, null, -1)),
511
- renderSlot(_ctx.$slots, "actions")
512
- ], 2),
513
- _ctx.$slots.toolbar ? (openBlock(), createElementBlock("div", _hoisted_4$11, [renderSlot(_ctx.$slots, "toolbar")])) : createCommentVNode("", true),
514
- createElementVNode("div", _hoisted_5$10, [renderSlot(_ctx.$slots, "default")]),
515
- _ctx.$slots.footer ? (openBlock(), createElementBlock("div", _hoisted_6$8, [renderSlot(_ctx.$slots, "footer")])) : createCommentVNode("", true)
516
- ], 2);
438
+ }, null, 6)], 10, _hoisted_5$10)]);
517
439
  };
518
440
  }
519
441
  });
@@ -7070,7 +6992,7 @@ var InstrumentStatusPanels_default = /*#__PURE__*/ _plugin_vue_export_helper_def
7070
6992
  }, 8, ["title", "count"]);
7071
6993
  };
7072
6994
  }
7073
- }), [["__scopeId", "data-v-3c05755e"]]);
6995
+ }), [["__scopeId", "data-v-1a9246f6"]]);
7074
6996
  //#endregion
7075
6997
  //#region src/components/TimeRangeInput.vue?vue&type=script&setup=true&lang.ts
7076
6998
  var _hoisted_1$1 = { class: "mint-time-range" };
@@ -7496,6 +7418,6 @@ var lab_exports = /* @__PURE__ */ __exportAll({
7496
7418
  useSequenceUtils: () => useSequenceUtils
7497
7419
  });
7498
7420
  //#endregion
7499
- export { defineWellPlateControlProps as C, BaseTabs_default as D, BasePill_default as E, defineDoseDesignControlModel as S, defineWellPlateDoseControlProps as T, SampleSelector_default as _, useReagentSeries as a, ProgressBar_default as b, InstrumentStatusPanels_default as c, ChemicalFormula_default as d, AdductText_default as f, SampleHierarchyTree_default as g, useProtocolTemplates as h, generateDilutionSeries as i, InstrumentStateBadge_default as l, ProtocolStepEditor_default as m, DEFAULT_PRESETS as n, ResourceCard_default as o, ScientificNumber_default as p, DEFAULT_UNITS as r, TimeRangeInput_default as s, lab_exports as t, SequenceProgressBar_default as u, useSampleGroups as v, defineWellPlateDoseComponentBindings as w, defineDoseCalculatorControlProps as x, SectionCard_default as y };
7421
+ export { defineWellPlateDoseComponentBindings as C, BaseTabs_default as E, defineWellPlateControlProps as S, BasePill_default as T, SampleSelector_default as _, useReagentSeries as a, defineDoseCalculatorControlProps as b, InstrumentStatusPanels_default as c, ChemicalFormula_default as d, AdductText_default as f, SampleHierarchyTree_default as g, useProtocolTemplates as h, generateDilutionSeries as i, InstrumentStateBadge_default as l, ProtocolStepEditor_default as m, DEFAULT_PRESETS as n, ResourceCard_default as o, ScientificNumber_default as p, DEFAULT_UNITS as r, TimeRangeInput_default as s, lab_exports as t, SequenceProgressBar_default as u, useSampleGroups as v, defineWellPlateDoseControlProps as w, defineDoseDesignControlModel as x, ProgressBar_default as y };
7500
7422
 
7501
- //# sourceMappingURL=lab-CbdDLAVr.js.map
7423
+ //# sourceMappingURL=lab-BcX5JBSY.js.map