@morscherlab/mint-sdk 1.0.41 → 1.0.43

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.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as SampleLegend_default, A as GroupAssigner_default, B as StatusIndicator_default, C as formatSequenceRemaining, Ct as BaseTabs_default, D as ScientificNumber_default, E as ChemicalFormula_default, F as BioTemplateRenderer_default, G as ComponentBindingRenderer_default, H as AppContainer_default, I as ChartContainer_default, J as AutoGroupModal_default, K as ScheduleCalendar_default, L as Breadcrumb_default, M as BioTemplatePresetWorkspaceView_default, N as BioTemplatePackWorkspaceView_default, O as ProtocolStepEditor_default, P as BioTemplateExperimentWorkspaceView_default, Q as PlateMapEditor_default, R as Avatar_default, S as formatSequenceEta, St as SegmentedControl_default, T as sequenceSamplesRemaining, U as DoseDesignWorkspaceView_default, V as Divider_default, W as ControlWorkspaceView_default, X as LoadingSpinner_default, Y as SampleHierarchyTree_default, Z as ReagentList_default, _ as InstrumentStateBadge_default, _t as AppToastContainer_default, a as ExperimentDataViewer_default, at as AppLayout_default, b as estimateSequenceFinishDate, bt as Calendar_default, c as LcmsSequenceTable_default, ct as FormActions_default, d as extractLcmsCommonPrefix, dt as AppPluginSwitcher_default, et as WellPlate_default, f as extractLcmsSampleName, ft as AppAvatarMenu_default, g as InstrumentStatusCard_default, gt as IconButton_default, h as reconstructLcmsPlateCellsFromSequenceItems, ht as ThemeToggle_default, i as TimeRangeInput_default, it as MobileSupportGate_default, j as RackEditor_default, k as ReagentEditor_default, l as DEFAULT_LCMS_SEQUENCE_COLUMNS, lt as StepWizard_default, m as lcmsWellIdFromPosition, mt as CollapsibleCard_default, n as FitPanel_default, nt as DoseCalculator_default, o as BatchProgressList_default, ot as AppSidebar_default, p as inferLcmsPlateTypeFromWellIds, pt as PluginIcon_default, q as SampleSelector_default, r as ResourceCard_default, rt as PluginWorkspaceView_default, s as AuditTrail_default, st as FormBuilder_default, tt as ExperimentTimeline_default, u as basenameFromWindowsPath, ut as AppTopBar_default, v as InstrumentAlertLog_default, vt as AlertBox_default, w as sequenceProgressPercent, wt as ColorSlider_default, x as estimateSequenceRemainingSeconds, xt as DropdownButton_default, y as SequenceProgressBar_default, yt as DataFrame_default, z as ProgressBar_default } from "./components-CJ2--4Ex.js";
1
+ import { $ as SampleLegend_default, A as GroupAssigner_default, B as StatusIndicator_default, C as formatSequenceRemaining, Ct as BaseTabs_default, D as ScientificNumber_default, E as ChemicalFormula_default, F as BioTemplateRenderer_default, G as ComponentBindingRenderer_default, H as AppContainer_default, I as ChartContainer_default, J as AutoGroupModal_default, K as ScheduleCalendar_default, L as Breadcrumb_default, M as BioTemplatePresetWorkspaceView_default, N as BioTemplatePackWorkspaceView_default, O as ProtocolStepEditor_default, P as BioTemplateExperimentWorkspaceView_default, Q as PlateMapEditor_default, R as Avatar_default, S as formatSequenceEta, St as SegmentedControl_default, T as sequenceSamplesRemaining, U as DoseDesignWorkspaceView_default, V as Divider_default, W as ControlWorkspaceView_default, X as LoadingSpinner_default, Y as SampleHierarchyTree_default, Z as ReagentList_default, _ as InstrumentStateBadge_default, _t as AppToastContainer_default, a as ExperimentDataViewer_default, at as AppLayout_default, b as estimateSequenceFinishDate, bt as Calendar_default, c as LcmsSequenceTable_default, ct as FormActions_default, d as extractLcmsCommonPrefix, dt as AppPluginSwitcher_default, et as WellPlate_default, f as extractLcmsSampleName, ft as AppAvatarMenu_default, g as InstrumentStatusCard_default, gt as IconButton_default, h as reconstructLcmsPlateCellsFromSequenceItems, ht as ThemeToggle_default, i as TimeRangeInput_default, it as MobileSupportGate_default, j as RackEditor_default, k as ReagentEditor_default, l as DEFAULT_LCMS_SEQUENCE_COLUMNS, lt as StepWizard_default, m as lcmsWellIdFromPosition, mt as CollapsibleCard_default, n as FitPanel_default, nt as DoseCalculator_default, o as BatchProgressList_default, ot as AppSidebar_default, p as inferLcmsPlateTypeFromWellIds, pt as PluginIcon_default, q as SampleSelector_default, r as ResourceCard_default, rt as PluginWorkspaceView_default, s as AuditTrail_default, st as FormBuilder_default, tt as ExperimentTimeline_default, u as basenameFromWindowsPath, ut as AppTopBar_default, v as InstrumentAlertLog_default, vt as AlertBox_default, w as sequenceProgressPercent, wt as ColorSlider_default, x as estimateSequenceRemainingSeconds, xt as DropdownButton_default, y as SequenceProgressBar_default, yt as DataFrame_default, z as ProgressBar_default } from "./components-BGVwavdd.js";
2
2
  import { t as BaseButton_default } from "./BaseButton-Dgqrze41.js";
3
3
  import { r as BaseInput_default, t as BaseSelect_default } from "./BaseSelect-ekgr9fDo.js";
4
4
  import { $ as parseTime, A as useConcentrationUnits, B as TagsInput_default, C as controlsToViewIds, D as getTypeDefault, E as getFieldRegistryEntry, F as ATOMIC_WEIGHTS, G as findAvailableSlots, H as addMinutes, I as useChemicalFormula, J as formatTime, K as findNearestTimeSlotIndex, L as DateTimePicker_default, M as SequenceInput_default, N as useSequenceUtils, O as ConcentrationInput_default, P as FormulaInput_default, Q as isTimeInRange, R as FileUploader_default, S as controlsToTopBarSettingsConfig, T as getDefaultControlView, U as compareTime, V as TimePicker_default, W as durationMinutes, X as fromMinutes, Y as formatTimeSlot, Z as generateTimeSlots, _ as controlsToFormSchema, a as defineDoseCalculatorControlProps, at as MultiSelect_default, b as controlsToSettingsSchema, c as defineWellPlateDoseComponentBindings, ct as BaseSlider_default, d as defineControlModel, dt as BaseCheckbox_default, et as rangesOverlap, ft as Tooltip_default, h as controlValuesToComponentProps, i as useControlSchema, it as DatePicker_default, j as MoleculeInput_default, k as UnitInput_default, l as defineWellPlateDoseControlProps, lt as BaseRadioGroup_default, m as controlValuesToComponentBindingsById, n as defineControls, nt as toMinutes, o as defineDoseDesignControlModel, ot as useListSelection, p as controlValuesToComponentBindings, pt as BaseTextarea_default, q as formatDuration, r as getControlDefaults, rt as useTimeUtils, s as defineWellPlateControlProps, st as useSelectionLimit, t as defineControlComponentBindings, tt as snapToSlot, u as useControlWorkspace, ut as BaseToggle_default, v as controlsToSectionFormSchema, w as controlsToViewItems, x as controlsToSidebarPanels, y as controlsToSectionFormSchemas, z as NumberInput_default } from "./useControlSchema-BZNdalmL.js";
