@morscherlab/mint-sdk 1.2.0-beta.7 → 1.2.0-beta.9
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/README.md +30 -0
- package/dist/{ExperimentPopover-CfOdh5Rm.js → ExperimentPopover-oL0fg_A0.js} +5 -3
- package/dist/ExperimentPopover-oL0fg_A0.js.map +1 -0
- package/dist/{ExperimentSelectorModal-DvIagrxY.js → ExperimentSelectorModal-BeEOomw_.js} +4 -4
- package/dist/ExperimentSelectorModal-BeEOomw_.js.map +1 -0
- package/dist/{SettingsModal-W3TYfnP9.js → SettingsModal-Dphh3RrI.js} +4 -4
- package/dist/SettingsModal-Dphh3RrI.js.map +1 -0
- package/dist/{EmptyState-NBqf2_8z.js → Skeleton-DxtwJ5gt.js} +110 -92
- package/dist/Skeleton-DxtwJ5gt.js.map +1 -0
- package/dist/__tests__/components/ExperimentTimeline.test.d.ts +1 -0
- package/dist/__tests__/composables/useListReorder.test.d.ts +1 -0
- package/dist/__tests__/styles/cssTokens.test.d.ts +1 -0
- package/dist/components/ActionMenu.vue.d.ts +1 -1
- package/dist/components/AppPluginSwitcher.vue.d.ts +2 -0
- package/dist/components/AuditTrail.vue.d.ts +13 -0
- package/dist/components/BatchProgressList.vue.d.ts +17 -0
- package/dist/components/DataFrame.vue.d.ts +14 -2
- package/dist/components/DatePicker.vue.d.ts +1 -1
- package/dist/components/DateTimePicker.vue.d.ts +2 -0
- package/dist/components/ExperimentDataViewer.vue.d.ts +26 -1
- package/dist/components/ExperimentPopover.vue.d.ts +1 -0
- package/dist/components/ExperimentTimeline.vue.d.ts +29 -1
- package/dist/components/LcmsSequenceTable.vue.d.ts +29 -1
- package/dist/components/ProgressBar.vue.d.ts +1 -1
- package/dist/components/ProtocolStepEditor.vue.d.ts +1 -0
- package/dist/components/ReagentList.vue.d.ts +29 -1
- package/dist/components/SampleHierarchyTree.vue.d.ts +29 -1
- package/dist/components/SampleSelector.drag.d.ts +13 -0
- package/dist/components/SampleSelector.tree.d.ts +2 -0
- package/dist/components/SampleSelector.vue.d.ts +34 -1
- package/dist/components/ScheduleCalendar.vue.d.ts +20 -0
- package/dist/components/SmartGroupFieldRecipe.vue.d.ts +1 -0
- package/dist/components/TimePicker.vue.d.ts +1 -0
- package/dist/components/WellPlate.geometry.d.ts +15 -0
- package/dist/components/WellPlate.interaction.d.ts +13 -0
- package/dist/components/WellPlate.vue.d.ts +29 -0
- package/dist/components/index.js +6 -6
- package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +2 -0
- package/dist/components/internal/DataStateInternal.vue.d.ts +43 -0
- package/dist/{components-B80gV0P6.js → components-CgAUzF8F.js} +1930 -1688
- package/dist/components-CgAUzF8F.js.map +1 -0
- package/dist/composables/controlSchemaTypes.d.ts +34 -0
- package/dist/composables/index.d.ts +1 -0
- package/dist/composables/index.js +9 -9
- package/dist/composables/useDropdownState.d.ts +18 -2
- package/dist/composables/useEventStream.d.ts +9 -0
- package/dist/composables/useListReorder.d.ts +90 -0
- package/dist/composables/useMenuKeyboard.d.ts +2 -2
- package/dist/composables/usePluginConfig.d.ts +3 -1
- package/dist/composables/useRequestSyncState.d.ts +42 -2
- package/dist/composables/useScheduleDrag.d.ts +1 -0
- package/dist/{composables-C8mmD5ta.js → composables-B_pia3hO.js} +13 -69
- package/dist/composables-B_pia3hO.js.map +1 -0
- package/dist/{useApi-CDBq6z23.js → errors-_W0-LbA6.js} +102 -3
- package/dist/errors-_W0-LbA6.js.map +1 -0
- package/dist/{experiment-Y9Iz7KYi.js → experiment-Cwl9AYxw.js} +3 -8
- package/dist/experiment-Cwl9AYxw.js.map +1 -0
- package/dist/experiment-utils-DV3DrvE_.js.map +1 -1
- package/dist/index.js +14 -14
- package/dist/install.js +2 -7
- package/dist/install.js.map +1 -1
- package/dist/permissions.d.ts +42 -1
- package/dist/permissions.js +20 -10
- package/dist/permissions.js.map +1 -1
- package/dist/stores/index.d.ts +1 -1
- package/dist/stores/index.js +3 -3
- package/dist/stores/settings.d.ts +31 -1
- package/dist/styles.css +9572 -27877
- package/dist/templates/index.js +2 -4
- package/dist/{templates-CK72aKO1.js → templates-Qq113pyZ.js} +291 -85
- package/dist/templates-Qq113pyZ.js.map +1 -0
- package/dist/{useControlSchema-_OVhavKq.js → useControlSchema-aMZlb4Sc.js} +197 -1089
- package/dist/useControlSchema-aMZlb4Sc.js.map +1 -0
- package/dist/{useDropdownState-D5G4UvWd.js → useDropdownState-DitCtrTT.js} +21 -5
- package/dist/useDropdownState-DitCtrTT.js.map +1 -0
- package/dist/{useExperimentSelector-DSEckf_g.js → useExperimentSelector-I8HC8hUu.js} +3 -3
- package/dist/{useExperimentSelector-DSEckf_g.js.map → useExperimentSelector-I8HC8hUu.js.map} +1 -1
- package/dist/{useFormBuilder-Bd714C7y.js → useFormBuilder-TCxNnqeb.js} +2 -2
- package/dist/{useFormBuilder-Bd714C7y.js.map → useFormBuilder-TCxNnqeb.js.map} +1 -1
- package/dist/{useProtocolTemplates-Dq5Pzwyd.js → useProtocolTemplates-BmX_iVBR.js} +185 -157
- package/dist/useProtocolTemplates-BmX_iVBR.js.map +1 -0
- package/dist/utils/color.d.ts +13 -0
- package/dist/utils/errors.d.ts +9 -0
- package/package.json +1 -1
- package/src/__tests__/components/ActionMenu.test.ts +94 -0
- package/src/__tests__/components/DataFrame.test.ts +183 -11
- package/src/__tests__/components/DataStates.test.ts +176 -0
- package/src/__tests__/components/DatePicker.test.ts +76 -0
- package/src/__tests__/components/DateTimePicker.test.ts +36 -0
- package/src/__tests__/components/ExperimentTimeline.test.ts +63 -0
- package/src/__tests__/components/GroupAssigner.test.ts +53 -0
- package/src/__tests__/components/LcmsSequenceTable.test.ts +22 -0
- package/src/__tests__/components/RackEditor.test.ts +35 -0
- package/src/__tests__/components/ReagentList.test.ts +64 -2
- package/src/__tests__/components/RetiredStyles.test.ts +31 -0
- package/src/__tests__/components/SampleSelector.drag.test.ts +51 -1
- package/src/__tests__/components/ScheduleCalendar.test.ts +63 -0
- package/src/__tests__/components/SegmentedControl.test.ts +88 -0
- package/src/__tests__/components/TimePicker.test.ts +61 -0
- package/src/__tests__/components/WellPlate.interaction.test.ts +59 -0
- package/src/__tests__/composables/useDropdownState.test.ts +58 -1
- package/src/__tests__/composables/useListReorder.test.ts +145 -0
- package/src/__tests__/composables/useRequestSyncState.test.ts +140 -0
- package/src/__tests__/stores/settings.test.ts +71 -1
- package/src/__tests__/styles/cssTokens.test.ts +131 -0
- package/src/__tests__/utils/permissions.test.ts +68 -0
- package/src/components/ActionMenu.vue +45 -88
- package/src/components/AlertBox.vue +0 -4
- package/src/components/AppAvatarMenu.vue +2 -14
- package/src/components/AppLayout.vue +0 -4
- package/src/components/AppPluginSwitcher.story.vue +87 -0
- package/src/components/AppPluginSwitcher.vue +2 -5
- package/src/components/AppSidebar.vue +0 -4
- package/src/components/AppToastContainer.vue +6 -8
- package/src/components/AppTopBar.vue +0 -4
- package/src/components/ArtifactSaveDialog.vue +0 -4
- package/src/components/ArtifactSelectorModal.vue +0 -4
- package/src/components/AuditTrail.story.vue +18 -0
- package/src/components/AuditTrail.vue +27 -7
- package/src/components/AutoGroupModal.vue +0 -4
- package/src/components/Avatar.vue +0 -4
- package/src/components/BaseButton.vue +0 -4
- package/src/components/BaseCheckbox.vue +0 -4
- package/src/components/BaseInput.vue +0 -4
- package/src/components/BaseModal.vue +0 -4
- package/src/components/BasePill.vue +0 -4
- package/src/components/BaseRadioGroup.vue +0 -4
- package/src/components/BaseSelect.vue +0 -4
- package/src/components/BaseSlider.vue +0 -4
- package/src/components/BaseTabs.vue +0 -4
- package/src/components/BaseTextarea.vue +0 -4
- package/src/components/BaseToggle.vue +0 -4
- package/src/components/BatchProgressList.story.vue +18 -0
- package/src/components/BatchProgressList.vue +32 -4
- package/src/components/Breadcrumb.vue +0 -4
- package/src/components/Calendar.vue +0 -4
- package/src/components/ChartContainer.story.vue +1 -1
- package/src/components/ChartContainer.vue +0 -4
- package/src/components/ChemicalFormula.vue +0 -4
- package/src/components/CollapsibleCard.vue +0 -4
- package/src/components/ColorSlider.vue +0 -4
- package/src/components/ConcentrationInput.vue +0 -4
- package/src/components/ConfirmDialog.vue +0 -4
- package/src/components/DataFrame.story.vue +14 -0
- package/src/components/DataFrame.vue +97 -23
- package/src/components/DatePicker.vue +73 -27
- package/src/components/DateTimePicker.vue +45 -17
- package/src/components/Divider.vue +0 -4
- package/src/components/DoseCalculator.vue +0 -4
- package/src/components/DropdownButton.vue +2 -14
- package/src/components/EmptyState.vue +0 -4
- package/src/components/ExperimentCodeBadge.vue +0 -4
- package/src/components/ExperimentDataViewer.story.vue +3 -0
- package/src/components/ExperimentDataViewer.vue +33 -13
- package/src/components/ExperimentPopover.vue +2 -5
- package/src/components/ExperimentSelectorModal.vue +0 -4
- package/src/components/ExperimentTimeline.story.vue +18 -0
- package/src/components/ExperimentTimeline.vue +81 -75
- package/src/components/FileUploader.vue +0 -4
- package/src/components/FitPanel.vue +0 -4
- package/src/components/FormActions.story.vue +96 -0
- package/src/components/FormActions.vue +0 -4
- package/src/components/FormBuilder.vue +0 -4
- package/src/components/FormField.vue +0 -4
- package/src/components/FormulaInput.vue +0 -4
- package/src/components/GeneratedPathInput.story.vue +68 -0
- package/src/components/GeneratedPlotlyResult.story.vue +96 -0
- package/src/components/GeneratedPlotlyResult.vue +3 -3
- package/src/components/GeneratedPluginView.story.vue +145 -0
- package/src/components/GeneratedPluginView.vue +10 -10
- package/src/components/GeneratedResultRenderer.story.vue +117 -0
- package/src/components/GeneratedResultRenderer.vue +4 -4
- package/src/components/GroupAssigner.vue +67 -5
- package/src/components/IconButton.vue +0 -4
- package/src/components/InstrumentAlertLog.vue +0 -4
- package/src/components/InstrumentStateBadge.vue +0 -4
- package/src/components/InstrumentStatusCard.vue +0 -4
- package/src/components/JobsStatusTray.vue +0 -4
- package/src/components/LcmsSequenceTable.vue +81 -50
- package/src/components/LoadingSpinner.vue +0 -4
- package/src/components/MobileSupportGate.vue +0 -4
- package/src/components/MoleculeInput.vue +0 -4
- package/src/components/MultiSelect.vue +0 -4
- package/src/components/NumberInput.vue +0 -4
- package/src/components/PlateMapEditor.vue +3 -14
- package/src/components/PluginIcon.vue +0 -4
- package/src/components/ProgressBar.vue +0 -4
- package/src/components/ProtocolStepEditor.vue +2 -4
- package/src/components/RackEditor.vue +51 -70
- package/src/components/ReagentEditor.vue +0 -4
- package/src/components/ReagentList.story.vue +18 -0
- package/src/components/ReagentList.vue +127 -82
- package/src/components/ResourceCard.vue +0 -4
- package/src/components/RuntimeUpdateNotice.story.vue +49 -0
- package/src/components/RuntimeUpdateNotice.vue +4 -4
- package/src/components/SampleHierarchyTree.story.vue +18 -0
- package/src/components/SampleHierarchyTree.vue +32 -9
- package/src/components/SampleLegend.vue +2 -8
- package/src/components/SampleSelector.drag.ts +51 -0
- package/src/components/SampleSelector.story.vue +6 -0
- package/src/components/SampleSelector.tree.ts +2 -0
- package/src/components/SampleSelector.vue +49 -10
- package/src/components/SampleSelectorGroupNode.vue +19 -0
- package/src/components/ScheduleCalendar.story.vue +6 -0
- package/src/components/ScheduleCalendar.vue +82 -7
- package/src/components/ScientificNumber.vue +0 -4
- package/src/components/SectionCard.vue +0 -4
- package/src/components/SegmentedControl.vue +48 -5
- package/src/components/SequenceInput.vue +0 -4
- package/src/components/SequenceProgressBar.story.vue +110 -0
- package/src/components/SequenceProgressBar.vue +0 -4
- package/src/components/SettingsModal.vue +0 -4
- package/src/components/Skeleton.vue +0 -4
- package/src/components/SmartGroupFieldRecipe.vue +8 -6
- package/src/components/SmartGroupManual.vue +0 -4
- package/src/components/StatusIndicator.vue +0 -4
- package/src/components/StepWizard.vue +0 -4
- package/src/components/TagsInput.vue +4 -6
- package/src/components/ThemeToggle.vue +0 -4
- package/src/components/TimePicker.vue +36 -7
- package/src/components/TimeRangeInput.vue +0 -4
- package/src/components/Tooltip.story.vue +3 -3
- package/src/components/Tooltip.vue +0 -4
- package/src/components/UnitInput.vue +0 -4
- package/src/components/WellPlate.geometry.ts +60 -1
- package/src/components/WellPlate.interaction.ts +44 -0
- package/src/components/WellPlate.story.vue +8 -0
- package/src/components/WellPlate.vue +53 -7
- package/src/components/internal/AppTopBarPageSelectorInternal.vue +2 -5
- package/src/components/internal/AppTopBarPillNavInternal.vue +0 -4
- package/src/components/internal/DataStateInternal.vue +74 -0
- package/src/components/internal/FormSectionRenderer.vue +0 -4
- package/src/components/internal/WellEditPopupInternal.vue +0 -4
- package/src/composables/controlSchemaTypes.ts +34 -0
- package/src/composables/index.ts +10 -0
- package/src/composables/useDropdownState.ts +35 -5
- package/src/composables/useEventStream.ts +14 -2
- package/src/composables/useFileImport.ts +2 -7
- package/src/composables/useGeneratedAnalysis.ts +8 -9
- package/src/composables/useListReorder.story.vue +143 -0
- package/src/composables/useListReorder.ts +242 -0
- package/src/composables/useMenuKeyboard.ts +2 -2
- package/src/composables/useOptimisticMutation.ts +1 -15
- package/src/composables/usePluginConfig.ts +3 -1
- package/src/composables/useRackEditor.ts +2 -11
- package/src/composables/useRequestSyncState.ts +98 -28
- package/src/composables/useResourceCrud.ts +1 -15
- package/src/composables/useScheduleDrag.ts +37 -0
- package/src/composables/useWellPainting.ts +5 -29
- package/src/composables/useWellPlateEditor.ts +1 -11
- package/src/permissions.ts +48 -9
- package/src/stores/experiment.ts +2 -7
- package/src/stores/index.ts +9 -1
- package/src/stores/settings.ts +93 -1
- package/src/styles/components/audit-trail.css +5 -5
- package/src/styles/components/batch-progress-list.css +7 -0
- package/src/styles/components/color-slider.css +2 -2
- package/src/styles/components/data-state.css +30 -0
- package/src/styles/components/dataframe.css +29 -35
- package/src/styles/components/experiment-data-viewer.css +4 -4
- package/src/styles/components/experiment-timeline.css +3 -30
- package/src/styles/components/form-builder.css +5 -5
- package/src/styles/components/lcms-sequence-table.css +16 -1
- package/src/styles/components/multi-select.css +1 -1
- package/src/styles/components/reagent-list.css +38 -31
- package/src/styles/components/sample-hierarchy-tree.css +5 -19
- package/src/styles/components/sample-selector.css +9 -2
- package/src/styles/components/schedule-calendar.css +8 -0
- package/src/styles/components/scientific-number.css +1 -1
- package/src/styles/components/well-plate.css +8 -0
- package/src/styles/index.css +8 -0
- package/src/styles/variables.css +29 -0
- package/src/templates/builderPresetControls.ts +1 -1
- package/src/templates/componentPlateHelpers.ts +3 -1
- package/src/templates/doseResponseAdapters.ts +2 -13
- package/src/templates/elisaAssayCollectionBuilder.ts +2 -2
- package/src/templates/plateMapBuilder.ts +2 -2
- package/src/templates/qpcrPlateBuilder.ts +1 -1
- package/src/templates/templateValidators.ts +1 -1
- package/src/templates/timeCourseBuilder.ts +2 -2
- package/src/templates/wellPlateScreenCollectionBuilder.ts +2 -2
- package/src/utils/color.ts +51 -0
- package/src/utils/errors.ts +29 -0
- package/dist/EmptyState-NBqf2_8z.js.map +0 -1
- package/dist/ExperimentPopover-CfOdh5Rm.js.map +0 -1
- package/dist/ExperimentSelectorModal-DvIagrxY.js.map +0 -1
- package/dist/SettingsModal-W3TYfnP9.js.map +0 -1
- package/dist/components-B80gV0P6.js.map +0 -1
- package/dist/composables/autoGroupConstants.d.ts +0 -1
- package/dist/composables/autoGroupGrouping.d.ts +0 -3
- package/dist/composables/useAutoGroupInputSources.d.ts +0 -32
- package/dist/composables-C8mmD5ta.js.map +0 -1
- package/dist/experiment-Y9Iz7KYi.js.map +0 -1
- package/dist/templates/builderDefaults.d.ts +0 -1
- package/dist/templates/plateGeometry.d.ts +0 -4
- package/dist/templates-CK72aKO1.js.map +0 -1
- package/dist/useApi-CDBq6z23.js.map +0 -1
- package/dist/useControlSchema-_OVhavKq.js.map +0 -1
- package/dist/useDropdownState-D5G4UvWd.js.map +0 -1
- package/dist/useProtocolTemplates-Dq5Pzwyd.js.map +0 -1
- package/src/__tests__/composables/useAutoGroupInputSources.test.ts +0 -127
- package/src/composables/autoGroupConstants.ts +0 -4
- package/src/composables/autoGroupGrouping.ts +0 -148
- package/src/composables/useAutoGroupInputSources.ts +0 -147
- package/src/templates/builderDefaults.ts +0 -11
- package/src/templates/plateGeometry.ts +0 -62
- /package/dist/__tests__/{composables/useAutoGroupInputSources.test.d.ts → components/DataStates.test.d.ts} +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { d as resolveExperimentCode } from "./experiment-utils-DV3DrvE_.js";
|
|
2
|
-
import {
|
|
3
|
-
import { A as useConcentrationUnits, H as parseExperimentId, J as isActiveJobStatus, Q as normalizeJobState, T as getDefaultControlView, U as resolveCurrentExperimentId, V as getInjectedPlatformContext, f as resolveControlModel, g as mergeControlWorkspaceOptions, h as controlValuesToComponentProps, m as controlValuesToComponentBindingsById, p as controlValuesToComponentBindings, r as getControlDefaults, rt as isRecord, u as useControlWorkspace, w as controlsToViewItems } from "./useControlSchema-
|
|
4
|
-
import {
|
|
5
|
-
import { t as useExperimentStore } from "./experiment-
|
|
6
|
-
import { B as toBioTemplateComponentProps, F as getBioTemplateComponentProps$1, H as toBioTemplateComponentPropsById, Jt as getBioTemplatePresetInfo, L as toBioTemplateComponentBindings, P as getBioTemplateComponentBindings, Qt as getBioTemplatePackInfo, R as toBioTemplateComponentBindingsById, U as toBioTemplateComponentSnippets, V as toBioTemplateComponentPropsByComponent$1, W as toBioTemplateComponentUsage, d as createBioTemplatePresetCollectionFromControls, dn as extractTemplateCollection, i as createBioTemplateControlToolkit, p as createBioTemplatePackCollection, sn as createTemplateCollection, u as createBioTemplatePresetCollection, un as ensureTemplateFromCollection, z as toBioTemplateComponentImports } from "./templates-
|
|
2
|
+
import { n as useRequestSyncState } from "./Skeleton-DxtwJ5gt.js";
|
|
3
|
+
import { A as useConcentrationUnits, H as parseExperimentId, J as isActiveJobStatus, Q as normalizeJobState, T as getDefaultControlView, U as resolveCurrentExperimentId, V as getInjectedPlatformContext, f as resolveControlModel, g as mergeControlWorkspaceOptions, h as controlValuesToComponentProps, m as controlValuesToComponentBindingsById, p as controlValuesToComponentBindings, r as getControlDefaults, rt as isRecord, u as useControlWorkspace, w as controlsToViewItems } from "./useControlSchema-aMZlb4Sc.js";
|
|
4
|
+
import { d as useSettingsStore, i as useApi, t as readErrorMessage } from "./errors-_W0-LbA6.js";
|
|
5
|
+
import { t as useExperimentStore } from "./experiment-Cwl9AYxw.js";
|
|
6
|
+
import { B as toBioTemplateComponentProps, F as getBioTemplateComponentProps$1, H as toBioTemplateComponentPropsById, Jt as getBioTemplatePresetInfo, L as toBioTemplateComponentBindings, P as getBioTemplateComponentBindings, Qt as getBioTemplatePackInfo, R as toBioTemplateComponentBindingsById, U as toBioTemplateComponentSnippets, V as toBioTemplateComponentPropsByComponent$1, W as toBioTemplateComponentUsage, bn as rowLabel, d as createBioTemplatePresetCollectionFromControls, dn as extractTemplateCollection, i as createBioTemplateControlToolkit, p as createBioTemplatePackCollection, pn as PLATE_CONFIGS, sn as createTemplateCollection, u as createBioTemplatePresetCollection, un as ensureTemplateFromCollection, wn as deriveShade, xn as SAMPLE_COLOR_SCALE, z as toBioTemplateComponentImports } from "./templates-Qq113pyZ.js";
|
|
7
7
|
import { computed, effectScope, getCurrentScope, inject, nextTick, onMounted, onScopeDispose, onUnmounted, provide, reactive, readonly, ref, shallowRef, toRaw, toValue, unref, watch } from "vue";
|
|
8
8
|
//#region src/composables/useRovingFocus.ts
|
|
9
9
|
/**
|
|
@@ -52,8 +52,8 @@ function useRovingFocus(options) {
|
|
|
52
52
|
//#region src/composables/useMenuKeyboard.ts
|
|
53
53
|
/**
|
|
54
54
|
* Shared keyboard contract for menu- and listbox-style disclosure panels (the
|
|
55
|
-
* WAI-ARIA menu button pattern). Used by AppAvatarMenu and DropdownButton
|
|
56
|
-
*
|
|
55
|
+
* WAI-ARIA menu button pattern). Used by ActionMenu, AppAvatarMenu and DropdownButton,
|
|
56
|
+
* each pairing it with `useDropdownState` for the disclosure state itself.
|
|
57
57
|
*/
|
|
58
58
|
function useMenuKeyboard(options) {
|
|
59
59
|
function focusItem(position) {
|
|
@@ -1482,18 +1482,153 @@ function useDoseCalculator() {
|
|
|
1482
1482
|
};
|
|
1483
1483
|
}
|
|
1484
1484
|
//#endregion
|
|
1485
|
+
//#region src/composables/useListReorder.ts
|
|
1486
|
+
/** Inline style for a visually hidden `aria-live` region (no global utility class in the SDK). */
|
|
1487
|
+
var REORDER_ANNOUNCER_STYLE = Object.freeze({
|
|
1488
|
+
position: "absolute",
|
|
1489
|
+
width: "1px",
|
|
1490
|
+
height: "1px",
|
|
1491
|
+
padding: "0",
|
|
1492
|
+
margin: "-1px",
|
|
1493
|
+
overflow: "hidden",
|
|
1494
|
+
clip: "rect(0, 0, 0, 0)",
|
|
1495
|
+
whiteSpace: "nowrap",
|
|
1496
|
+
border: "0"
|
|
1497
|
+
});
|
|
1498
|
+
/**
|
|
1499
|
+
* Screen-reader announcements for drag/keyboard move interactions. Bind
|
|
1500
|
+
* `announcement` to a `role="status" aria-live="polite"` element styled with
|
|
1501
|
+
* `announcerStyle`.
|
|
1502
|
+
*/
|
|
1503
|
+
function useReorderAnnouncer() {
|
|
1504
|
+
const announcement = ref("");
|
|
1505
|
+
function announce(message) {
|
|
1506
|
+
if (announcement.value === message) announcement.value = "";
|
|
1507
|
+
nextTick(() => {
|
|
1508
|
+
announcement.value = message;
|
|
1509
|
+
});
|
|
1510
|
+
}
|
|
1511
|
+
return {
|
|
1512
|
+
announcement,
|
|
1513
|
+
announce,
|
|
1514
|
+
announcerStyle: REORDER_ANNOUNCER_STYLE
|
|
1515
|
+
};
|
|
1516
|
+
}
|
|
1517
|
+
/** Pure helper: a copy of `items` with the entry at `from` moved to `to`. */
|
|
1518
|
+
function reorderList(items, from, to) {
|
|
1519
|
+
const next = [...items];
|
|
1520
|
+
const [moved] = next.splice(from, 1);
|
|
1521
|
+
next.splice(to, 0, moved);
|
|
1522
|
+
return next;
|
|
1523
|
+
}
|
|
1524
|
+
/**
|
|
1525
|
+
* Keyboard-accessible list reordering shared by the SDK's drag-to-reorder lists.
|
|
1526
|
+
* It owns the HTML5 drag state, the drop-index maths, and an Alt+Arrow keyboard
|
|
1527
|
+
* alternative that announces every move through a polite live region — so a
|
|
1528
|
+
* reorder never depends on a pointer.
|
|
1529
|
+
*/
|
|
1530
|
+
function useListReorder(options) {
|
|
1531
|
+
const draggingId = ref(null);
|
|
1532
|
+
const dragOverId = ref(null);
|
|
1533
|
+
const { announcement, announce, announcerStyle } = useReorderAnnouncer();
|
|
1534
|
+
const noun = options.itemNoun ?? "Item";
|
|
1535
|
+
function isDisabled() {
|
|
1536
|
+
return options.disabled?.() === true;
|
|
1537
|
+
}
|
|
1538
|
+
function idFor(item, index) {
|
|
1539
|
+
return options.getId(item, index);
|
|
1540
|
+
}
|
|
1541
|
+
/** Index within `items()`, resolved by id so filtered/sorted renders still map back. */
|
|
1542
|
+
function indexOf(item, renderIndex) {
|
|
1543
|
+
const id = idFor(item, renderIndex);
|
|
1544
|
+
const found = options.items().findIndex((candidate, index) => idFor(candidate, index) === id);
|
|
1545
|
+
return found === -1 ? renderIndex : found;
|
|
1546
|
+
}
|
|
1547
|
+
function labelFor(index) {
|
|
1548
|
+
const item = options.items()[index];
|
|
1549
|
+
if (item === void 0) return noun;
|
|
1550
|
+
return options.getLabel?.(item, index) ?? idFor(item, index);
|
|
1551
|
+
}
|
|
1552
|
+
function clearDragState() {
|
|
1553
|
+
draggingId.value = null;
|
|
1554
|
+
dragOverId.value = null;
|
|
1555
|
+
}
|
|
1556
|
+
function move(fromIndex, toIndex, source = "keyboard") {
|
|
1557
|
+
if (isDisabled()) return;
|
|
1558
|
+
const items = options.items();
|
|
1559
|
+
if (fromIndex === toIndex || fromIndex < 0 || toIndex < 0 || fromIndex >= items.length || toIndex >= items.length) return;
|
|
1560
|
+
const movedId = idFor(items[fromIndex], fromIndex);
|
|
1561
|
+
const label = labelFor(fromIndex);
|
|
1562
|
+
options.onReorder({
|
|
1563
|
+
fromIndex,
|
|
1564
|
+
toIndex,
|
|
1565
|
+
items: reorderList(items, fromIndex, toIndex),
|
|
1566
|
+
source
|
|
1567
|
+
});
|
|
1568
|
+
announce(`${label} moved to position ${toIndex + 1} of ${items.length}.`);
|
|
1569
|
+
nextTick(() => options.getElement?.(movedId)?.focus());
|
|
1570
|
+
}
|
|
1571
|
+
function onDragStart(event, item, index) {
|
|
1572
|
+
if (isDisabled()) return;
|
|
1573
|
+
const id = idFor(item, index);
|
|
1574
|
+
draggingId.value = id;
|
|
1575
|
+
if (event.dataTransfer) {
|
|
1576
|
+
event.dataTransfer.effectAllowed = "move";
|
|
1577
|
+
event.dataTransfer.setData("text/plain", id);
|
|
1578
|
+
}
|
|
1579
|
+
}
|
|
1580
|
+
function onDragOver(event, item, index) {
|
|
1581
|
+
if (isDisabled() || draggingId.value === null) return;
|
|
1582
|
+
event.preventDefault();
|
|
1583
|
+
if (event.dataTransfer) event.dataTransfer.dropEffect = "move";
|
|
1584
|
+
const id = idFor(item, index);
|
|
1585
|
+
dragOverId.value = id === draggingId.value ? null : id;
|
|
1586
|
+
}
|
|
1587
|
+
function onDragLeave() {
|
|
1588
|
+
dragOverId.value = null;
|
|
1589
|
+
}
|
|
1590
|
+
function onDrop(event, item, index) {
|
|
1591
|
+
if (isDisabled() || draggingId.value === null) {
|
|
1592
|
+
clearDragState();
|
|
1593
|
+
return;
|
|
1594
|
+
}
|
|
1595
|
+
event.preventDefault();
|
|
1596
|
+
const fromIndex = options.items().findIndex((candidate, i) => idFor(candidate, i) === draggingId.value);
|
|
1597
|
+
const toIndex = indexOf(item, index);
|
|
1598
|
+
clearDragState();
|
|
1599
|
+
if (fromIndex === -1) return;
|
|
1600
|
+
move(fromIndex, toIndex, "drag");
|
|
1601
|
+
}
|
|
1602
|
+
function onDragEnd() {
|
|
1603
|
+
clearDragState();
|
|
1604
|
+
}
|
|
1605
|
+
function onKeydown(event, item, index) {
|
|
1606
|
+
if (isDisabled() || !event.altKey) return;
|
|
1607
|
+
const direction = event.key === "ArrowUp" || event.key === "ArrowLeft" ? -1 : event.key === "ArrowDown" || event.key === "ArrowRight" ? 1 : 0;
|
|
1608
|
+
if (direction === 0) return;
|
|
1609
|
+
event.preventDefault();
|
|
1610
|
+
const fromIndex = indexOf(item, index);
|
|
1611
|
+
move(fromIndex, fromIndex + direction, "keyboard");
|
|
1612
|
+
}
|
|
1613
|
+
return {
|
|
1614
|
+
draggingId,
|
|
1615
|
+
dragOverId,
|
|
1616
|
+
isDragging: (id) => draggingId.value === id,
|
|
1617
|
+
isDragOver: (id) => dragOverId.value === id,
|
|
1618
|
+
announcement,
|
|
1619
|
+
announcerStyle,
|
|
1620
|
+
announce,
|
|
1621
|
+
onDragStart,
|
|
1622
|
+
onDragOver,
|
|
1623
|
+
onDragLeave,
|
|
1624
|
+
onDrop,
|
|
1625
|
+
onDragEnd,
|
|
1626
|
+
onKeydown,
|
|
1627
|
+
move
|
|
1628
|
+
};
|
|
1629
|
+
}
|
|
1630
|
+
//#endregion
|
|
1485
1631
|
//#region src/composables/useWellPlateEditor.ts
|
|
1486
|
-
var DEFAULT_PALETTE = [
|
|
1487
|
-
"#3B82F6",
|
|
1488
|
-
"#10B981",
|
|
1489
|
-
"#EF4444",
|
|
1490
|
-
"#F59E0B",
|
|
1491
|
-
"#8B5CF6",
|
|
1492
|
-
"#F97316",
|
|
1493
|
-
"#06B6D4",
|
|
1494
|
-
"#14B8A6",
|
|
1495
|
-
"#6B7280"
|
|
1496
|
-
];
|
|
1497
1632
|
var MAX_HISTORY = 50;
|
|
1498
1633
|
function createEmptyPlate(name, format, id) {
|
|
1499
1634
|
return {
|
|
@@ -1577,7 +1712,7 @@ function useWellPlateEditor(initialState, options = {}) {
|
|
|
1577
1712
|
const sample = {
|
|
1578
1713
|
id: generateSampleId(),
|
|
1579
1714
|
name,
|
|
1580
|
-
color: color ||
|
|
1715
|
+
color: color || SAMPLE_COLOR_SCALE[internalState.value.samples.length % SAMPLE_COLOR_SCALE.length],
|
|
1581
1716
|
count: 0
|
|
1582
1717
|
};
|
|
1583
1718
|
internalState.value.samples.push(sample);
|
|
@@ -1685,7 +1820,7 @@ function useWellPlateEditor(initialState, options = {}) {
|
|
|
1685
1820
|
if (sampleId && !sampleMap.has(sampleId)) sampleMap.set(sampleId, {
|
|
1686
1821
|
id: sampleId,
|
|
1687
1822
|
name: sampleName || sampleId,
|
|
1688
|
-
color:
|
|
1823
|
+
color: SAMPLE_COLOR_SCALE[sampleMap.size % SAMPLE_COLOR_SCALE.length],
|
|
1689
1824
|
count: 0
|
|
1690
1825
|
});
|
|
1691
1826
|
const plate = plateMap.get(plateName);
|
|
@@ -3391,7 +3526,7 @@ function useFileImport(options = {}) {
|
|
|
3391
3526
|
result.value = parsed;
|
|
3392
3527
|
return parsed;
|
|
3393
3528
|
} catch (err) {
|
|
3394
|
-
error.value = readErrorMessage(err);
|
|
3529
|
+
error.value = readErrorMessage(err, "Failed to import file.");
|
|
3395
3530
|
throw err;
|
|
3396
3531
|
} finally {
|
|
3397
3532
|
loading.value = false;
|
|
@@ -3501,108 +3636,6 @@ function formatBytes(bytes) {
|
|
|
3501
3636
|
if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`;
|
|
3502
3637
|
return `${Math.round(bytes / (1024 * 1024))} MB`;
|
|
3503
3638
|
}
|
|
3504
|
-
function readErrorMessage(value) {
|
|
3505
|
-
if (value instanceof Error && value.message) return value.message;
|
|
3506
|
-
if (typeof value === "string" && value.trim()) return value;
|
|
3507
|
-
return "Failed to import file.";
|
|
3508
|
-
}
|
|
3509
|
-
//#endregion
|
|
3510
|
-
//#region src/utils/color.ts
|
|
3511
|
-
var HEX_RE = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i;
|
|
3512
|
-
function clamp(n, min, max) {
|
|
3513
|
-
return Math.min(max, Math.max(min, n));
|
|
3514
|
-
}
|
|
3515
|
-
function hexToHsl(hex) {
|
|
3516
|
-
const match = HEX_RE.exec(hex.trim());
|
|
3517
|
-
if (!match) return {
|
|
3518
|
-
h: 0,
|
|
3519
|
-
s: 0,
|
|
3520
|
-
l: 50
|
|
3521
|
-
};
|
|
3522
|
-
let raw = match[1];
|
|
3523
|
-
if (raw.length === 3) raw = raw.split("").map((c) => c + c).join("");
|
|
3524
|
-
const r = parseInt(raw.slice(0, 2), 16) / 255;
|
|
3525
|
-
const g = parseInt(raw.slice(2, 4), 16) / 255;
|
|
3526
|
-
const b = parseInt(raw.slice(4, 6), 16) / 255;
|
|
3527
|
-
const max = Math.max(r, g, b);
|
|
3528
|
-
const min = Math.min(r, g, b);
|
|
3529
|
-
const delta = max - min;
|
|
3530
|
-
let h = 0;
|
|
3531
|
-
if (delta !== 0) if (max === r) h = (g - b) / delta % 6;
|
|
3532
|
-
else if (max === g) h = (b - r) / delta + 2;
|
|
3533
|
-
else h = (r - g) / delta + 4;
|
|
3534
|
-
h = (h * 60 + 360) % 360;
|
|
3535
|
-
const l = (max + min) / 2;
|
|
3536
|
-
const s = delta === 0 ? 0 : delta / (1 - Math.abs(2 * l - 1));
|
|
3537
|
-
return {
|
|
3538
|
-
h,
|
|
3539
|
-
s: s * 100,
|
|
3540
|
-
l: l * 100
|
|
3541
|
-
};
|
|
3542
|
-
}
|
|
3543
|
-
function hslToHex(h, s, l) {
|
|
3544
|
-
const sNorm = clamp(s, 0, 100) / 100;
|
|
3545
|
-
const lNorm = clamp(l, 0, 100) / 100;
|
|
3546
|
-
const hNorm = (h % 360 + 360) % 360;
|
|
3547
|
-
const c = (1 - Math.abs(2 * lNorm - 1)) * sNorm;
|
|
3548
|
-
const x = c * (1 - Math.abs(hNorm / 60 % 2 - 1));
|
|
3549
|
-
const m = lNorm - c / 2;
|
|
3550
|
-
let r = 0, g = 0, b = 0;
|
|
3551
|
-
if (hNorm < 60) [r, g, b] = [
|
|
3552
|
-
c,
|
|
3553
|
-
x,
|
|
3554
|
-
0
|
|
3555
|
-
];
|
|
3556
|
-
else if (hNorm < 120) [r, g, b] = [
|
|
3557
|
-
x,
|
|
3558
|
-
c,
|
|
3559
|
-
0
|
|
3560
|
-
];
|
|
3561
|
-
else if (hNorm < 180) [r, g, b] = [
|
|
3562
|
-
0,
|
|
3563
|
-
c,
|
|
3564
|
-
x
|
|
3565
|
-
];
|
|
3566
|
-
else if (hNorm < 240) [r, g, b] = [
|
|
3567
|
-
0,
|
|
3568
|
-
x,
|
|
3569
|
-
c
|
|
3570
|
-
];
|
|
3571
|
-
else if (hNorm < 300) [r, g, b] = [
|
|
3572
|
-
x,
|
|
3573
|
-
0,
|
|
3574
|
-
c
|
|
3575
|
-
];
|
|
3576
|
-
else [r, g, b] = [
|
|
3577
|
-
c,
|
|
3578
|
-
0,
|
|
3579
|
-
x
|
|
3580
|
-
];
|
|
3581
|
-
const toHex = (n) => Math.round((n + m) * 255).toString(16).padStart(2, "0");
|
|
3582
|
-
return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
|
|
3583
|
-
}
|
|
3584
|
-
/**
|
|
3585
|
-
* Derive a same-hue-family shade of `parentHex` for child at `index` of `total`.
|
|
3586
|
-
*
|
|
3587
|
-
* Lightness is distributed evenly within [35, 75] so all children remain
|
|
3588
|
-
* readable on light/dark backgrounds. Hue and saturation are inherited from
|
|
3589
|
-
* the parent. With `total <= 1`, returns the parent unchanged.
|
|
3590
|
-
*
|
|
3591
|
-
* Children are ordered light → dark by index, so index 0 is the brightest
|
|
3592
|
-
* sibling and index `total - 1` is the darkest.
|
|
3593
|
-
*/
|
|
3594
|
-
function deriveShade(parentHex, index, total) {
|
|
3595
|
-
if (total <= 1) return parentHex;
|
|
3596
|
-
const { h, s, l } = hexToHsl(parentHex);
|
|
3597
|
-
const L_MIN = 35;
|
|
3598
|
-
const L_MAX = 75;
|
|
3599
|
-
const spread = Math.min(L_MAX - L_MIN, 40);
|
|
3600
|
-
const center = clamp(l, L_MIN + spread / 2, L_MAX - spread / 2);
|
|
3601
|
-
const top = center + spread / 2;
|
|
3602
|
-
const bot = center - spread / 2;
|
|
3603
|
-
const childL = top - (total === 1 ? .5 : index / (total - 1)) * (top - bot);
|
|
3604
|
-
return hslToHex(h, clamp(s, 35, 100), childL);
|
|
3605
|
-
}
|
|
3606
3639
|
//#endregion
|
|
3607
3640
|
//#region src/utils/sampleGroupPath.ts
|
|
3608
3641
|
/** Split a group name into normalized hierarchy segments. */
|
|
@@ -4062,6 +4095,30 @@ function useScheduleDrag(options) {
|
|
|
4062
4095
|
else if ((state.type === "resize-top" || state.type === "resize-bottom") && state.event && options.onResizeComplete) options.onResizeComplete(state.event, g.start, g.end);
|
|
4063
4096
|
cleanup();
|
|
4064
4097
|
}
|
|
4098
|
+
/**
|
|
4099
|
+
* Keyboard alternative to the pointer drag: shifts an event by one slot
|
|
4100
|
+
* (`mode: 'move'`) or grows/shrinks its end by one slot (`mode: 'resize'`),
|
|
4101
|
+
* staying inside the visible day. Returns whether the nudge was applied.
|
|
4102
|
+
*/
|
|
4103
|
+
function nudgeEvent(event, direction, mode = "move") {
|
|
4104
|
+
if (options.readonly.value) return false;
|
|
4105
|
+
if (mode === "move" && event.draggable === false) return false;
|
|
4106
|
+
if (mode === "resize" && event.resizable === false) return false;
|
|
4107
|
+
const slotMin = options.slotDuration.value;
|
|
4108
|
+
const dayStart = options.dayStartHour.value * 60;
|
|
4109
|
+
const dayEnd = options.dayEndHour.value * 60;
|
|
4110
|
+
const start = dateToMinutes(new Date(event.start));
|
|
4111
|
+
const end = dateToMinutes(new Date(event.end));
|
|
4112
|
+
const nextStart = mode === "move" ? start + direction * slotMin : start;
|
|
4113
|
+
const nextEnd = mode === "move" ? end + direction * slotMin : Math.max(start + slotMin, end + direction * slotMin);
|
|
4114
|
+
if (nextStart < dayStart || nextEnd > dayEnd || nextEnd <= nextStart) return false;
|
|
4115
|
+
const base = new Date(event.start);
|
|
4116
|
+
const newStart = minutesToDate(base, nextStart);
|
|
4117
|
+
const newEnd = minutesToDate(base, nextEnd);
|
|
4118
|
+
if (mode === "move") options.onMoveComplete?.(event, newStart, newEnd);
|
|
4119
|
+
else options.onResizeComplete?.(event, newStart, newEnd);
|
|
4120
|
+
return true;
|
|
4121
|
+
}
|
|
4065
4122
|
function addListeners() {
|
|
4066
4123
|
document.addEventListener("pointermove", onPointerMove);
|
|
4067
4124
|
document.addEventListener("pointerup", onPointerUp);
|
|
@@ -4079,7 +4136,8 @@ function useScheduleDrag(options) {
|
|
|
4079
4136
|
ghost,
|
|
4080
4137
|
startCreate,
|
|
4081
4138
|
startMove,
|
|
4082
|
-
startResize
|
|
4139
|
+
startResize,
|
|
4140
|
+
nudgeEvent
|
|
4083
4141
|
};
|
|
4084
4142
|
}
|
|
4085
4143
|
function snapMinutes(minutes, step) {
|
|
@@ -4802,36 +4860,6 @@ var SLOT_CYCLE = [
|
|
|
4802
4860
|
"B",
|
|
4803
4861
|
"Y"
|
|
4804
4862
|
];
|
|
4805
|
-
var PLATE_CONFIGS = {
|
|
4806
|
-
6: {
|
|
4807
|
-
rows: 2,
|
|
4808
|
-
cols: 3
|
|
4809
|
-
},
|
|
4810
|
-
12: {
|
|
4811
|
-
rows: 3,
|
|
4812
|
-
cols: 4
|
|
4813
|
-
},
|
|
4814
|
-
24: {
|
|
4815
|
-
rows: 4,
|
|
4816
|
-
cols: 6
|
|
4817
|
-
},
|
|
4818
|
-
48: {
|
|
4819
|
-
rows: 6,
|
|
4820
|
-
cols: 8
|
|
4821
|
-
},
|
|
4822
|
-
54: {
|
|
4823
|
-
rows: 6,
|
|
4824
|
-
cols: 9
|
|
4825
|
-
},
|
|
4826
|
-
96: {
|
|
4827
|
-
rows: 8,
|
|
4828
|
-
cols: 12
|
|
4829
|
-
},
|
|
4830
|
-
384: {
|
|
4831
|
-
rows: 16,
|
|
4832
|
-
cols: 24
|
|
4833
|
-
}
|
|
4834
|
-
};
|
|
4835
4863
|
var globalIdCounter = 0;
|
|
4836
4864
|
function generateId() {
|
|
4837
4865
|
globalIdCounter++;
|
|
@@ -4915,7 +4943,7 @@ function useRackEditor(initialRacks, options) {
|
|
|
4915
4943
|
if (!config) return;
|
|
4916
4944
|
let counter = 1;
|
|
4917
4945
|
for (let row = 0; row < config.rows; row++) for (let col = 0; col < config.cols; col++) {
|
|
4918
|
-
const wellId = `${
|
|
4946
|
+
const wellId = `${rowLabel(row)}${col + 1}`;
|
|
4919
4947
|
if (!rack.wells[wellId]?.sampleType) {
|
|
4920
4948
|
const paddedNum = String(counter).padStart(3, "0");
|
|
4921
4949
|
rack.wells[wellId] = {
|
|
@@ -5579,6 +5607,6 @@ function useProtocolTemplates() {
|
|
|
5579
5607
|
};
|
|
5580
5608
|
}
|
|
5581
5609
|
//#endregion
|
|
5582
|
-
export {
|
|
5610
|
+
export { usePresenceHeartbeat as $, useAutoGroup as A, useReorderAnnouncer as B, getSampleGroupParentPath as C, useFileImport as D, readFileAsText as E, DEFAULT_COLORS as F, usePluginWorkspace as G, combinePluginJobSources as H, useWellPlateEditor as I, APP_EXPERIMENT_KEY as J, DEFAULT_MOBILE_VIEWPORT_QUERY as K, REORDER_ANNOUNCER_STYLE as L, extractSampleNamesFromDesignData as M, extractSampleOptionsFromDesignData as N, validateImportFile as O, unwrapExperimentDesignData as P, getPresenceClientId as Q, reorderList as R, getSampleGroupMajorPrefix as S, parseDelimitedText as T, useJobsStatusTray as U, useDoseCalculator as V, usePluginJobCenter as W, getInjectedFrontendRevision as X, useAppExperiment as Y, useRuntimeAlignment as Z, useScheduleDrag as _, useReagentSeries as a, compareSortValues as at, useExpansionSet as b, useBioTemplatePresetWorkspace as c, useRovingFocus as ct, getBioTemplateComponentProps as d, useTheme as et, toBioTemplateComponentPropsByComponent as f, useExperimentSave as g, useTemplateCollection as h, generateDilutionSeries as i, useTextSearch as it, parseCSV as j, extractSamplesFromDesignData as k, useBioTemplatePackWorkspace as l, useBioTemplateControls as m, DEFAULT_PRESETS as n, candidateMatchesSearch as nt, useGroupAssignment as o, useSortedItems as ot, useBioTemplateComponents as p, useMobileSupportGate as q, DEFAULT_UNITS as r, normalizeSearchQuery as rt, useRackEditor as s, useMenuKeyboard as st, useProtocolTemplates as t, useToast as tt, useBioTemplateWorkspace as u, useExperimentSamples as v, detectDelimiter as w, useSampleGroups as x, useExperimentData as y, useListReorder as z };
|
|
5583
5611
|
|
|
5584
|
-
//# sourceMappingURL=useProtocolTemplates-
|
|
5612
|
+
//# sourceMappingURL=useProtocolTemplates-BmX_iVBR.js.map
|