@morscherlab/mint-sdk 1.4.0-beta.8 → 1.4.0
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 +14 -3
- package/dist/{ActionMenu-CScINahU.js → AlertBox-DwgNTEqf.js} +40 -209
- package/dist/AlertBox-DwgNTEqf.js.map +1 -0
- package/dist/{AppSidebar-BmiiPfz9.js → AppSidebar-CZZaxni0.js} +1249 -239
- package/dist/AppSidebar-CZZaxni0.js.map +1 -0
- package/dist/{ConfirmDialog-CJ7hqYUP.js → ConfirmDialog-CjWoxAD1.js} +2 -2
- package/dist/{ConfirmDialog-CJ7hqYUP.js.map → ConfirmDialog-CjWoxAD1.js.map} +1 -1
- package/dist/ExperimentPopover-DujiuQIO.js +337 -0
- package/dist/ExperimentPopover-DujiuQIO.js.map +1 -0
- package/dist/{ExperimentSelectorModal-D-9z7cNx.js → ExperimentSelectorModal-B4j4eUOJ.js} +244 -211
- package/dist/ExperimentSelectorModal-B4j4eUOJ.js.map +1 -0
- package/dist/{SegmentedControl-DERBN-Xd.js → SegmentedControl-DyUPH3I5.js} +2 -2
- package/dist/{SegmentedControl-DERBN-Xd.js.map → SegmentedControl-DyUPH3I5.js.map} +1 -1
- package/dist/{SettingsModal-CSLE31yg.js → SettingsModal-D2MOOtuO.js} +28 -27
- package/dist/SettingsModal-D2MOOtuO.js.map +1 -0
- package/dist/__stories__/experiment-helpers.d.ts +10 -0
- package/dist/__tests__/components/AppTopBarOnboarding.test.d.ts +1 -0
- package/dist/__tests__/components/FloatingPanelsInModal.test.d.ts +1 -0
- package/dist/__tests__/composables/useFloatingPanel.test.d.ts +1 -0
- package/dist/__tests__/composables/useOnboarding.test.d.ts +1 -0
- package/dist/__tests__/styles/paletteTokens.test.d.ts +1 -0
- package/dist/__tests__/styles/v2AuditRules.test.d.ts +1 -0
- package/dist/components/AppSidebar.vue.d.ts +1 -1
- package/dist/components/AppTopBar.vue.d.ts +20 -5
- package/dist/components/ArtifactSaveDialog.vue.d.ts +9 -1
- package/dist/components/AuditTrail.vue.d.ts +1 -1
- package/dist/components/BaseButton.vue.d.ts +4 -2
- package/dist/components/BaseSelect.vue.d.ts +2 -2
- package/dist/components/ChartContainer.vue.d.ts +2 -0
- package/dist/components/DatePicker.vue.d.ts +1 -1
- package/dist/components/ExperimentPopover.vue.d.ts +18 -0
- package/dist/components/ExperimentSelectorModal.vue.d.ts +15 -5
- package/dist/components/FilePicker.vue.d.ts +1 -1
- package/dist/components/FileUploader.vue.d.ts +2 -2
- package/dist/components/JobsStatusTray.vue.d.ts +15 -4
- package/dist/components/PluginIcon.vue.d.ts +2 -2
- package/dist/components/PluginWorkspaceView.props.d.ts +3 -0
- package/dist/components/PluginWorkspaceView.vue.d.ts +3 -0
- package/dist/components/SampleSelector.vue.d.ts +6 -6
- package/dist/components/SequenceProgressBar.vue.d.ts +3 -0
- package/dist/components/SmartGroupFieldRecipe.vue.d.ts +3 -3
- package/dist/components/StepWizard.vue.d.ts +3 -0
- package/dist/components/internal/AppTopBarOnboardingInternal.vue.d.ts +7 -0
- package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +2 -1
- package/dist/components/internal/AutoGroupModalInternal.vue.d.ts +3 -3
- package/dist/components/internal/DatePickerTimeInternal.vue.d.ts +1 -1
- package/dist/components/internal/OnboardingLayerInternal.vue.d.ts +7 -0
- package/dist/components/internal/ResourcePickerListInternal.vue.d.ts +2 -7
- package/dist/components/internal/SelectMultipleInternal.vue.d.ts +4 -0
- package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +8 -0
- package/dist/composables/createClient.d.ts +2 -0
- package/dist/composables/index.d.ts +1 -0
- package/dist/composables/pluginIdentity.d.ts +24 -0
- package/dist/composables/pluginWorkspaceModel.d.ts +2 -2
- package/dist/composables/useAppExperiment.d.ts +8 -0
- package/dist/composables/useCalendarGrid.d.ts +1 -1
- package/dist/composables/useExperimentSelector.d.ts +6 -2
- package/dist/composables/useFileImport.d.ts +7 -0
- package/dist/composables/useFloatingPanel.d.ts +29 -0
- package/dist/composables/useJobCenter.d.ts +41 -3
- package/dist/composables/useOnboarding.d.ts +119 -0
- package/dist/composables/usePlatform.d.ts +1 -0
- package/dist/{controlSchemaModel-CP5-_nAj.js → controlSchemaModel-Bsg0t5Ab.js} +2 -2
- package/dist/{controlSchemaModel-CP5-_nAj.js.map → controlSchemaModel-Bsg0t5Ab.js.map} +1 -1
- package/dist/{data-C2PwI_dn.js → data-Boeh4uPI.js} +180 -125
- package/dist/data-Boeh4uPI.js.map +1 -0
- package/dist/data.d.ts +1 -1
- package/dist/data.js +9 -9
- package/dist/{experiment-43OJtH7R.js → experiment-DyO54FQB.js} +25 -61
- package/dist/experiment-DyO54FQB.js.map +1 -0
- package/dist/{experimentStatus-BZmU4czV.js → experimentStatus-DCn2QKG7.js} +3 -3
- package/dist/{experimentStatus-BZmU4czV.js.map → experimentStatus-DCn2QKG7.js.map} +1 -1
- package/dist/index.js +20 -20
- package/dist/{install-DAID6c2-.js → install-BEHp7Mo-.js} +15 -14
- package/dist/{install-DAID6c2-.js.map → install-BEHp7Mo-.js.map} +1 -1
- package/dist/install.js +1 -1
- package/dist/{lab-DLwRl_Ql.js → lab-D61eaX6f.js} +136 -148
- package/dist/lab-D61eaX6f.js.map +1 -0
- package/dist/lab.js +4 -3
- package/dist/{records-BzTcxekG.js → records-D4aQXyZu.js} +647 -389
- package/dist/records-D4aQXyZu.js.map +1 -0
- package/dist/{runtime-D6gVat6r.js → runtime-q-R0CNLh.js} +417 -54
- package/dist/runtime-q-R0CNLh.js.map +1 -0
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.js +7 -7
- package/dist/{shell-5ju97nOS.js → shell-6CGFvUUw.js} +10 -5
- package/dist/{shell-5ju97nOS.js.map → shell-6CGFvUUw.js.map} +1 -1
- package/dist/shell.d.ts +1 -0
- package/dist/shell.js +6 -6
- package/dist/stores/index.d.ts +1 -1
- package/dist/stores/index.js +2 -2
- package/dist/stores/settings.d.ts +4 -12
- package/dist/styles.css +2753 -2101
- package/dist/types/componentWorkflowTypes.d.ts +2 -0
- package/dist/types/components.d.ts +2 -0
- package/dist/types/generated/platformContext.d.ts +1 -0
- package/dist/types/generated-ui.d.ts +4 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/jobs.d.ts +9 -0
- package/dist/types/platform.d.ts +1 -1
- package/dist/{BaseModal-DfRIuVoj.js → useDropdownState-uFIz6Yv8.js} +75 -5
- package/dist/useDropdownState-uFIz6Yv8.js.map +1 -0
- package/dist/{useExperimentSamples-CxcnxZ8h.js → useExperimentSamples-QEFoq4tf.js} +48 -6
- package/dist/useExperimentSamples-QEFoq4tf.js.map +1 -0
- package/dist/{useListReorder-CcbEYxX-.js → useListReorder-DsuzwWGS.js} +219 -437
- package/dist/useListReorder-DsuzwWGS.js.map +1 -0
- package/dist/{useRackEditor-BD5NIo5s.js → useRackEditor-KpZ4iJ6o.js} +85 -81
- package/dist/useRackEditor-KpZ4iJ6o.js.map +1 -0
- package/dist/useRealtime-B58Lo-Tm.js +508 -0
- package/dist/useRealtime-B58Lo-Tm.js.map +1 -0
- package/dist/useRequest-BuDmW8Jc.js +215 -0
- package/dist/useRequest-BuDmW8Jc.js.map +1 -0
- package/dist/utils/time.d.ts +7 -0
- package/package.json +3 -2
- package/src/__stories__/experiment-helpers.ts +3 -3
- package/src/__tests__/components/ActionMenu.test.ts +2 -2
- package/src/__tests__/components/AppTopBar.test.ts +257 -3
- package/src/__tests__/components/AppTopBarOnboarding.test.ts +160 -0
- package/src/__tests__/components/AppTopBarPageSelector.test.ts +125 -9
- package/src/__tests__/components/AppTopBarPillNav.test.ts +35 -0
- package/src/__tests__/components/ArtifactSaveDialog.test.ts +78 -0
- package/src/__tests__/components/BaseButton.test.ts +19 -0
- package/src/__tests__/components/BaseModal.test.ts +13 -0
- package/src/__tests__/components/BaseSelect.multiple.test.ts +87 -32
- package/src/__tests__/components/BaseSelect.test.ts +2 -1
- package/src/__tests__/components/BatchProgressList.test.ts +16 -0
- package/src/__tests__/components/CalendarGridPanel.test.ts +2 -2
- package/src/__tests__/components/ChartContainer.test.ts +11 -0
- package/src/__tests__/components/ChemicalFormula.test.ts +6 -3
- package/src/__tests__/components/DatePicker.datetime.test.ts +6 -0
- package/src/__tests__/components/DatePicker.test.ts +21 -0
- package/src/__tests__/components/DatePicker.time.test.ts +2 -2
- package/src/__tests__/components/EmptyState.test.ts +1 -1
- package/src/__tests__/components/ExperimentPopover.test.ts +125 -16
- package/src/__tests__/components/ExperimentSelectorModal.test.ts +153 -14
- package/src/__tests__/components/FloatingPanelsInModal.test.ts +94 -0
- package/src/__tests__/components/GeneratedPluginView.test.ts +23 -2
- package/src/__tests__/components/InstrumentStateBadge.test.ts +4 -4
- package/src/__tests__/components/JobsStatusTray.test.ts +373 -71
- package/src/__tests__/components/PluginWorkspaceView.test.ts +63 -1
- package/src/__tests__/components/ResourcePickerListInternal.test.ts +0 -20
- package/src/__tests__/components/SampleSelector.test.ts +33 -8
- package/src/__tests__/components/SequenceProgressBar.test.ts +12 -0
- package/src/__tests__/components/SettingsModal.test.ts +9 -2
- package/src/__tests__/components/StepWizard.test.ts +11 -0
- package/src/__tests__/components/WellPlate.decoration.test.ts +11 -4
- package/src/__tests__/components/deprecationTags.test.ts +1 -1
- package/src/__tests__/composables/useAppExperiment.test.ts +27 -1
- package/src/__tests__/composables/useCalendarGrid.test.ts +4 -2
- package/src/__tests__/composables/useExperimentSelector.test.ts +111 -0
- package/src/__tests__/composables/useFileImport.test.ts +36 -0
- package/src/__tests__/composables/useFloatingPanel.test.ts +68 -0
- package/src/__tests__/composables/useJobCenter.test.ts +262 -3
- package/src/__tests__/composables/useOnboarding.test.ts +317 -0
- package/src/__tests__/docs/frontendDocsCatalog.test.ts +4 -3
- package/src/__tests__/fixtures/table-import/cells.xlsx +0 -0
- package/src/__tests__/fixtures/table-import/samples.xlsx +0 -0
- package/src/__tests__/stores/settings.test.ts +21 -21
- package/src/__tests__/styles/baseControlsRules.test.ts +6 -2
- package/src/__tests__/styles/controlRefreshRules.test.ts +0 -6
- package/src/__tests__/styles/cssTokens.test.ts +6 -3
- package/src/__tests__/styles/menusShellRefresh.test.ts +22 -12
- package/src/__tests__/styles/paletteTokens.test.ts +44 -0
- package/src/__tests__/styles/v2AuditRules.test.ts +104 -0
- package/src/__tests__/utils/plotlyTemplate.test.ts +4 -4
- package/src/__tests__/utils/time.test.ts +18 -1
- package/src/components/ActionMenu.vue +6 -37
- package/src/components/AdductText.story.vue +7 -0
- package/src/components/AdductText.vue +1 -1
- package/src/components/AlertBox.story.vue +2 -2
- package/src/components/AlertBox.vue +18 -16
- package/src/components/AppSidebar.story.vue +0 -28
- package/src/components/AppTopBar.onboarding.story.vue +69 -0
- package/src/components/AppTopBar.story.vue +105 -15
- package/src/components/AppTopBar.vue +248 -122
- package/src/components/ArtifactSaveDialog.story.vue +23 -0
- package/src/components/ArtifactSaveDialog.vue +102 -12
- package/src/components/AuditTrail.story.vue +2 -1
- package/src/components/AuditTrail.vue +2 -21
- package/src/components/Avatar.vue +10 -14
- package/src/components/BaseButton.vue +16 -2
- package/src/components/BaseModal.vue +2 -1
- package/src/components/BaseSelect.multiple.story.vue +13 -2
- package/src/components/BaseSelect.vue +4 -3
- package/src/components/BatchProgressList.vue +35 -25
- package/src/components/ChartContainer.story.vue +2 -1
- package/src/components/ChartContainer.vue +8 -6
- package/src/components/ConfirmDialog.story.vue +1 -1
- package/src/components/EmptyState.vue +1 -1
- package/src/components/ExperimentPopover.story.vue +165 -53
- package/src/components/ExperimentPopover.vue +169 -187
- package/src/components/ExperimentSelectorModal.story.vue +73 -31
- package/src/components/ExperimentSelectorModal.vue +144 -111
- package/src/components/FormField.story.vue +8 -48
- package/src/components/GeneratedPluginView.vue +11 -10
- package/src/components/GeneratedResultRenderer.vue +3 -4
- package/src/components/InstrumentStateBadge.vue +1 -1
- package/src/components/JobsStatusTray.story.vue +97 -43
- package/src/components/JobsStatusTray.vue +287 -290
- package/src/components/LayoutResizeHandle.story.vue +65 -4
- package/src/components/LoadingSpinner.vue +1 -1
- package/src/components/NumberInput.vue +3 -6
- package/src/components/PluginIcon.story.vue +2 -10
- package/src/components/PluginIcon.vue +2 -2
- package/src/components/PluginWorkspaceView.props.ts +3 -0
- package/src/components/PluginWorkspaceView.story.vue +1 -1
- package/src/components/PluginWorkspaceView.vue +17 -0
- package/src/components/RuntimeUpdateNotice.vue +1 -1
- package/src/components/SampleSelector.story.vue +22 -7
- package/src/components/SampleSelector.vue +34 -37
- package/src/components/SampleSelectorGroupNode.vue +1 -1
- package/src/components/SectionCard.story.vue +35 -2
- package/src/components/SequenceProgressBar.story.vue +9 -0
- package/src/components/SequenceProgressBar.vue +6 -1
- package/src/components/SettingsModal.schema.ts +1 -1
- package/src/components/SettingsModal.vue +9 -14
- package/src/components/SmartGroupFieldRecipe.story.vue +1 -1
- package/src/components/SmartGroupManual.story.vue +1 -1
- package/src/components/StepWizard.story.vue +33 -0
- package/src/components/StepWizard.vue +8 -1
- package/src/components/Tooltip.vue +9 -32
- package/src/components/WellPlate.story.vue +3 -1
- package/src/components/WellPlate.vue +7 -0
- package/src/components/internal/AppTopBarOnboardingInternal.vue +172 -0
- package/src/components/internal/AppTopBarPageSelectorInternal.vue +140 -72
- package/src/components/internal/AppTopBarPillNavInternal.vue +33 -2
- package/src/components/internal/DatePickerDateInternal.vue +23 -85
- package/src/components/internal/DatePickerDateTimeInternal.vue +10 -14
- package/src/components/internal/DatePickerTimeInternal.vue +13 -9
- package/src/components/internal/NumberUnitInputInternal.vue +4 -18
- package/src/components/internal/OnboardingLayerInternal.vue +173 -0
- package/src/components/internal/ResourcePickerListInternal.vue +45 -85
- package/src/components/internal/SelectMultipleInternal.vue +187 -65
- package/src/components/internal/SelectSearchableInternal.vue +8 -4
- package/src/components/internal/WellEditPopupInternal.vue +11 -22
- package/src/components/internal/WorkspaceShellInternal.vue +12 -0
- package/src/composables/createClient.ts +2 -0
- package/src/composables/index.ts +1 -0
- package/src/composables/pluginIdentity.ts +31 -0
- package/src/composables/pluginWorkspaceModel.ts +2 -2
- package/src/composables/useAppExperiment.ts +20 -0
- package/src/composables/useCalendarGrid.ts +4 -3
- package/src/composables/useExperimentSelector.ts +77 -31
- package/src/composables/useFileImport.ts +51 -1
- package/src/composables/useFloatingPanel.ts +107 -0
- package/src/composables/useJobCenter.ts +188 -6
- package/src/composables/useOnboarding.ts +465 -0
- package/src/composables/usePluginWorkspace.ts +1 -1
- package/src/data.ts +1 -0
- package/src/runtime.ts +2 -1
- package/src/shell.ts +17 -0
- package/src/stores/index.ts +0 -2
- package/src/stores/settings.ts +20 -50
- package/src/styles/components/action-menu.css +1 -1
- package/src/styles/components/adduct-text.css +13 -5
- package/src/styles/components/alert-box.css +39 -58
- package/src/styles/components/app-layout.css +10 -6
- package/src/styles/components/app-page-selector.css +121 -44
- package/src/styles/components/app-pill-nav.css +11 -12
- package/src/styles/components/app-sidebar.css +9 -18
- package/src/styles/components/app-top-bar.css +219 -55
- package/src/styles/components/artifact-save-dialog.css +153 -2
- package/src/styles/components/audit-trail.css +16 -19
- package/src/styles/components/avatar.css +6 -4
- package/src/styles/components/batch-progress-list.css +38 -36
- package/src/styles/components/button.css +36 -59
- package/src/styles/components/calendar.css +12 -12
- package/src/styles/components/chart-container.css +34 -23
- package/src/styles/components/checkbox.css +2 -12
- package/src/styles/components/collapsible-card.css +27 -29
- package/src/styles/components/confirm-dialog.css +13 -14
- package/src/styles/components/dataframe.css +13 -5
- package/src/styles/components/date-picker.css +84 -94
- package/src/styles/components/datetime-picker.css +35 -47
- package/src/styles/components/divider.css +20 -20
- package/src/styles/components/dose-calculator.css +3 -3
- package/src/styles/components/empty-state.css +20 -17
- package/src/styles/components/experiment-code-badge.css +2 -0
- package/src/styles/components/experiment-popover.css +174 -329
- package/src/styles/components/experiment-selector-modal.css +88 -56
- package/src/styles/components/file-picker.css +3 -3
- package/src/styles/components/file-uploader.css +38 -49
- package/src/styles/components/form-builder.css +3 -3
- package/src/styles/components/formula-input.css +1 -1
- package/src/styles/components/icon-button.css +18 -24
- package/src/styles/components/input.css +5 -4
- package/src/styles/components/instrument-monitor.css +13 -15
- package/src/styles/components/jobs-status-tray.css +140 -296
- package/src/styles/components/layout-resize-handle.css +59 -16
- package/src/styles/components/modal.css +5 -7
- package/src/styles/components/molecule-input.css +2 -2
- package/src/styles/components/multi-select.css +65 -117
- package/src/styles/components/number-input.css +26 -19
- package/src/styles/components/onboarding.css +368 -0
- package/src/styles/components/pill.css +3 -2
- package/src/styles/components/plate-editor.css +0 -1
- package/src/styles/components/plugin-icon.css +26 -23
- package/src/styles/components/popover.css +2 -2
- package/src/styles/components/presence-avatars.css +1 -1
- package/src/styles/components/progress-bar.css +3 -3
- package/src/styles/components/protocol-step-editor.css +1 -3
- package/src/styles/components/resource-card.css +2 -2
- package/src/styles/components/resource-picker-list.css +6 -57
- package/src/styles/components/sample-hierarchy-tree.css +4 -4
- package/src/styles/components/sample-selector.css +138 -79
- package/src/styles/components/schedule-calendar.css +8 -8
- package/src/styles/components/searchable-select.css +15 -19
- package/src/styles/components/section-card.css +54 -49
- package/src/styles/components/segmented-control.css +18 -15
- package/src/styles/components/select.css +3 -3
- package/src/styles/components/sequence-input.css +2 -2
- package/src/styles/components/sequence-progress-bar.css +17 -8
- package/src/styles/components/settings-modal.css +7 -2
- package/src/styles/components/smart-group.css +18 -18
- package/src/styles/components/step-wizard.css +52 -16
- package/src/styles/components/tabs.css +2 -2
- package/src/styles/components/textarea.css +3 -3
- package/src/styles/components/time-picker.css +37 -25
- package/src/styles/components/toast.css +13 -11
- package/src/styles/components/toggle.css +1 -11
- package/src/styles/components/tooltip.css +12 -11
- package/src/styles/components/unit-input.css +9 -8
- package/src/styles/components/well-edit-popup.css +2 -2
- package/src/styles/components/well-plate.css +9 -2
- package/src/styles/index.css +1 -0
- package/src/styles/variables.css +247 -78
- package/src/types/componentWorkflowTypes.ts +2 -0
- package/src/types/components.ts +2 -0
- package/src/types/generated/platformContext.ts +1 -0
- package/src/types/generated-ui.ts +4 -0
- package/src/types/index.ts +1 -0
- package/src/types/jobs.ts +10 -0
- package/src/types/platform.ts +1 -1
- package/src/utils/time.ts +21 -0
- package/dist/ActionMenu-CScINahU.js.map +0 -1
- package/dist/AppSidebar-BmiiPfz9.js.map +0 -1
- package/dist/BaseModal-DfRIuVoj.js.map +0 -1
- package/dist/ExperimentPopover-C4sGw-is.js +0 -359
- package/dist/ExperimentPopover-C4sGw-is.js.map +0 -1
- package/dist/ExperimentSelectorModal-D-9z7cNx.js.map +0 -1
- package/dist/SettingsModal-CSLE31yg.js.map +0 -1
- package/dist/data-C2PwI_dn.js.map +0 -1
- package/dist/experiment-43OJtH7R.js.map +0 -1
- package/dist/lab-DLwRl_Ql.js.map +0 -1
- package/dist/records-BzTcxekG.js.map +0 -1
- package/dist/runtime-D6gVat6r.js.map +0 -1
- package/dist/useExperimentSamples-CxcnxZ8h.js.map +0 -1
- package/dist/useListReorder-CcbEYxX-.js.map +0 -1
- package/dist/useRackEditor-BD5NIo5s.js.map +0 -1
- package/dist/useRealtime-PalKue84.js +0 -696
- package/dist/useRealtime-PalKue84.js.map +0 -1
- package/dist/useRequest-D5JDfsgZ.js +0 -76
- package/dist/useRequest-D5JDfsgZ.js.map +0 -1
|
@@ -18,48 +18,92 @@ const EXPERIMENT_NAMES = [
|
|
|
18
18
|
]
|
|
19
19
|
|
|
20
20
|
const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'processing']
|
|
21
|
+
|
|
22
|
+
const LONG_NAME = 'Glucose tracing in HeLa cells under hypoxia with 13C6-glucose pulse-chase, 48 h timecourse'
|
|
23
|
+
const TWO_HOURS_AGO = new Date(Date.now() - 2 * 3_600_000).toISOString()
|
|
24
|
+
|
|
25
|
+
function initPlayground() {
|
|
26
|
+
return {
|
|
27
|
+
experimentName: EXPERIMENT_NAMES[0],
|
|
28
|
+
experimentCode: 'EXP-042',
|
|
29
|
+
experimentStatus: 'ongoing',
|
|
30
|
+
experimentId: 42,
|
|
31
|
+
experimentProject: 'Dose-response atlas',
|
|
32
|
+
experimentOwner: 'Jane Doe',
|
|
33
|
+
experimentUpdatedAt: TWO_HOURS_AGO,
|
|
34
|
+
isResolving: false,
|
|
35
|
+
error: '',
|
|
36
|
+
showSave: true,
|
|
37
|
+
showDetach: true,
|
|
38
|
+
saveDisabled: false,
|
|
39
|
+
saveDisabledMessage: '',
|
|
40
|
+
saveLoading: false,
|
|
41
|
+
showSuccess: false,
|
|
42
|
+
saveSuccessMessage: 'Saved',
|
|
43
|
+
saveLabel: 'Save',
|
|
44
|
+
dirty: false,
|
|
45
|
+
confirmSave: true,
|
|
46
|
+
placeholder: 'Attach experiment',
|
|
47
|
+
maxNameWidth: 200,
|
|
48
|
+
}
|
|
49
|
+
}
|
|
21
50
|
</script>
|
|
22
51
|
|
|
23
52
|
<template>
|
|
24
53
|
<Story title="Experiment/ExperimentPopover">
|
|
25
54
|
<!-- Playground — all props wired up -->
|
|
26
|
-
<Variant title="Playground">
|
|
55
|
+
<Variant title="Playground" :init-state="initPlayground">
|
|
27
56
|
<template #default="{ state }">
|
|
28
57
|
<div style="padding: 3rem; display: flex; align-items: center; justify-content: center;">
|
|
29
58
|
<ExperimentPopover
|
|
30
59
|
:experiment-name="state.experimentName"
|
|
31
60
|
:experiment-code="state.experimentCode"
|
|
32
61
|
:experiment-status="state.experimentStatus"
|
|
62
|
+
:experiment-id="state.experimentId"
|
|
63
|
+
:experiment-project="state.experimentProject"
|
|
64
|
+
:experiment-owner="state.experimentOwner"
|
|
65
|
+
:experiment-updated-at="state.experimentUpdatedAt"
|
|
33
66
|
:is-resolving="state.isResolving"
|
|
34
|
-
:error="state.error"
|
|
67
|
+
:error="state.error || undefined"
|
|
35
68
|
:show-save="state.showSave"
|
|
36
69
|
:show-detach="state.showDetach"
|
|
37
70
|
:save-disabled="state.saveDisabled"
|
|
38
71
|
:save-loading="state.saveLoading"
|
|
39
72
|
:save-success-message="state.showSuccess ? state.saveSuccessMessage : ''"
|
|
40
73
|
:save-disabled-message="state.saveDisabledMessage"
|
|
74
|
+
:save-label="state.saveLabel"
|
|
75
|
+
:dirty="state.dirty"
|
|
41
76
|
:confirm-save="state.confirmSave"
|
|
77
|
+
:placeholder="state.placeholder"
|
|
78
|
+
:max-name-width="state.maxNameWidth"
|
|
42
79
|
@select="logAction('select')"
|
|
43
80
|
@save="logAction('save')"
|
|
44
81
|
@detach="logAction('detach')"
|
|
45
82
|
/>
|
|
46
83
|
</div>
|
|
47
|
-
<div v-if="lastAction" style="text-align: center; font-family:
|
|
84
|
+
<div v-if="lastAction" style="text-align: center; font-family: var(--font-mono); font-size: 0.75rem; color: var(--text-muted);">
|
|
48
85
|
Last event: <code>{{ lastAction }}</code>
|
|
49
86
|
</div>
|
|
50
87
|
</template>
|
|
51
88
|
|
|
52
89
|
<template #controls="{ state }">
|
|
53
|
-
<HstText v-model="state.experimentCode" title="Experiment code
|
|
54
|
-
<HstText v-model="state.experimentName" title="Experiment name
|
|
90
|
+
<HstText v-model="state.experimentCode" title="Experiment code" />
|
|
91
|
+
<HstText v-model="state.experimentName" title="Experiment name" />
|
|
92
|
+
<HstNumber v-model="state.maxNameWidth" title="Max name width (px)" />
|
|
55
93
|
<HstSelect
|
|
56
94
|
v-model="state.experimentStatus"
|
|
57
95
|
title="Status"
|
|
58
96
|
:options="STATUSES.map(s => ({ value: s, label: s }))"
|
|
59
97
|
/>
|
|
98
|
+
<HstText v-model="state.experimentProject" title="Project" />
|
|
99
|
+
<HstText v-model="state.experimentOwner" title="Owner" />
|
|
100
|
+
<HstNumber v-model="state.experimentId" title="Experiment id (Open in MINT)" />
|
|
60
101
|
<HstCheckbox v-model="state.isResolving" title="Resolving (id bound, name pending)" />
|
|
61
102
|
<HstText v-model="state.error" title="Resolution error message" />
|
|
62
|
-
<
|
|
103
|
+
<HstText v-model="state.placeholder" title="Empty-state placeholder" />
|
|
104
|
+
<HstCheckbox v-model="state.showSave" title="Show save (joined group)" />
|
|
105
|
+
<HstText v-model="state.saveLabel" title="Save label" />
|
|
106
|
+
<HstCheckbox v-model="state.dirty" title="Dirty (unsaved changes)" />
|
|
63
107
|
<HstCheckbox v-model="state.showDetach" title="Show detach action" />
|
|
64
108
|
<HstCheckbox v-model="state.saveDisabled" title="Save disabled" />
|
|
65
109
|
<HstText v-model="state.saveDisabledMessage" title="Save-disabled tooltip" />
|
|
@@ -79,7 +123,7 @@ const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'proces
|
|
|
79
123
|
<ExperimentPopover />
|
|
80
124
|
</div>
|
|
81
125
|
<div style="text-align: center; font-size: 0.75rem; color: var(--text-muted); padding: 0 1rem 1rem;">
|
|
82
|
-
|
|
126
|
+
Dashed trigger with a link icon reads "Attach experiment". One click emits <code>select</code>; there is no panel.
|
|
83
127
|
</div>
|
|
84
128
|
</Variant>
|
|
85
129
|
|
|
@@ -94,7 +138,7 @@ const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'proces
|
|
|
94
138
|
<div style="text-align: center; font-size: 0.75rem; color: var(--text-muted); padding: 0 2rem 1rem;">
|
|
95
139
|
A deep link bound an experiment id and the platform has not returned the record yet. The chip shows a
|
|
96
140
|
placeholder bar — never "No experiment", and never the numeric id, because a name may only come from the
|
|
97
|
-
platform. Open the panel to see the matching skeleton
|
|
141
|
+
platform. Open the panel to see the matching skeleton header.
|
|
98
142
|
</div>
|
|
99
143
|
</Variant>
|
|
100
144
|
|
|
@@ -109,7 +153,7 @@ const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'proces
|
|
|
109
153
|
<div style="text-align: center; font-size: 0.75rem; color: var(--text-muted); padding: 0 2rem 1rem;">
|
|
110
154
|
The bound experiment could not be loaded — deleted, or the user lost access. The chip reads
|
|
111
155
|
"Experiment unavailable" in the error palette; the panel carries the platform's message and keeps
|
|
112
|
-
<strong>Change
|
|
156
|
+
<strong>Change experiment…</strong> and <strong>Detach</strong> reachable so the user is never stranded.
|
|
113
157
|
</div>
|
|
114
158
|
</Variant>
|
|
115
159
|
|
|
@@ -123,17 +167,22 @@ const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'proces
|
|
|
123
167
|
experiment-name="DRP Dose-Response Screen · March 2026"
|
|
124
168
|
experiment-code="EXP-042"
|
|
125
169
|
experiment-status="ongoing"
|
|
170
|
+
:experiment-id="42"
|
|
171
|
+
experiment-project="Dose-response atlas"
|
|
172
|
+
experiment-owner="Jane Doe"
|
|
173
|
+
:experiment-updated-at="TWO_HOURS_AGO"
|
|
126
174
|
show-detach
|
|
127
175
|
/>
|
|
128
176
|
</div>
|
|
129
177
|
<div style="text-align: center; font-size: 0.75rem; color: var(--text-muted); padding: 0 1rem 1rem;">
|
|
130
|
-
Trigger shows the name. Click to open the panel
|
|
178
|
+
Trigger shows the code badge and the name. Click to open the panel: Project / Status / Owner / Updated, then
|
|
179
|
+
the Change, Open in MINT and Detach rows.
|
|
131
180
|
</div>
|
|
132
181
|
</Variant>
|
|
133
182
|
|
|
134
|
-
<!-- With save — the
|
|
183
|
+
<!-- With save — the joined group -->
|
|
135
184
|
<Variant
|
|
136
|
-
title="With save (
|
|
185
|
+
title="With save (joined)"
|
|
137
186
|
:init-state="() => ({})"
|
|
138
187
|
>
|
|
139
188
|
<div style="padding: 3rem; display: flex; align-items: center; justify-content: center;">
|
|
@@ -148,8 +197,8 @@ const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'proces
|
|
|
148
197
|
/>
|
|
149
198
|
</div>
|
|
150
199
|
<div style="text-align: center; font-size: 0.75rem; color: var(--text-muted); padding: 0 1rem 1rem;">
|
|
151
|
-
|
|
152
|
-
|
|
200
|
+
One bordered group <code>[ code name ▾ | Save ]</code>. The trigger drops its own border; Save sits behind a
|
|
201
|
+
1px divider with the accent fill. Flat: hover changes colour only.
|
|
153
202
|
</div>
|
|
154
203
|
</Variant>
|
|
155
204
|
|
|
@@ -169,6 +218,55 @@ const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'proces
|
|
|
169
218
|
</div>
|
|
170
219
|
</Variant>
|
|
171
220
|
|
|
221
|
+
<!-- Unsaved changes -->
|
|
222
|
+
<Variant
|
|
223
|
+
title="Save — dirty"
|
|
224
|
+
:init-state="() => ({})"
|
|
225
|
+
>
|
|
226
|
+
<div style="padding: 3rem; display: flex; align-items: center; justify-content: center;">
|
|
227
|
+
<ExperimentPopover
|
|
228
|
+
experiment-name="Kinase Inhibitor Panel — Plate 04"
|
|
229
|
+
experiment-code="EXP-204"
|
|
230
|
+
experiment-status="ongoing"
|
|
231
|
+
show-save
|
|
232
|
+
dirty
|
|
233
|
+
:confirm-save="false"
|
|
234
|
+
@save="logAction('save dirty')"
|
|
235
|
+
/>
|
|
236
|
+
</div>
|
|
237
|
+
<div style="text-align: center; font-size: 0.75rem; color: var(--text-muted); padding: 0 1rem 1rem;">
|
|
238
|
+
A 6px dot with a 1.5px accent ring marks unsaved changes. It hides while saving.
|
|
239
|
+
</div>
|
|
240
|
+
</Variant>
|
|
241
|
+
|
|
242
|
+
<!-- Long name truncated at maxNameWidth -->
|
|
243
|
+
<Variant
|
|
244
|
+
title="Long name"
|
|
245
|
+
:init-state="() => ({})"
|
|
246
|
+
>
|
|
247
|
+
<div style="padding: 3rem; display: flex; flex-direction: column; align-items: center; gap: 1rem;">
|
|
248
|
+
<ExperimentPopover
|
|
249
|
+
:experiment-name="LONG_NAME"
|
|
250
|
+
experiment-code="EXP-0159"
|
|
251
|
+
experiment-status="ongoing"
|
|
252
|
+
:experiment-id="159"
|
|
253
|
+
show-save
|
|
254
|
+
show-detach
|
|
255
|
+
/>
|
|
256
|
+
<ExperimentPopover
|
|
257
|
+
:experiment-name="LONG_NAME"
|
|
258
|
+
experiment-code="EXP-0159"
|
|
259
|
+
experiment-status="ongoing"
|
|
260
|
+
:max-name-width="120"
|
|
261
|
+
show-save
|
|
262
|
+
/>
|
|
263
|
+
</div>
|
|
264
|
+
<div style="text-align: center; font-size: 0.75rem; color: var(--text-muted); padding: 0 1rem 1rem;">
|
|
265
|
+
The name truncates at <code>maxNameWidth</code> (200px default, 120px below). Hover shows
|
|
266
|
+
"code · name"; the panel header wraps the full name.
|
|
267
|
+
</div>
|
|
268
|
+
</Variant>
|
|
269
|
+
|
|
172
270
|
<!-- Save success state -->
|
|
173
271
|
<Variant
|
|
174
272
|
title="Save — success"
|
|
@@ -206,8 +304,7 @@ const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'proces
|
|
|
206
304
|
/>
|
|
207
305
|
</div>
|
|
208
306
|
<p style="text-align: center; font-size: 0.75rem; color: var(--text-muted); padding: 0 2rem 1rem;">
|
|
209
|
-
Click
|
|
210
|
-
primary-blue icon, refined 15px title, and the full tactile-button system on both Cancel and Save.
|
|
307
|
+
Click Save to open the info <code>ConfirmDialog</code>. <code>confirmSave</code> defaults to true.
|
|
211
308
|
</p>
|
|
212
309
|
</Variant>
|
|
213
310
|
|
|
@@ -227,7 +324,7 @@ const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'proces
|
|
|
227
324
|
/>
|
|
228
325
|
</div>
|
|
229
326
|
<div style="text-align: center; font-size: 0.75rem; color: var(--text-muted); padding: 0 1rem 1rem;">
|
|
230
|
-
Hover
|
|
327
|
+
Hover Save to see the tooltip explaining why it's disabled.
|
|
231
328
|
</div>
|
|
232
329
|
</Variant>
|
|
233
330
|
|
|
@@ -244,8 +341,8 @@ const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'proces
|
|
|
244
341
|
/>
|
|
245
342
|
</div>
|
|
246
343
|
<div style="text-align: center; font-size: 0.75rem; color: var(--text-muted); padding: 0 1rem 1rem;">
|
|
247
|
-
When no <code>experimentCode</code> is provided (older data), the trigger
|
|
248
|
-
|
|
344
|
+
When no <code>experimentCode</code> is provided (older data), the trigger shows the name alone, so the UI
|
|
345
|
+
never reads as "unknown".
|
|
249
346
|
</div>
|
|
250
347
|
</Variant>
|
|
251
348
|
|
|
@@ -264,7 +361,6 @@ const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'proces
|
|
|
264
361
|
background: var(--bg-card);
|
|
265
362
|
border: 1px solid var(--border-light);
|
|
266
363
|
border-radius: var(--radius-lg);
|
|
267
|
-
box-shadow: var(--shadow-sm);
|
|
268
364
|
"
|
|
269
365
|
>
|
|
270
366
|
<!-- Mock: brand + page selector + plugin chip (visual only) -->
|
|
@@ -272,12 +368,12 @@ const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'proces
|
|
|
272
368
|
style="
|
|
273
369
|
width: 1.625rem;
|
|
274
370
|
height: 1.625rem;
|
|
275
|
-
background:
|
|
276
|
-
border-radius:
|
|
371
|
+
background: var(--color-primary);
|
|
372
|
+
border-radius: var(--radius-md);
|
|
277
373
|
display: grid;
|
|
278
374
|
place-items: center;
|
|
279
|
-
color:
|
|
280
|
-
font-family:
|
|
375
|
+
color: var(--text-on-accent);
|
|
376
|
+
font-family: var(--font-mono);
|
|
281
377
|
font-weight: 700;
|
|
282
378
|
font-size: 0.6875rem;
|
|
283
379
|
"
|
|
@@ -302,10 +398,10 @@ const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'proces
|
|
|
302
398
|
style="
|
|
303
399
|
width: 1.875rem;
|
|
304
400
|
height: 1.875rem;
|
|
305
|
-
background:
|
|
401
|
+
background: var(--bg-tertiary);
|
|
306
402
|
border: 1px solid var(--border-color);
|
|
307
403
|
border-radius: 9999px;
|
|
308
|
-
color:
|
|
404
|
+
color: var(--text-secondary);
|
|
309
405
|
display: grid;
|
|
310
406
|
place-items: center;
|
|
311
407
|
font-size: 0.6875rem;
|
|
@@ -316,7 +412,7 @@ const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'proces
|
|
|
316
412
|
</div>
|
|
317
413
|
</div>
|
|
318
414
|
<p style="margin-top: 1rem; font-size: 0.75rem; color: var(--text-muted); text-align: center;">
|
|
319
|
-
|
|
415
|
+
The joined group sits in the top bar's right cluster. The panel opens below, aligned to the group's left edge; near the viewport's right edge it aligns to the group's right edge.
|
|
320
416
|
</p>
|
|
321
417
|
</div>
|
|
322
418
|
</Variant>
|
|
@@ -329,15 +425,15 @@ const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'proces
|
|
|
329
425
|
<div style="padding: 2rem; display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 1.5rem;">
|
|
330
426
|
<div style="display: flex; flex-direction: column; align-items: center; gap: 0.625rem;">
|
|
331
427
|
<ExperimentPopover />
|
|
332
|
-
<span style="font-size: 0.6875rem; color: var(--text-muted); font-family:
|
|
428
|
+
<span style="font-size: 0.6875rem; color: var(--text-muted); font-family: var(--font-mono);">empty</span>
|
|
333
429
|
</div>
|
|
334
430
|
<div style="display: flex; flex-direction: column; align-items: center; gap: 0.625rem;">
|
|
335
431
|
<ExperimentPopover is-resolving show-detach />
|
|
336
|
-
<span style="font-size: 0.6875rem; color: var(--text-muted); font-family:
|
|
432
|
+
<span style="font-size: 0.6875rem; color: var(--text-muted); font-family: var(--font-mono);">resolving</span>
|
|
337
433
|
</div>
|
|
338
434
|
<div style="display: flex; flex-direction: column; align-items: center; gap: 0.625rem;">
|
|
339
435
|
<ExperimentPopover error="Experiment not found (404)" show-detach />
|
|
340
|
-
<span style="font-size: 0.6875rem; color: var(--text-muted); font-family:
|
|
436
|
+
<span style="font-size: 0.6875rem; color: var(--text-muted); font-family: var(--font-mono);">resolve failed</span>
|
|
341
437
|
</div>
|
|
342
438
|
<div style="display: flex; flex-direction: column; align-items: center; gap: 0.625rem;">
|
|
343
439
|
<ExperimentPopover
|
|
@@ -346,7 +442,7 @@ const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'proces
|
|
|
346
442
|
experiment-status="ongoing"
|
|
347
443
|
show-detach
|
|
348
444
|
/>
|
|
349
|
-
<span style="font-size: 0.6875rem; color: var(--text-muted); font-family:
|
|
445
|
+
<span style="font-size: 0.6875rem; color: var(--text-muted); font-family: var(--font-mono);">selected</span>
|
|
350
446
|
</div>
|
|
351
447
|
<div style="display: flex; flex-direction: column; align-items: center; gap: 0.625rem;">
|
|
352
448
|
<ExperimentPopover
|
|
@@ -357,7 +453,7 @@ const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'proces
|
|
|
357
453
|
show-detach
|
|
358
454
|
:confirm-save="false"
|
|
359
455
|
/>
|
|
360
|
-
<span style="font-size: 0.6875rem; color: var(--text-muted); font-family:
|
|
456
|
+
<span style="font-size: 0.6875rem; color: var(--text-muted); font-family: var(--font-mono);">selected + save</span>
|
|
361
457
|
</div>
|
|
362
458
|
<div style="display: flex; flex-direction: column; align-items: center; gap: 0.625rem;">
|
|
363
459
|
<ExperimentPopover
|
|
@@ -367,7 +463,7 @@ const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'proces
|
|
|
367
463
|
show-save
|
|
368
464
|
save-loading
|
|
369
465
|
/>
|
|
370
|
-
<span style="font-size: 0.6875rem; color: var(--text-muted); font-family:
|
|
466
|
+
<span style="font-size: 0.6875rem; color: var(--text-muted); font-family: var(--font-mono);">save loading</span>
|
|
371
467
|
</div>
|
|
372
468
|
<div style="display: flex; flex-direction: column; align-items: center; gap: 0.625rem;">
|
|
373
469
|
<ExperimentPopover
|
|
@@ -377,7 +473,21 @@ const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'proces
|
|
|
377
473
|
show-save
|
|
378
474
|
save-success-message="Saved"
|
|
379
475
|
/>
|
|
380
|
-
<span style="font-size: 0.6875rem; color: var(--text-muted); font-family:
|
|
476
|
+
<span style="font-size: 0.6875rem; color: var(--text-muted); font-family: var(--font-mono);">save success</span>
|
|
477
|
+
</div>
|
|
478
|
+
<div style="display: flex; flex-direction: column; align-items: center; gap: 0.625rem;">
|
|
479
|
+
<ExperimentPopover
|
|
480
|
+
:experiment-name="EXPERIMENT_NAMES[2]"
|
|
481
|
+
experiment-code="EXP-204"
|
|
482
|
+
experiment-status="ongoing"
|
|
483
|
+
show-save
|
|
484
|
+
dirty
|
|
485
|
+
/>
|
|
486
|
+
<span style="font-size: 0.6875rem; color: var(--text-muted); font-family: var(--font-mono);">save dirty</span>
|
|
487
|
+
</div>
|
|
488
|
+
<div style="display: flex; flex-direction: column; align-items: center; gap: 0.625rem;">
|
|
489
|
+
<ExperimentPopover :experiment-name="LONG_NAME" experiment-code="EXP-0159" show-save />
|
|
490
|
+
<span style="font-size: 0.6875rem; color: var(--text-muted); font-family: var(--font-mono);">long name</span>
|
|
381
491
|
</div>
|
|
382
492
|
<div style="display: flex; flex-direction: column; align-items: center; gap: 0.625rem;">
|
|
383
493
|
<ExperimentPopover
|
|
@@ -388,7 +498,7 @@ const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'proces
|
|
|
388
498
|
save-disabled
|
|
389
499
|
save-disabled-message="No data yet"
|
|
390
500
|
/>
|
|
391
|
-
<span style="font-size: 0.6875rem; color: var(--text-muted); font-family:
|
|
501
|
+
<span style="font-size: 0.6875rem; color: var(--text-muted); font-family: var(--font-mono);">save disabled</span>
|
|
392
502
|
</div>
|
|
393
503
|
</div>
|
|
394
504
|
</Variant>
|
|
@@ -398,22 +508,24 @@ const STATUSES = ['planned', 'ongoing', 'completed', 'ready_to_extract', 'proces
|
|
|
398
508
|
<docs lang="md">
|
|
399
509
|
## ExperimentPopover
|
|
400
510
|
|
|
401
|
-
The experiment
|
|
402
|
-
|
|
403
|
-
|
|
511
|
+
The experiment control in `AppTopBar`'s right cluster. Shows the attached
|
|
512
|
+
experiment (code badge + name), opens a 300px summary panel, and optionally joins
|
|
513
|
+
a Save button into one bordered group: `[ EXP-0159 Glucose tracing… ▾ | Save ]`.
|
|
404
514
|
|
|
405
|
-
###
|
|
515
|
+
### Design v2
|
|
406
516
|
|
|
407
|
-
- **
|
|
408
|
-
|
|
409
|
-
- **
|
|
410
|
-
|
|
411
|
-
-
|
|
412
|
-
|
|
413
|
-
- **
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
517
|
+
- **Trigger** 30px, borderless; hover and open fill `--bg-hover`. The name
|
|
518
|
+
truncates at `maxNameWidth` (default 200px); `title` is "code · name".
|
|
519
|
+
- **Joined group** (`showSave`) 1px `--border-color`, `--radius-md`,
|
|
520
|
+
`--bg-card`. Save: `--color-primary` fill, `--text-on-accent` text, 13px/600,
|
|
521
|
+
cloud-upload icon, 1px left divider. `saveLoading` shows a spinner and
|
|
522
|
+
"Saving…" and disables the button; `dirty` adds a ringed dot.
|
|
523
|
+
- **Panel** code badge, name (wraps), Project / Status / Owner / Updated, a
|
|
524
|
+
separator, then three menu rows: Change experiment…, Open in MINT (new tab to
|
|
525
|
+
`/experiments/{experimentId}`), Detach (danger, `showDetach` only). No buttons.
|
|
526
|
+
- **Empty** dashed trigger with a link icon and `placeholder`; one click emits
|
|
527
|
+
`select`.
|
|
528
|
+
- Flat: no lift, no glow, no coloured shadow.
|
|
417
529
|
|
|
418
530
|
### Binding states
|
|
419
531
|
|
|
@@ -424,11 +536,11 @@ The chip renders four mutually exclusive states, in this order:
|
|
|
424
536
|
| Resolving | `isResolving` | placeholder bar (`aria-busy`) |
|
|
425
537
|
| Failed | `error` | "Experiment unavailable" |
|
|
426
538
|
| Linked | `experimentName` / `experimentCode` | the platform's name, code as fallback |
|
|
427
|
-
| Empty | none of the above | "
|
|
539
|
+
| Empty | none of the above | `placeholder` ("Attach experiment") |
|
|
428
540
|
|
|
429
541
|
Resolving and failed exist because an experiment can be *bound by id* before its
|
|
430
542
|
record arrives — a deep link, or a restored session. In those states the chip must
|
|
431
|
-
not read
|
|
543
|
+
not read as empty, and it must never substitute the numeric id for a name:
|
|
432
544
|
**a displayed name only ever comes from the platform.** Detach stays reachable in
|
|
433
545
|
the failed state so a user is never stranded on an experiment that cannot load.
|
|
434
546
|
|
|
@@ -436,7 +548,7 @@ the failed state so a user is never stranded on an experiment that cannot load.
|
|
|
436
548
|
|
|
437
549
|
| Event | When |
|
|
438
550
|
|---|---|
|
|
439
|
-
| `select` | User clicked
|
|
440
|
-
| `save` | User clicked
|
|
551
|
+
| `select` | User clicked the empty trigger or **Change experiment…** → parent opens `ExperimentSelectorModal`. |
|
|
552
|
+
| `save` | User clicked Save (or confirmed the ConfirmDialog, on by default via `confirmSave`). |
|
|
441
553
|
| `detach` | User clicked detach. |
|
|
442
554
|
</docs>
|