@@ -15,7 +15,7 @@ import { i as useApi, n as useDebouncedWatch, r as useRequestSyncState, t as use
15
15
  import { n as ConfirmDialog_default, t as ExperimentPopover_default } from "./ExperimentPopover-BbPkIFsI.js";
16
16
  import { $ as toTimeCourseRows, $t as listBioTemplatePacks, A as createSamplePrepTemplate, At as toCalibrationCurveRows, B as toBioTemplateComponentProps, Bt as validatePlateMapData, C as createFlowCytometryPanelTemplate, Ct as toInstrumentRunScheduleEvents, D as createTimeCourseTemplate, Dt as toFlowPanelRows, E as createProtocolStepsTemplate, Et as toFlowPanelDataFrame, Ft as validateAssayMatrixData, G as toTemplateDataFrame, Gt as validateSampleSheetData, H as toBioTemplateComponentPropsById, Ht as validateQpcrPlateData, I as listBioTemplateComponentBindings, It as validateCalibrationCurveData, J as toDoseLayoutState, Jt as getBioTemplatePresetInfo, K as toWellMapArray, Kt as validateTimeCourseData, L as toBioTemplateComponentBindings, Lt as validateDoseResponseData, M as createPlateMapTemplate, Mt as toAssayMatrixDataFrame, N as bioTemplatePresetControlValuesToOptions, Nt as toAssayMatrixRows, O as createCalibrationCurveTemplate, Ot as toCalibrationCurveColumns, P as getBioTemplateComponentBindings, Pt as toAssayMatrixSampleOptions, Q as toTimeCourseDataFrame, Qt as getBioTemplatePackInfo, R as toBioTemplateComponentBindingsById, Rt as validateFlowCytometryPanelData, S as createInstrumentRunTemplate, St as toInstrumentRunRows, T as createAssayMatrixTemplate, Tt as toFlowPanelColumns, U as toBioTemplateComponentSnippets, Ut as validateReagentListData, Vt as validateProtocolStepsData, W as toBioTemplateComponentUsage, Wt as validateSamplePrepData, X as toWellPlateWells, Xt as searchBioTemplatePresets, Y as toPlateMapEditorState, Yt as listBioTemplatePresets, Z as toTimeCourseColumns, Zt as bioTemplatePacks, _ as createElisaAssayCollection, _t as toProtocolDataFrame, a as getBioTemplateControlDefaults, an as TEMPLATE_COLLECTION_KEY, at as toSamplePrepColumns, b as createQpcrExpressionCollection, bt as toInstrumentRunColumns, c as listBioTemplatePresetControlSchemas, cn as createTemplateEnvelope, ct as toReagentColumns, d as createBioTemplatePresetCollectionFromControls, dn as extractTemplateCollection, dt as toReagentRows, en as searchBioTemplatePacks, et as toTimeCourseSteps, f as createWellPlateScreenCollection, fn as getTemplateData, ft as toQpcrColumns, g as createFlowCytometryAssayCollection, gt as toProtocolColumns, h as createWesternBlotAssayCollection, ht as toQpcrWellPlateWells, i as createBioTemplateControlToolkit, in as searchBioTemplateCatalog, it as toSampleRows, j as createSampleSheetTemplate, jt as toAssayMatrixColumns, k as createDoseResponseTemplate, kt as toCalibrationCurveDataFrame, l as requireBioTemplateControlSchema, ln as ensureTemplateEnvelope, lt as toReagentDataFrame, m as createDefaultBioTemplate, mt as toQpcrRows, n as bioTemplateControlsToSectionFormSchemas, nn as getBioTemplateInfo, nt as toSampleDataFrame, o as getBioTemplateControlSchema, on as assertTemplateEnvelope, ot as toSamplePrepDataFrame, p as createBioTemplatePackCollection, pt as toQpcrDataFrame, q as toDoseConditions, qt as bioTemplatePresets, r as bioTemplateControlsToSidebarPanels, rn as listBioTemplateCatalog, rt as toSampleOptions, s as listBioTemplateControlSchemas, sn as createTemplateCollection, st as toSamplePrepRows, t as bioTemplateControlsToFormSchema, tn as bioTemplateCatalog, tt as toSampleColumns, u as createBioTemplatePresetCollection, un as ensureTemplateFromCollection, ut as toReagentListItems, v as createTargetedMetabolomicsCollection, vt as toProtocolRows, w as createReagentListTemplate, wt as toInstrumentRunSteps, x as createQpcrPlateTemplate, xt as toInstrumentRunDataFrame, y as createLcmsBatchCollection, yt as toProtocolSteps, z as toBioTemplateComponentImports, zt as validateInstrumentRunData } from "./templates-CNbPQNID.js";
17
17
  import { MINTSdk } from "./install.js";
18
- import { A as useCommandHistory, C as parseDelimitedText, D as createPluginResourceClient, E as validateImportFile, F as useAuth, M as useAsync, N as useAsyncBatch, O as useResourceCrud, P as usePasskey, S as detectDelimiter, T as useFileImport, _ as useWellPlateAdapter, a as pluginFormDataFromPayload, b as wellIdToCoordinate, c as usePluginClient, d as resolvePluginBaseUrl, f as runWellPlateValidation, g as createWellPlateWells, h as createRowConditions, i as getPluginPageSelectorItems, j as usePluginConfig, k as useOptimisticMutation, l as usePluginSettings, m as createColumnConditions, n as downloadBlob, o as uploadPluginEndpoint, p as useWellPlateValidation, r as downloadPluginEndpoint, s as useCurrentExperiment, t as createPluginClient, u as buildPluginEndpointUrl, v as coordinateToWellId, w as readFileAsText, x as wellIdsInRectangle, y as useWellPainting } from "./composables-DrE6OcZZ.js";
18
+ import { A as useOptimisticMutation, C as detectDelimiter, D as validateImportFile, E as useFileImport, F as usePasskey, I as useAuth, M as usePluginConfig, N as useAsync, O as createPluginResourceClient, P as useAsyncBatch, S as wellIdsInRectangle, T as readFileAsText, _ as createWellPlateWells, a as pluginFormDataFromPayload, b as useWellPainting, c as usePluginClient, d as buildPluginEndpointUrl, f as resolvePluginBaseUrl, g as createRowConditions, h as createColumnConditions, i as getPluginPageSelectorItems, j as useCommandHistory, k as useResourceCrud, l as usePluginEventStream, m as useWellPlateValidation, n as downloadBlob, o as uploadPluginEndpoint, p as runWellPlateValidation, r as downloadPluginEndpoint, s as useCurrentExperiment, t as createPluginClient, u as usePluginSettings, v as useWellPlateAdapter, w as parseDelimitedText, x as wellIdToCoordinate, y as coordinateToWellId } from "./composables-C_hPF0Gn.js";
19
19
  import "./stores/index.js";
20
20
  //#region src/utils/rack.ts
21
21
  var LCMS_DEFAULT_CONTROL_POSITIONS = {
@@ -177,6 +177,6 @@ function comparePlateCells(a, b) {
177
177
  return rowDiff === 0 ? a.column - b.column : rowDiff;
178
178
  }
179
179
  //#endregion
180
- export { ADMIN_PANEL_PERMISSIONS, ADMIN_ROLE, APP_EXPERIMENT_KEY, ATOMIC_WEIGHTS, AlertBox_default as AlertBox, AppAvatarMenu_default as AppAvatarMenu, AppContainer_default as AppContainer, AppLayout_default as AppLayout, AppPluginSwitcher_default as AppPluginSwitcher, AppSidebar_default as AppSidebar, AppToastContainer_default as AppToastContainer, AppTopBar_default as AppTopBar, AuditTrail_default as AuditTrail, AutoGroupModal_default as AutoGroupModal, 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, BaseTextarea_default as BaseTextarea, BaseToggle_default as BaseToggle, BatchProgressList_default as BatchProgressList, BioTemplateExperimentWorkspaceView_default as BioTemplateExperimentWorkspaceView, BioTemplatePackWorkspaceView_default as BioTemplatePackWorkspaceView, BioTemplatePresetWorkspaceView_default as BioTemplatePresetWorkspaceView, BioTemplateRenderer_default as BioTemplateRenderer, Breadcrumb_default as Breadcrumb, Calendar_default as Calendar, ChartContainer_default as ChartContainer, ChemicalFormula_default as ChemicalFormula, CollapsibleCard_default as CollapsibleCard, ColorSlider_default as ColorSlider, ComponentBindingRenderer_default as ComponentBindingRenderer, ConcentrationInput_default as ConcentrationInput, ConfirmDialog_default as ConfirmDialog, ControlWorkspaceView_default as ControlWorkspaceView, DATE_PRESET_OPTIONS, DEFAULT_COLORS, DEFAULT_LCMS_SEQUENCE_COLUMNS, DEFAULT_MOBILE_VIEWPORT_QUERY, DEFAULT_PRESETS, DEFAULT_UNITS, DataFrame_default as DataFrame, DatePicker_default as DatePicker, DateTimePicker_default as DateTimePicker, Divider_default as Divider, DoseCalculator_default as DoseCalculator, DoseDesignWorkspaceView_default as DoseDesignWorkspaceView, DropdownButton_default as DropdownButton, EXPERIMENT_STATUS_LABELS, EXPERIMENT_STATUS_OPTIONS, EXPERIMENT_STATUS_VARIANT_MAP, EmptyState_default as EmptyState, ExperimentCodeBadge_default as ExperimentCodeBadge, ExperimentDataViewer_default as ExperimentDataViewer, ExperimentPopover_default as ExperimentPopover, ExperimentSelectorModal_default as ExperimentSelectorModal, ExperimentTimeline_default as ExperimentTimeline, FileUploader_default as FileUploader, FitPanel_default as FitPanel, FormActions_default as FormActions, FormBuilder_default as FormBuilder, FormField_default as FormField, FormulaInput_default as FormulaInput, GroupAssigner_default as GroupAssigner, IconButton_default as IconButton, InstrumentAlertLog_default as InstrumentAlertLog, InstrumentStateBadge_default as InstrumentStateBadge, InstrumentStatusCard_default as InstrumentStatusCard, LCMS_DEFAULT_CONTROL_POSITIONS, LcmsSequenceTable_default as LcmsSequenceTable, LoadingSpinner_default as LoadingSpinner, MINTSdk, MINTSdk as default, MobileSupportGate_default as MobileSupportGate, MoleculeInput_default as MoleculeInput, MultiSelect_default as MultiSelect, NumberInput_default as NumberInput, PlateMapEditor_default as PlateMapEditor, PluginIcon_default as PluginIcon, PluginWorkspaceView_default as PluginWorkspaceView, ProgressBar_default as ProgressBar, ProtocolStepEditor_default as ProtocolStepEditor, RackEditor_default as RackEditor, ReagentEditor_default as ReagentEditor, ReagentList_default as ReagentList, ResourceCard_default as ResourceCard, SORT_OPTIONS, SampleHierarchyTree_default as SampleHierarchyTree, SampleLegend_default as SampleLegend, SampleSelector_default as SampleSelector, ScheduleCalendar_default as ScheduleCalendar, ScientificNumber_default as ScientificNumber, SegmentedControl_default as SegmentedControl, SequenceInput_default as SequenceInput, SequenceProgressBar_default as SequenceProgressBar, SettingsModal_default as SettingsModal, Skeleton_default as Skeleton, StatusIndicator_default as StatusIndicator, StepWizard_default as StepWizard, TEMPLATE_COLLECTION_KEY, TagsInput_default as TagsInput, ThemeToggle_default as ThemeToggle, TimePicker_default as TimePicker, TimeRangeInput_default as TimeRangeInput, Tooltip_default as Tooltip, UnitInput_default as UnitInput, WellPlate_default as WellPlate, addMinutes, assertTemplateEnvelope, basenameFromWindowsPath, bioTemplateCatalog, bioTemplateControlsToFormSchema, bioTemplateControlsToSectionFormSchemas, bioTemplateControlsToSidebarPanels, bioTemplatePacks, bioTemplatePresetControlValuesToOptions, bioTemplatePresets, buildPluginEndpointUrl, canAccessAdmin, canAccessByPolicy, canAccessPlugin, candidateMatchesSearch, colorPalettes, compareSortValues, compareTime, controlValuesToComponentBindings, controlValuesToComponentBindingsById, controlValuesToComponentProps, controlsToFormSchema, controlsToSectionFormSchema, controlsToSectionFormSchemas, controlsToSettingsSchema, controlsToSidebarPanels, controlsToTopBarSettingsConfig, controlsToViewIds, controlsToViewItems, coordinateToWellId, createAssayMatrixTemplate, createBioTemplateControlToolkit, createBioTemplatePackCollection, createBioTemplatePresetCollection, createBioTemplatePresetCollectionFromControls, createCalibrationCurveTemplate, createColumnConditions, createDefaultBioTemplate, createDoseResponseTemplate, createElisaAssayCollection, createFlowCytometryAssayCollection, createFlowCytometryPanelTemplate, createInstrumentRunTemplate, createLcmsBatchCollection, createLcmsControlWellEditData, createPlateMapTemplate, createPluginClient, createPluginResourceClient, createProtocolStepsTemplate, createQpcrExpressionCollection, createQpcrPlateTemplate, createReagentListTemplate, createRowConditions, createSamplePrepTemplate, createSampleSheetTemplate, createTargetedMetabolomicsCollection, createTemplateCollection, createTemplateEnvelope, createTimeCourseTemplate, createWellPlateScreenCollection, createWellPlateWells, createWesternBlotAssayCollection, datePresetToISO, defineControlComponentBindings, defineControlModel, defineControls, defineDoseCalculatorControlProps, defineDoseDesignControlModel, defineWellPlateControlProps, defineWellPlateDoseComponentBindings, defineWellPlateDoseControlProps, deriveShade, detectDelimiter, downloadBlob, downloadPluginEndpoint, durationMinutes, ensureTemplateEnvelope, ensureTemplateFromCollection, estimateSequenceFinishDate, estimateSequenceRemainingSeconds, evaluateCondition, extractLcmsCommonPrefix, extractLcmsSampleName, extractSampleNamesFromDesignData, extractSampleOptionsFromDesignData, extractSamplesFromDesignData, extractTemplateCollection, findAvailableSlots, findNearestTimeSlotIndex, formatDuration, formatExperimentDate, formatExperimentStatus, formatSequenceEta, formatSequenceRemaining, formatTime, formatTimeSlot, fromMinutes, generateDilutionSeries, generateTimeSlots, getAccessAudience, getBioTemplateComponentBindings, getBioTemplateComponentProps, getBioTemplateControlDefaults, getBioTemplateControlSchema, getBioTemplateInfo, getBioTemplatePackInfo, getBioTemplatePresetInfo, getControlDefaults, getDefaultControlView, getExperimentStatusVariant, getFieldRegistryEntry, getLcmsDefaultControlWellId, getPluginPageSelectorItems, getRoleInfo, getTemplateData, getTypeDefault, getUserPermissions, hasAllPermissions, hasAnyPermission, hexToHsl, hslToHex, inferLcmsPlateTypeFromWellIds, isAdminRole, isAdminUser, isTimeInRange, lcmsPlateCellsToRack, lcmsPlateCellsToRacks, lcmsPlateTypeToRackFormat, lcmsWellId, lcmsWellIdFromPosition, listBioTemplateCatalog, listBioTemplateComponentBindings, listBioTemplateControlSchemas, listBioTemplatePacks, listBioTemplatePresetControlSchemas, listBioTemplatePresets, normalizeAccessPolicy, normalizeSearchQuery, parseDelimitedText, parseLcmsWellId, parseTime, pluginFormDataFromPayload, rackFormatToLcmsPlateType, rackToLcmsPlateCells, racksToLcmsPlateCells, rangesOverlap, readFileAsText, reconstructLcmsPlateCellsFromSequenceItems, requireBioTemplateControlSchema, resolveExperimentCode, resolvePluginBaseUrl, runWellPlateValidation, searchBioTemplateCatalog, searchBioTemplatePacks, searchBioTemplatePresets, sequenceProgressPercent, sequenceSamplesRemaining, snapToSlot, toAssayMatrixColumns, toAssayMatrixDataFrame, toAssayMatrixRows, toAssayMatrixSampleOptions, toBioTemplateComponentBindings, toBioTemplateComponentBindingsById, toBioTemplateComponentImports, toBioTemplateComponentProps, toBioTemplateComponentPropsByComponent, toBioTemplateComponentPropsById, toBioTemplateComponentSnippets, toBioTemplateComponentUsage, toCalibrationCurveColumns, toCalibrationCurveDataFrame, toCalibrationCurveRows, toDoseConditions, toDoseLayoutState, toFlowPanelColumns, toFlowPanelDataFrame, toFlowPanelRows, toInstrumentRunColumns, toInstrumentRunDataFrame, toInstrumentRunRows, toInstrumentRunScheduleEvents, toInstrumentRunSteps, toMinutes, toPlateMapEditorState, toProtocolColumns, toProtocolDataFrame, toProtocolRows, toProtocolSteps, toQpcrColumns, toQpcrDataFrame, toQpcrRows, toQpcrWellPlateWells, toReagentColumns, toReagentDataFrame, toReagentListItems, toReagentRows, toSampleColumns, toSampleDataFrame, toSampleOptions, toSamplePrepColumns, toSamplePrepDataFrame, toSamplePrepRows, toSampleRows, toTemplateDataFrame, toTimeCourseColumns, toTimeCourseDataFrame, toTimeCourseRows, toTimeCourseSteps, toWellMapArray, toWellPlateWells, unwrapExperimentDesignData, uploadPluginEndpoint, useApi, useAppExperiment, useAsync, useAsyncBatch, useAuth, useAuthStore, useAutoGroup, useBioTemplateComponents, useBioTemplateControls, useBioTemplatePackWorkspace, useBioTemplatePresetWorkspace, useBioTemplateWorkspace, useChemicalFormula, useCommandHistory, useConcentrationUnits, useControlSchema, useControlWorkspace, useCurrentExperiment, useDebouncedWatch, useDoseCalculator, useEventListener, useExpansionSet, useExperimentData, useExperimentSamples, useExperimentSave, useExperimentSelector, useFileImport, useForm, useFormBuilder, useGroupAssignment, useListSelection, useMobileSupportGate, useOptimisticMutation, usePasskey, usePlatformContext, usePluginClient, usePluginConfig, usePluginSettings, useProtocolTemplates, useRackEditor, useReagentSeries, useRequestSyncState, useResourceCrud, useSampleGroups, useScheduleDrag, useSelectionLimit, useSequenceUtils, useSettingsStore, useSortedItems, useTemplateCollection, useTextSearch, useTheme, useTimeUtils, useToast, useWellPainting, useWellPlateAdapter, useWellPlateEditor, useWellPlateValidation, validateAssayMatrixData, validateCalibrationCurveData, validateDoseResponseData, validateFlowCytometryPanelData, validateImportFile, validateInstrumentRunData, validatePlateMapData, validateProtocolStepsData, validateQpcrPlateData, validateReagentListData, validateSamplePrepData, validateSampleSheetData, validateTimeCourseData, wellIdToCoordinate, wellIdsInRectangle };
180
+ export { ADMIN_PANEL_PERMISSIONS, ADMIN_ROLE, APP_EXPERIMENT_KEY, ATOMIC_WEIGHTS, AlertBox_default as AlertBox, AppAvatarMenu_default as AppAvatarMenu, AppContainer_default as AppContainer, AppLayout_default as AppLayout, AppPluginSwitcher_default as AppPluginSwitcher, AppSidebar_default as AppSidebar, AppToastContainer_default as AppToastContainer, AppTopBar_default as AppTopBar, AuditTrail_default as AuditTrail, AutoGroupModal_default as AutoGroupModal, 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, BaseTextarea_default as BaseTextarea, BaseToggle_default as BaseToggle, BatchProgressList_default as BatchProgressList, BioTemplateExperimentWorkspaceView_default as BioTemplateExperimentWorkspaceView, BioTemplatePackWorkspaceView_default as BioTemplatePackWorkspaceView, BioTemplatePresetWorkspaceView_default as BioTemplatePresetWorkspaceView, BioTemplateRenderer_default as BioTemplateRenderer, Breadcrumb_default as Breadcrumb, Calendar_default as Calendar, ChartContainer_default as ChartContainer, ChemicalFormula_default as ChemicalFormula, CollapsibleCard_default as CollapsibleCard, ColorSlider_default as ColorSlider, ComponentBindingRenderer_default as ComponentBindingRenderer, ConcentrationInput_default as ConcentrationInput, ConfirmDialog_default as ConfirmDialog, ControlWorkspaceView_default as ControlWorkspaceView, DATE_PRESET_OPTIONS, DEFAULT_COLORS, DEFAULT_LCMS_SEQUENCE_COLUMNS, DEFAULT_MOBILE_VIEWPORT_QUERY, DEFAULT_PRESETS, DEFAULT_UNITS, DataFrame_default as DataFrame, DatePicker_default as DatePicker, DateTimePicker_default as DateTimePicker, Divider_default as Divider, DoseCalculator_default as DoseCalculator, DoseDesignWorkspaceView_default as DoseDesignWorkspaceView, DropdownButton_default as DropdownButton, EXPERIMENT_STATUS_LABELS, EXPERIMENT_STATUS_OPTIONS, EXPERIMENT_STATUS_VARIANT_MAP, EmptyState_default as EmptyState, ExperimentCodeBadge_default as ExperimentCodeBadge, ExperimentDataViewer_default as ExperimentDataViewer, ExperimentPopover_default as ExperimentPopover, ExperimentSelectorModal_default as ExperimentSelectorModal, ExperimentTimeline_default as ExperimentTimeline, FileUploader_default as FileUploader, FitPanel_default as FitPanel, FormActions_default as FormActions, FormBuilder_default as FormBuilder, FormField_default as FormField, FormulaInput_default as FormulaInput, GroupAssigner_default as GroupAssigner, IconButton_default as IconButton, InstrumentAlertLog_default as InstrumentAlertLog, InstrumentStateBadge_default as InstrumentStateBadge, InstrumentStatusCard_default as InstrumentStatusCard, LCMS_DEFAULT_CONTROL_POSITIONS, LcmsSequenceTable_default as LcmsSequenceTable, LoadingSpinner_default as LoadingSpinner, MINTSdk, MINTSdk as default, MobileSupportGate_default as MobileSupportGate, MoleculeInput_default as MoleculeInput, MultiSelect_default as MultiSelect, NumberInput_default as NumberInput, PlateMapEditor_default as PlateMapEditor, PluginIcon_default as PluginIcon, PluginWorkspaceView_default as PluginWorkspaceView, ProgressBar_default as ProgressBar, ProtocolStepEditor_default as ProtocolStepEditor, RackEditor_default as RackEditor, ReagentEditor_default as ReagentEditor, ReagentList_default as ReagentList, ResourceCard_default as ResourceCard, SORT_OPTIONS, SampleHierarchyTree_default as SampleHierarchyTree, SampleLegend_default as SampleLegend, SampleSelector_default as SampleSelector, ScheduleCalendar_default as ScheduleCalendar, ScientificNumber_default as ScientificNumber, SegmentedControl_default as SegmentedControl, SequenceInput_default as SequenceInput, SequenceProgressBar_default as SequenceProgressBar, SettingsModal_default as SettingsModal, Skeleton_default as Skeleton, StatusIndicator_default as StatusIndicator, StepWizard_default as StepWizard, TEMPLATE_COLLECTION_KEY, TagsInput_default as TagsInput, ThemeToggle_default as ThemeToggle, TimePicker_default as TimePicker, TimeRangeInput_default as TimeRangeInput, Tooltip_default as Tooltip, UnitInput_default as UnitInput, WellPlate_default as WellPlate, addMinutes, assertTemplateEnvelope, basenameFromWindowsPath, bioTemplateCatalog, bioTemplateControlsToFormSchema, bioTemplateControlsToSectionFormSchemas, bioTemplateControlsToSidebarPanels, bioTemplatePacks, bioTemplatePresetControlValuesToOptions, bioTemplatePresets, buildPluginEndpointUrl, canAccessAdmin, canAccessByPolicy, canAccessPlugin, candidateMatchesSearch, colorPalettes, compareSortValues, compareTime, controlValuesToComponentBindings, controlValuesToComponentBindingsById, controlValuesToComponentProps, controlsToFormSchema, controlsToSectionFormSchema, controlsToSectionFormSchemas, controlsToSettingsSchema, controlsToSidebarPanels, controlsToTopBarSettingsConfig, controlsToViewIds, controlsToViewItems, coordinateToWellId, createAssayMatrixTemplate, createBioTemplateControlToolkit, createBioTemplatePackCollection, createBioTemplatePresetCollection, createBioTemplatePresetCollectionFromControls, createCalibrationCurveTemplate, createColumnConditions, createDefaultBioTemplate, createDoseResponseTemplate, createElisaAssayCollection, createFlowCytometryAssayCollection, createFlowCytometryPanelTemplate, createInstrumentRunTemplate, createLcmsBatchCollection, createLcmsControlWellEditData, createPlateMapTemplate, createPluginClient, createPluginResourceClient, createProtocolStepsTemplate, createQpcrExpressionCollection, createQpcrPlateTemplate, createReagentListTemplate, createRowConditions, createSamplePrepTemplate, createSampleSheetTemplate, createTargetedMetabolomicsCollection, createTemplateCollection, createTemplateEnvelope, createTimeCourseTemplate, createWellPlateScreenCollection, createWellPlateWells, createWesternBlotAssayCollection, datePresetToISO, defineControlComponentBindings, defineControlModel, defineControls, defineDoseCalculatorControlProps, defineDoseDesignControlModel, defineWellPlateControlProps, defineWellPlateDoseComponentBindings, defineWellPlateDoseControlProps, deriveShade, detectDelimiter, downloadBlob, downloadPluginEndpoint, durationMinutes, ensureTemplateEnvelope, ensureTemplateFromCollection, estimateSequenceFinishDate, estimateSequenceRemainingSeconds, evaluateCondition, extractLcmsCommonPrefix, extractLcmsSampleName, extractSampleNamesFromDesignData, extractSampleOptionsFromDesignData, extractSamplesFromDesignData, extractTemplateCollection, findAvailableSlots, findNearestTimeSlotIndex, formatDuration, formatExperimentDate, formatExperimentStatus, formatSequenceEta, formatSequenceRemaining, formatTime, formatTimeSlot, fromMinutes, generateDilutionSeries, generateTimeSlots, getAccessAudience, getBioTemplateComponentBindings, getBioTemplateComponentProps, getBioTemplateControlDefaults, getBioTemplateControlSchema, getBioTemplateInfo, getBioTemplatePackInfo, getBioTemplatePresetInfo, getControlDefaults, getDefaultControlView, getExperimentStatusVariant, getFieldRegistryEntry, getLcmsDefaultControlWellId, getPluginPageSelectorItems, getRoleInfo, getTemplateData, getTypeDefault, getUserPermissions, hasAllPermissions, hasAnyPermission, hexToHsl, hslToHex, inferLcmsPlateTypeFromWellIds, isAdminRole, isAdminUser, isTimeInRange, lcmsPlateCellsToRack, lcmsPlateCellsToRacks, lcmsPlateTypeToRackFormat, lcmsWellId, lcmsWellIdFromPosition, listBioTemplateCatalog, listBioTemplateComponentBindings, listBioTemplateControlSchemas, listBioTemplatePacks, listBioTemplatePresetControlSchemas, listBioTemplatePresets, normalizeAccessPolicy, normalizeSearchQuery, parseDelimitedText, parseLcmsWellId, parseTime, pluginFormDataFromPayload, rackFormatToLcmsPlateType, rackToLcmsPlateCells, racksToLcmsPlateCells, rangesOverlap, readFileAsText, reconstructLcmsPlateCellsFromSequenceItems, requireBioTemplateControlSchema, resolveExperimentCode, resolvePluginBaseUrl, runWellPlateValidation, searchBioTemplateCatalog, searchBioTemplatePacks, searchBioTemplatePresets, sequenceProgressPercent, sequenceSamplesRemaining, snapToSlot, toAssayMatrixColumns, toAssayMatrixDataFrame, toAssayMatrixRows, toAssayMatrixSampleOptions, toBioTemplateComponentBindings, toBioTemplateComponentBindingsById, toBioTemplateComponentImports, toBioTemplateComponentProps, toBioTemplateComponentPropsByComponent, toBioTemplateComponentPropsById, toBioTemplateComponentSnippets, toBioTemplateComponentUsage, toCalibrationCurveColumns, toCalibrationCurveDataFrame, toCalibrationCurveRows, toDoseConditions, toDoseLayoutState, toFlowPanelColumns, toFlowPanelDataFrame, toFlowPanelRows, toInstrumentRunColumns, toInstrumentRunDataFrame, toInstrumentRunRows, toInstrumentRunScheduleEvents, toInstrumentRunSteps, toMinutes, toPlateMapEditorState, toProtocolColumns, toProtocolDataFrame, toProtocolRows, toProtocolSteps, toQpcrColumns, toQpcrDataFrame, toQpcrRows, toQpcrWellPlateWells, toReagentColumns, toReagentDataFrame, toReagentListItems, toReagentRows, toSampleColumns, toSampleDataFrame, toSampleOptions, toSamplePrepColumns, toSamplePrepDataFrame, toSamplePrepRows, toSampleRows, toTemplateDataFrame, toTimeCourseColumns, toTimeCourseDataFrame, toTimeCourseRows, toTimeCourseSteps, toWellMapArray, toWellPlateWells, unwrapExperimentDesignData, uploadPluginEndpoint, useApi, useAppExperiment, useAsync, useAsyncBatch, useAuth, useAuthStore, useAutoGroup, useBioTemplateComponents, useBioTemplateControls, useBioTemplatePackWorkspace, useBioTemplatePresetWorkspace, useBioTemplateWorkspace, useChemicalFormula, useCommandHistory, useConcentrationUnits, useControlSchema, useControlWorkspace, useCurrentExperiment, useDebouncedWatch, useDoseCalculator, useEventListener, useExpansionSet, useExperimentData, useExperimentSamples, useExperimentSave, useExperimentSelector, useFileImport, useForm, useFormBuilder, useGroupAssignment, useListSelection, useMobileSupportGate, useOptimisticMutation, usePasskey, usePlatformContext, usePluginClient, usePluginConfig, usePluginEventStream, usePluginSettings, useProtocolTemplates, useRackEditor, useReagentSeries, useRequestSyncState, useResourceCrud, useSampleGroups, useScheduleDrag, useSelectionLimit, useSequenceUtils, useSettingsStore, useSortedItems, useTemplateCollection, useTextSearch, useTheme, useTimeUtils, useToast, useWellPainting, useWellPlateAdapter, useWellPlateEditor, useWellPlateValidation, validateAssayMatrixData, validateCalibrationCurveData, validateDoseResponseData, validateFlowCytometryPanelData, validateImportFile, validateInstrumentRunData, validatePlateMapData, validateProtocolStepsData, validateQpcrPlateData, validateReagentListData, validateSamplePrepData, validateSampleSheetData, validateTimeCourseData, wellIdToCoordinate, wellIdsInRectangle };
181
181
 
182
182
  //# sourceMappingURL=index.js.map
package/dist/install.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as components_exports } from "./components-CJ2--4Ex.js";
1
+ import { t as components_exports } from "./components-BGVwavdd.js";
2
2
  import "./BaseButton-Dgqrze41.js";
3
3
  import "./BaseSelect-ekgr9fDo.js";
4
4
  import "./useControlSchema-BZNdalmL.js";
package/dist/styles.css CHANGED
@@ -2857,10 +2857,9 @@
2857
2857
  background-color: var(--bg-secondary);
2858
2858
  color: var(--text-secondary-strong);
2859
2859
  border: 1px solid var(--border-color);
2860
- /* Intentionally tighter + fainter than the colored variants
2861
- secondary shouldn't "float" the way filled buttons do. Regular (400)
2862
- weight de-emphasizes the label relative to the medium-weight filled variants. */
2863
- font-weight: 400;
2860
+ /* Secondary is lower-emphasis through surface, border, and shadow, but keeps
2861
+ medium label weight so it still reads as an actionable button. */
2862
+ font-weight: 500;
2864
2863
  box-shadow: 0 1px 1px rgba(15, 23, 42, 0.03);
2865
2864
  }
2866
2865
  .mint-button--secondary:hover:not(.mint-button--disabled) {
@@ -2897,7 +2896,7 @@
2897
2896
  .mint-button--ghost {
2898
2897
  background-color: transparent;
2899
2898
  color: var(--text-secondary-strong);
2900
- /* Lowest-emphasis variant: regular (400) weight, matching secondary. */
2899
+ /* Lowest-emphasis variant: regular (400) weight, below secondary. */
2901
2900
  font-weight: 400;
2902
2901
  }
2903
2902
  .mint-button--ghost:hover:not(.mint-button--disabled) {
@@ -2913,6 +2912,9 @@
2913
2912
  font-weight: 400;
2914
2913
  min-height: var(--form-height-sm);
2915
2914
  }
2915
+ .mint-button--secondary.mint-button--sm {
2916
+ font-weight: 500;
2917
+ }
2916
2918
  .mint-button--md {
2917
2919
  padding: 0.5rem 1rem;
2918
2920
  font-size: 0.875rem;
@@ -7106,10 +7108,9 @@ to {
7106
7108
  }
7107
7109
  .mint-page-selector__item-label {
7108
7110
  flex: 1;
7109
- }
7110
- .mint-page-selector__item-hint {
7111
- font-size: 0.65625rem;
7112
- color: var(--text-muted);
7111
+ min-width: 0;
7112
+ overflow: hidden;
7113
+ text-overflow: ellipsis;
7113
7114
  white-space: nowrap;
7114
7115
  }
7115
7116
  /* AppTopBar pillNav — centered top-level navigation pills */
@@ -19902,10 +19903,9 @@ code, pre {
19902
19903
  background-color: var(--bg-secondary);
19903
19904
  color: var(--text-secondary-strong);
19904
19905
  border: 1px solid var(--border-color);
19905
- /* Intentionally tighter + fainter than the colored variants
19906
- secondary shouldn't "float" the way filled buttons do. Regular (400)
19907
- weight de-emphasizes the label relative to the medium-weight filled variants. */
19908
- font-weight: 400;
19906
+ /* Secondary is lower-emphasis through surface, border, and shadow, but keeps
19907
+ medium label weight so it still reads as an actionable button. */
19908
+ font-weight: 500;
19909
19909
  box-shadow: 0 1px 1px rgba(15, 23, 42, 0.03);
19910
19910
  }
19911
19911
  .mint-button--secondary:hover:not(.mint-button--disabled) {
@@ -19942,7 +19942,7 @@ code, pre {
19942
19942
  .mint-button--ghost {
19943
19943
  background-color: transparent;
19944
19944
  color: var(--text-secondary-strong);
19945
- /* Lowest-emphasis variant: regular (400) weight, matching secondary. */
19945
+ /* Lowest-emphasis variant: regular (400) weight, below secondary. */
19946
19946
  font-weight: 400;
19947
19947
  }
19948
19948
  .mint-button--ghost:hover:not(.mint-button--disabled) {
@@ -19957,6 +19957,9 @@ code, pre {
19957
19957
  font-weight: 400;
19958
19958
  min-height: var(--form-height-sm);
19959
19959
  }
19960
+ .mint-button--secondary.mint-button--sm {
19961
+ font-weight: 500;
19962
+ }
19960
19963
  .mint-button--md {
19961
19964
  padding: 0.5rem 1rem;
19962
19965
  font-size: 0.875rem;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@morscherlab/mint-sdk",
3
- "version": "1.0.41",
3
+ "version": "1.0.43",
4
4
  "description": "MINT Platform SDK — Vue 3 components, composables, and types for plugin development. MINT = Mass-spec INtegrated Toolkit.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -26,18 +26,17 @@ describe('AppTopBar navigation helpers', () => {
26
26
  pluginNavItemToPageSelectorItem(
27
27
  { label: 'Results', path: 'results' },
28
28
  1,
29
- { pluginIcon: 'flask', pluginName: 'Assay Plugin' },
29
+ { pluginIcon: 'flask' },
30
30
  ),
31
31
  ).toEqual({
32
32
  id: 'results',
33
33
  label: 'Results',
34
34
  to: '/results',
35
35
  icon: 'flask',
36
- hint: 'Assay Plugin',
37
36
  })
38
37
  })
39
38
 
40
- it('prefers explicit nav item id, icon, and description', () => {
39
+ it('prefers explicit nav item id and icon without exposing descriptions as hints', () => {
41
40
  expect(
42
41
  pluginNavItemToPageSelectorItem(
43
42
  {
@@ -48,12 +47,11 @@ describe('AppTopBar navigation helpers', () => {
48
47
  description: 'Custom page',
49
48
  },
50
49
  0,
51
- { pluginIcon: 'flask', pluginName: 'Assay Plugin' },
50
+ { pluginIcon: 'flask' },
52
51
  ),
53
52
  ).toMatchObject({
54
53
  id: 'custom',
55
54
  icon: 'sparkles',
56
- hint: 'Custom page',
57
55
  })
58
56
  })
59
57
 
@@ -830,7 +830,7 @@ describe('AppTopBar', () => {
830
830
  const imageIcons = wrapper.findAll('.mint-plugin-icon__img')
831
831
  expect(imageIcons).toHaveLength(1)
832
832
  expect(imageIcons[0].attributes('src')).toBe(pngIcon)
833
- expect(wrapper.find('.mint-page-selector__item-hint').text()).toBe('Overview')
833
+ expect(wrapper.find('.mint-page-selector__item-hint').exists()).toBe(false)
834
834
  })
835
835
  })
836
836
 
@@ -1068,10 +1068,7 @@ describe('AppTopBar', () => {
1068
1068
  'Dashboard',
1069
1069
  'Analysis',
1070
1070
  ])
1071
- expect(wrapper.findAll('.mint-page-selector__item-hint').map(item => item.text())).toEqual([
1072
- 'Dose Designer',
1073
- 'Dose Designer',
1074
- ])
1071
+ expect(wrapper.find('.mint-page-selector__item-hint').exists()).toBe(false)
1075
1072
  const dropdownIcons = wrapper
1076
1073
  .findAllComponents({ name: 'PluginIcon' })
1077
1074
  .filter(icon => icon.classes().includes('mint-page-selector__metadata-icon'))
@@ -24,6 +24,28 @@ describe('AppTopBarPageSelectorInternal', () => {
24
24
  expect(wrapper.emitted('select')).toEqual([[{ id: 'Results', label: 'Results' }]])
25
25
  })
26
26
 
27
+ it('omits page hints from the menu for compact scanning', async () => {
28
+ const wrapper = mount(AppTopBarPageSelectorInternal, {
29
+ props: {
30
+ currentPageId: 'downloads',
31
+ pages: [
32
+ { id: 'downloads', label: 'Downloads', hint: 'Paste links and queue downloads' },
33
+ { id: 'settings', label: 'Settings', hint: 'Credentials and destination' },
34
+ ],
35
+ },
36
+ })
37
+
38
+ await wrapper.get('.mint-page-selector__trigger').trigger('click')
39
+
40
+ expect(wrapper.findAll('.mint-page-selector__item-label').map(item => item.text())).toEqual([
41
+ 'Downloads',
42
+ 'Settings',
43
+ ])
44
+ expect(wrapper.find('.mint-page-selector__item-hint').exists()).toBe(false)
45
+ expect(wrapper.text()).not.toContain('Paste links')
46
+ expect(wrapper.text()).not.toContain('Credentials')
47
+ })
48
+
27
49
  it('closes linked page actions without emitting select', async () => {
28
50
  const wrapper = mount(AppTopBarPageSelectorInternal, {
29
51
  props: {
@@ -146,6 +146,24 @@ describe('PluginWorkspaceView', () => {
146
146
  expect(wrapper.emitted('pill-select')).toEqual([[{ id: 'results', label: 'Results' }]])
147
147
  })
148
148
 
149
+ it('hides topbar page selector until multiple pages are registered', () => {
150
+ const wrapper = mount(PluginWorkspaceView, {
151
+ props: {
152
+ title: 'Downloader',
153
+ subtitle: 'Downloads',
154
+ pageSelector: [
155
+ { id: 'downloads', label: 'Downloads', to: '/' },
156
+ ],
157
+ currentPageSelectorId: 'downloads',
158
+ },
159
+ global: globalOptions,
160
+ })
161
+
162
+ expect(wrapper.findComponent(AppTopBar).props('pageSelector')).toBeUndefined()
163
+ expect(wrapper.find('.mint-page-selector').exists()).toBe(false)
164
+ expect(wrapper.find('.mint-topbar-title-group').text()).toContain('Downloader')
165
+ })
166
+
149
167
  it('passes compact control models to the sidebar for generated forms', () => {
150
168
  const wrapper = mount(PluginWorkspaceView, {
151
169
  props: {
@@ -12,9 +12,12 @@ import {
12
12
  resolvePluginBaseUrl,
13
13
  uploadPluginEndpoint,
14
14
  useCurrentExperiment,
15
+ usePluginEventStream,
15
16
  usePluginClient,
17
+ usePluginSettings,
16
18
  type PluginContract,
17
19
  } from '../../composables/usePluginClient'
20
+ import { useAuthStore } from '../../stores/auth'
18
21
 
19
22
  const contract: PluginContract = {
20
23
  schemaVersion: 1,
@@ -32,6 +35,8 @@ describe('usePluginClient', () => {
32
35
  let requestBodies: unknown[] = []
33
36
  let nextGetError: Error | null = null
34
37
  let nextGetData: unknown
38
+ let nextPatchData: unknown
39
+ let nextPutData: unknown
35
40
 
36
41
  beforeEach(() => {
37
42
  setActivePinia(createPinia())
@@ -39,6 +44,8 @@ describe('usePluginClient', () => {
39
44
  requestBodies = []
40
45
  nextGetError = null
41
46
  nextGetData = undefined
47
+ nextPatchData = undefined
48
+ nextPutData = undefined
42
49
  vi.spyOn(axios.Axios.prototype, 'get').mockImplementation(async function (
43
50
  this: unknown,
44
51
  url: string,
@@ -58,6 +65,26 @@ describe('usePluginClient', () => {
58
65
  requestBodies.push(data)
59
66
  return { data: { called: url } }
60
67
  })
68
+ vi.spyOn(axios.Axios.prototype, 'patch').mockImplementation(async function (
69
+ this: unknown,
70
+ url: string,
71
+ data?: unknown,
72
+ config?: AxiosRequestConfig,
73
+ ) {
74
+ requestConfigs.push({ url, ...config })
75
+ requestBodies.push(data)
76
+ return { data: nextPatchData ?? { called: url } }
77
+ })
78
+ vi.spyOn(axios.Axios.prototype, 'put').mockImplementation(async function (
79
+ this: unknown,
80
+ url: string,
81
+ data?: unknown,
82
+ config?: AxiosRequestConfig,
83
+ ) {
84
+ requestConfigs.push({ url, ...config })
85
+ requestBodies.push(data)
86
+ return { data: nextPutData ?? { called: url } }
87
+ })
61
88
  vi.spyOn(axios.Axios.prototype, 'delete').mockImplementation(async function (
62
89
  this: unknown,
63
90
  url: string,
@@ -353,21 +380,18 @@ describe('usePluginClient', () => {
353
380
  label: 'Dashboard',
354
381
  to: '/',
355
382
  icon: 'DASHBOARD_ICON',
356
- hint: 'Overview',
357
383
  },
358
384
  {
359
385
  id: 'dose-design',
360
386
  label: 'Dose Design',
361
387
  to: '/dose-design',
362
388
  icon: 'PLUGIN_ICON',
363
- hint: 'Dose Designer',
364
389
  },
365
390
  {
366
391
  id: 'qc-review',
367
392
  label: 'QC Review',
368
393
  to: '/qc/review',
369
394
  icon: 'QC_ICON',
370
- hint: 'Dose Designer',
371
395
  },
372
396
  ])
373
397
  expect(requestConfigs).toHaveLength(0)
@@ -396,6 +420,108 @@ describe('usePluginClient', () => {
396
420
  expect(requestConfigs).toHaveLength(0)
397
421
  })
398
422
 
423
+ it('loads and saves plugin settings through the integrated platform config endpoint', async () => {
424
+ ;(window as unknown as { __MINT_PLATFORM__?: unknown }).__MINT_PLATFORM__ = {
425
+ isIntegrated: true,
426
+ theme: 'light',
427
+ platformApiUrl: '/api',
428
+ plugin: {
429
+ id: 'drp',
430
+ name: 'drp',
431
+ version: '1.0.0',
432
+ route_prefix: '/drp',
433
+ api_prefix: '/api/drp',
434
+ },
435
+ }
436
+ nextGetData = { plugin_name: 'drp', config: { nasBasePath: '/data' } }
437
+ nextPatchData = { plugin_name: 'drp', config: { nasBasePath: '/mnt' } }
438
+
439
+ const settings = usePluginSettings<{ nasBasePath?: string }>({ pluginName: 'drp' })
440
+ await settings.load()
441
+
442
+ expect(requestConfigs[0]!.baseURL).toBe('/api')
443
+ expect(requestConfigs[0]!.url).toBe('/plugins/drp/config')
444
+ expect(settings.values.value).toEqual({ nasBasePath: '/data' })
445
+ expect(settings.settings.value).toEqual({ nasBasePath: '/data' })
446
+ expect(settings.isDirty.value).toBe(false)
447
+
448
+ settings.setValues({ nasBasePath: '/mnt' })
449
+ expect(settings.isDirty.value).toBe(true)
450
+ const ok = await settings.save()
451
+
452
+ expect(ok).toBe(true)
453
+ expect(requestConfigs[1]!.baseURL).toBe('/api')
454
+ expect(requestConfigs[1]!.url).toBe('/plugins/drp/config')
455
+ expect(requestBodies[0]).toEqual({ config: { nasBasePath: '/mnt' } })
456
+ expect(settings.values.value).toEqual({ nasBasePath: '/mnt' })
457
+ expect(settings.isDirty.value).toBe(false)
458
+ })
459
+
460
+ it('loads and saves plugin settings through the standalone settings router', async () => {
461
+ nextGetData = { settings: { nas_base_path: '/data' }, mode: 'standalone' }
462
+ nextPutData = { settings: { nas_base_path: '/mnt' }, mode: 'standalone' }
463
+
464
+ const settings = usePluginSettings<{ nas_base_path?: string }>({
465
+ apiBaseUrl: '/api/drp',
466
+ loadOnMount: false,
467
+ })
468
+ await settings.load()
469
+ const ok = await settings.save({ nas_base_path: '/mnt' })
470
+
471
+ expect(ok).toBe(true)
472
+ expect(requestConfigs[0]!.baseURL).toBe('/api/drp')
473
+ expect(requestConfigs[0]!.url).toBe('/settings')
474
+ expect(requestConfigs[1]!.baseURL).toBe('/api/drp')
475
+ expect(requestConfigs[1]!.url).toBe('/settings')
476
+ expect(requestBodies[0]).toEqual({ nas_base_path: '/mnt' })
477
+ expect(settings.settingsConfig.value.values).toEqual({ nas_base_path: '/mnt' })
478
+ })
479
+
480
+ it('streams plugin events with auth headers and SSE parsing', async () => {
481
+ const authStore = useAuthStore()
482
+ authStore.setToken('stream-token', 3600)
483
+ const onMessage = vi.fn()
484
+ const streamBody = new ReadableStream({
485
+ start(controller) {
486
+ controller.enqueue(new TextEncoder().encode('event: progress\nid: 7\ndata: {"pct":50}\n\n'))
487
+ controller.close()
488
+ },
489
+ })
490
+ const fetchMock = vi.fn(async (_url: RequestInfo | URL, _init?: RequestInit) =>
491
+ new Response(streamBody, { status: 200 }),
492
+ )
493
+ vi.stubGlobal('fetch', fetchMock)
494
+
495
+ const stream = usePluginEventStream<{ pct: number }>(
496
+ contract,
497
+ { method: 'get', path: '/downloads/events' },
498
+ {
499
+ parseJson: true,
500
+ reconnect: false,
501
+ onMessage,
502
+ },
503
+ )
504
+
505
+ await vi.waitFor(() => {
506
+ expect(onMessage).toHaveBeenCalledOnce()
507
+ })
508
+
509
+ expect(fetchMock).toHaveBeenCalledOnce()
510
+ const [url, init] = fetchMock.mock.calls[0]!
511
+ expect(url).toBe('/api/drp/downloads/events')
512
+ expect((init?.headers as Headers).get('Authorization')).toBe('Bearer stream-token')
513
+ expect((init?.headers as Headers).get('Accept')).toBe('text/event-stream')
514
+ expect(onMessage).toHaveBeenCalledWith({
515
+ event: 'progress',
516
+ data: { pct: 50 },
517
+ id: '7',
518
+ retry: undefined,
519
+ raw: 'event: progress\nid: 7\ndata: {"pct":50}',
520
+ })
521
+ expect(stream.lastMessage.value?.data).toEqual({ pct: 50 })
522
+ expect(stream.lastEventId.value).toBe('7')
523
+ })
524
+
399
525
  it('can build path-only endpoint URLs with inferred experiment ids', () => {
400
526
  window.history.replaceState({}, '', '/experiments/42/plugins/drp')
401
527
 
@@ -3,7 +3,6 @@ import type { PluginNavItem } from '../types/platform'
3
3
 
4
4
  export interface PluginNavPageSelectorOptions {
5
5
  pluginIcon?: string
6
- pluginName?: string
7
6
  }
8
7
 
9
8
  export function normalizeNavPath(path?: string): string {
@@ -29,7 +28,6 @@ export function pluginNavItemToPageSelectorItem(
29
28
  label: item.label,
30
29
  to: path,
31
30
  icon: item.icon || options.pluginIcon,
32
- hint: item.description || options.pluginName,
33
31
  }
34
32
  }
35
33
 
@@ -18,11 +18,11 @@ const samplePillNav: PillNavItem[] = [
18
18
  ]
19
19
 
20
20
  const samplePageSelector: PageSelectorItem[] = [
21
- { id: 'workspace', label: 'Workspace', hint: 'Home' },
22
- { id: 'experiments', label: 'Experiments', hint: '28 mine · 142 total' },
23
- { id: 'projects', label: 'Projects', hint: '12 projects' },
24
- { id: 'plugins', label: 'Plugins', hint: '4 installed' },
25
- { id: 'admin', label: 'Admin', hint: 'Platform settings' },
21
+ { id: 'workspace', label: 'Workspace' },
22
+ { id: 'experiments', label: 'Experiments' },
23
+ { id: 'projects', label: 'Projects' },
24
+ { id: 'plugins', label: 'Plugins' },
25
+ { id: 'admin', label: 'Admin' },
26
26
  ]
27
27
 
28
28
  // Theme is now surfaced as a top-level icon button (show-theme-toggle),
@@ -160,7 +160,6 @@ const platformPageSelector = computed<PageSelectorItem[]>(() =>
160
160
  ? plugin.value?.nav_items?.map((item, index) =>
161
161
  pluginNavItemToPageSelectorItem(item, index, {
162
162
  pluginIcon: plugin.value?.icon,
163
- pluginName: plugin.value?.name,
164
163
  })
165
164
  ) ?? []
166
165
  : [],
@@ -208,6 +208,10 @@ const {
208
208
  emitPillSelect: (item) => emit('pill-select', item),
209
209
  })
210
210
 
211
+ const visiblePageSelector = computed(() =>
212
+ (props.pageSelector?.length ?? 0) > 1 ? props.pageSelector : undefined,
213
+ )
214
+
211
215
  const hasSidebarSurface = computed(() => {
212
216
  return hasPluginWorkspaceSidebarSurface({
213
217
  showSidebar: props.showSidebar,
@@ -270,7 +274,7 @@ function handleFormCancel(sectionId: string) {
270
274
  :variant="topBarVariant"
271
275
  :home-path="homePath"
272
276
  :show-logo="showLogo"
273
- :page-selector="pageSelector"
277
+ :page-selector="visiblePageSelector"
274
278
  :current-page-selector-id="resolvedCurrentPageSelectorId"
275
279
  :plugin-switcher="pluginSwitcher"
276
280
  :pill-nav="resolvedPillNav"
@@ -117,7 +117,6 @@ function handleSelect(page: PageSelectorItem) {
117
117
  </slot>
118
118
  </span>
119
119
  <span class="mint-page-selector__item-label">{{ page.label }}</span>
120
- <span v-if="page.hint" class="mint-page-selector__item-hint">{{ page.hint }}</span>
121
120
  </ActionItemInternal>
122
121
  </div>
123
122
  </div>
@@ -445,6 +445,7 @@ export {
445
445
  resolvePluginBaseUrl,
446
446
  uploadPluginEndpoint,
447
447
  usePluginClient,
448
+ usePluginEventStream,
448
449
  usePluginSettings,
449
450
  useCurrentExperiment,
450
451
  type BuildPluginEndpointUrlOptions,
@@ -456,9 +457,14 @@ export {
456
457
  type PluginHttpMethod,
457
458
  type PluginNavItemContract,
458
459
  type PluginEndpointRequestOptions,
460
+ type PluginEventStreamMessage,
461
+ type PluginEventStreamOptions,
459
462
  type PluginFormDataPayload,
460
463
  type PluginFormDataValue,
461
464
  type CreatePluginClientOptions,
462
465
  type UseCurrentExperimentOptions,
463
466
  type UseCurrentExperimentReturn,
467
+ type UsePluginEventStreamReturn,
468
+ type UsePluginSettingsOptions,
469
+ type UsePluginSettingsReturn,
464
470
  } from './usePluginClient'