@opentrons/components 0.1.6-alpha.2 → 0.1.6-alpha.20
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/Makefile +5 -1
- package/package.json +6 -7
- package/src/__mocks__/file.js +10 -0
- package/src/alerts/AlertItem.stories.tsx +49 -0
- package/src/alerts/AlertItem.tsx +85 -0
- package/src/alerts/index.ts +3 -0
- package/src/atoms/Checkbox/Checkbox.stories.tsx +24 -0
- package/src/atoms/Checkbox/index.tsx +127 -0
- package/src/atoms/CheckboxField/CheckboxField.stories.tsx +30 -0
- package/src/atoms/CheckboxField/index.tsx +171 -0
- package/src/atoms/Chip/Chip.stories.tsx +59 -0
- package/src/atoms/Chip/index.tsx +172 -0
- package/src/atoms/Divider/index.tsx +15 -0
- package/src/atoms/InputField/InputField.stories.tsx +77 -0
- package/src/atoms/InputField/index.tsx +383 -0
- package/src/atoms/ListButton/ListButton.stories.tsx +133 -0
- package/src/atoms/ListButton/ListButtonChildren/ListButtonAccordion.tsx +65 -0
- package/src/atoms/ListButton/ListButtonChildren/ListButtonAccordionContainer.tsx +23 -0
- package/src/atoms/ListButton/ListButtonChildren/ListButtonRadioButton.tsx +108 -0
- package/src/atoms/ListButton/ListButtonChildren/index.ts +3 -0
- package/src/atoms/ListButton/index.tsx +72 -0
- package/src/atoms/ListItem/ListItem.stories.tsx +96 -0
- package/src/atoms/ListItem/ListItemChildren/ListItemCustomize.tsx +78 -0
- package/src/atoms/ListItem/ListItemChildren/ListItemDescriptor.tsx +42 -0
- package/src/atoms/ListItem/ListItemChildren/index.ts +2 -0
- package/src/atoms/ListItem/index.tsx +89 -0
- package/src/atoms/MenuList/MenuItem.stories.tsx +20 -0
- package/src/atoms/MenuList/MenuItem.tsx +55 -0
- package/src/atoms/MenuList/MenuList.stories.tsx +31 -0
- package/src/atoms/MenuList/OverflowBtn.stories.tsx +17 -0
- package/src/atoms/MenuList/OverflowBtn.tsx +76 -0
- package/src/atoms/MenuList/index.tsx +50 -0
- package/src/atoms/Snackbar/Snackbar.stories.tsx +67 -0
- package/src/atoms/Snackbar/index.tsx +91 -0
- package/src/atoms/StepMeter/index.tsx +53 -0
- package/src/atoms/StyledText/LegacyStyledText.stories.tsx +106 -0
- package/src/atoms/StyledText/LegacyStyledText.tsx +95 -0
- package/src/atoms/StyledText/StyledText.stories.tsx +46 -0
- package/src/atoms/StyledText/StyledText.tsx +323 -0
- package/src/atoms/StyledText/index.ts +2 -0
- package/src/atoms/Tag/Tag.stories.tsx +48 -0
- package/src/atoms/Tag/index.tsx +116 -0
- package/src/atoms/Toast/ODDToast.stories.tsx +68 -0
- package/src/atoms/Toast/Toast.stories.tsx +55 -0
- package/src/atoms/Toast/index.tsx +439 -0
- package/src/atoms/ToggleGroup/ToggleGroup.stories.tsx +39 -0
- package/src/atoms/ToggleGroup/index.tsx +91 -0
- package/src/atoms/Tooltip/Tooltip.stories.tsx +99 -0
- package/src/atoms/Tooltip/index.tsx +38 -0
- package/src/atoms/buttons/AlertPrimaryButton.tsx +26 -0
- package/src/atoms/buttons/AltPrimaryButton.tsx +31 -0
- package/src/atoms/buttons/EmptySelectorButton.stories.tsx +36 -0
- package/src/atoms/buttons/EmptySelectorButton.tsx +83 -0
- package/src/atoms/buttons/LargeButton.stories.tsx +99 -0
- package/src/atoms/buttons/LargeButton.tsx +320 -0
- package/src/atoms/buttons/PrimaryButton.tsx +36 -0
- package/src/atoms/buttons/RadioButton.stories.tsx +35 -0
- package/src/atoms/buttons/RadioButton.tsx +217 -0
- package/src/atoms/buttons/SecondaryButton.tsx +62 -0
- package/src/atoms/buttons/buttons.stories.tsx +78 -0
- package/src/atoms/buttons/index.ts +6 -0
- package/src/atoms/index.ts +20 -0
- package/src/barrel.ts +10 -0
- package/src/buttons/Button.tsx +96 -0
- package/src/buttons/DeprecatedPrimaryButton.tsx +24 -0
- package/src/buttons/FlatButton.tsx +21 -0
- package/src/buttons/IconButton.tsx +37 -0
- package/src/buttons/OutlineButton.tsx +24 -0
- package/src/buttons/index.ts +7 -0
- package/src/controls/ControlInfo.tsx +13 -0
- package/src/controls/LabeledButton.tsx +28 -0
- package/src/controls/LabeledCheckbox.tsx +35 -0
- package/src/controls/LabeledControl.tsx +24 -0
- package/src/controls/LabeledRadioGroup.tsx +27 -0
- package/src/controls/LabeledSelect.tsx +34 -0
- package/src/controls/LabeledToggle.tsx +35 -0
- package/src/controls/StackedLabeledControl.tsx +28 -0
- package/src/controls/ToggleButton.tsx +25 -0
- package/src/controls/index.ts +10 -0
- package/src/forms/DeprecatedCheckboxField.stories.tsx +31 -0
- package/src/forms/DeprecatedCheckboxField.tsx +94 -0
- package/src/forms/DropdownField.stories.tsx +44 -0
- package/src/forms/DropdownField.tsx +106 -0
- package/src/forms/FormGroup.stories.tsx +31 -0
- package/src/forms/FormGroup.tsx +53 -0
- package/src/forms/InputField.stories.tsx +41 -0
- package/src/forms/LegacyInputField.tsx +123 -0
- package/src/forms/RadioGroup.stories.tsx +44 -0
- package/src/forms/RadioGroup.tsx +87 -0
- package/src/forms/Select.stories.tsx +117 -0
- package/src/forms/Select.tsx +132 -0
- package/src/forms/SelectField.tsx +94 -0
- package/src/forms/ToggleField.stories.tsx +31 -0
- package/src/forms/ToggleField.tsx +59 -0
- package/src/forms/index.ts +8 -0
- package/src/hardware-sim/BaseDeck/BaseDeck.stories.tsx +94 -0
- package/src/hardware-sim/BaseDeck/BaseDeck.tsx +423 -0
- package/src/hardware-sim/BaseDeck/SingleSlotFixture.tsx +199 -0
- package/src/hardware-sim/BaseDeck/SlotBase.tsx +5 -0
- package/src/hardware-sim/BaseDeck/SlotClip.tsx +15 -0
- package/src/hardware-sim/BaseDeck/StagingAreaFixture.tsx +114 -0
- package/src/hardware-sim/BaseDeck/WasteChuteFixture.tsx +114 -0
- package/src/hardware-sim/BaseDeck/WasteChuteStagingAreaFixture.tsx +68 -0
- package/src/hardware-sim/BaseDeck/__fixtures__/index.ts +165 -0
- package/src/hardware-sim/BaseDeck/index.ts +5 -0
- package/src/hardware-sim/BaseDeck/something.test.tsx +7 -0
- package/src/hardware-sim/Deck/DeckFromLayers.tsx +58 -0
- package/src/hardware-sim/Deck/FlexTrash.tsx +128 -0
- package/src/hardware-sim/Deck/MoveLabwareOnDeck.stories.tsx +97 -0
- package/src/hardware-sim/Deck/MoveLabwareOnDeck.tsx +251 -0
- package/src/hardware-sim/Deck/OT2Layers.tsx +153 -0
- package/src/hardware-sim/Deck/RobotCoordsForeignDiv.tsx +46 -0
- package/src/hardware-sim/Deck/RobotCoordsForeignObject.tsx +42 -0
- package/src/hardware-sim/Deck/RobotCoordsText.tsx +32 -0
- package/src/hardware-sim/Deck/RobotWorkSpace.tsx +90 -0
- package/src/hardware-sim/Deck/SlotLabels.tsx +111 -0
- package/src/hardware-sim/Deck/__mocks__/getDeckDefinitions.ts +29 -0
- package/src/hardware-sim/Deck/constants.ts +12 -0
- package/src/hardware-sim/Deck/index.tsx +8 -0
- package/src/hardware-sim/DeckConfigurator/AbsorbanceReaderFixture.tsx +91 -0
- package/src/hardware-sim/DeckConfigurator/DeckConfigurator.stories.tsx +110 -0
- package/src/hardware-sim/DeckConfigurator/EmptyConfigFixture.tsx +131 -0
- package/src/hardware-sim/DeckConfigurator/HeaterShakerFixture.tsx +102 -0
- package/src/hardware-sim/DeckConfigurator/MagneticBlockFixture.tsx +130 -0
- package/src/hardware-sim/DeckConfigurator/StagingAreaConfigFixture.tsx +89 -0
- package/src/hardware-sim/DeckConfigurator/StaticFixture.tsx +54 -0
- package/src/hardware-sim/DeckConfigurator/TemperatureModuleFixture.tsx +103 -0
- package/src/hardware-sim/DeckConfigurator/ThermocyclerFixture.tsx +89 -0
- package/src/hardware-sim/DeckConfigurator/TrashBinConfigFixture.tsx +99 -0
- package/src/hardware-sim/DeckConfigurator/WasteChuteConfigFixture.tsx +96 -0
- package/src/hardware-sim/DeckConfigurator/constants.ts +81 -0
- package/src/hardware-sim/DeckConfigurator/index.tsx +285 -0
- package/src/hardware-sim/DeckSlotLocation/index.tsx +88 -0
- package/src/hardware-sim/Labware/Labware.tsx +173 -0
- package/src/hardware-sim/Labware/LabwareAdapter/Opentrons96DeepWellAdapter.tsx +23 -0
- package/src/hardware-sim/Labware/LabwareAdapter/Opentrons96FlatBottomAdapter.tsx +7 -0
- package/src/hardware-sim/Labware/LabwareAdapter/OpentronsAluminumFlatBottomPlate.tsx +13 -0
- package/src/hardware-sim/Labware/LabwareAdapter/OpentronsAutoclavableDeckRiser.tsx +100 -0
- package/src/hardware-sim/Labware/LabwareAdapter/OpentronsFlex96TiprackAdapter.tsx +13 -0
- package/src/hardware-sim/Labware/LabwareAdapter/OpentronsToughPCRAutoSealingLid.tsx +83 -0
- package/src/hardware-sim/Labware/LabwareAdapter/OpentronsUniversalFlatAdapter.tsx +13 -0
- package/src/hardware-sim/Labware/LabwareAdapter/index.tsx +73 -0
- package/src/hardware-sim/Labware/LabwareRender.stories.tsx +96 -0
- package/src/hardware-sim/Labware/LabwareRender.tsx +173 -0
- package/src/hardware-sim/Labware/LabwareStackRender.tsx +272 -0
- package/src/hardware-sim/Labware/index.ts +6 -0
- package/src/hardware-sim/Labware/labwareInternals/FilledWells.tsx +39 -0
- package/src/hardware-sim/Labware/labwareInternals/LabwareOutline.tsx +133 -0
- package/src/hardware-sim/Labware/labwareInternals/LabwareWellLabels.tsx +118 -0
- package/src/hardware-sim/Labware/labwareInternals/StaticLabware.tsx +121 -0
- package/src/hardware-sim/Labware/labwareInternals/StrokedWells.tsx +38 -0
- package/src/hardware-sim/Labware/labwareInternals/StyledWells.tsx +77 -0
- package/src/hardware-sim/Labware/labwareInternals/Well.tsx +74 -0
- package/src/hardware-sim/Labware/labwareInternals/WellLabels.tsx +121 -0
- package/src/hardware-sim/Labware/labwareInternals/index.ts +8 -0
- package/src/hardware-sim/Labware/labwareInternals/types.ts +18 -0
- package/src/hardware-sim/Module/HeaterShaker.tsx +83 -0
- package/src/hardware-sim/Module/MagneticBlock.tsx +49 -0
- package/src/hardware-sim/Module/MagneticModule.tsx +51 -0
- package/src/hardware-sim/Module/Module.stories.tsx +90 -0
- package/src/hardware-sim/Module/ModuleTag.tsx +38 -0
- package/src/hardware-sim/Module/PlateReader.tsx +208 -0
- package/src/hardware-sim/Module/Temperature.tsx +54 -0
- package/src/hardware-sim/Module/Thermocycler/ThermocyclerGEN1.tsx +248 -0
- package/src/hardware-sim/Module/Thermocycler/ThermocyclerGEN2.tsx +286 -0
- package/src/hardware-sim/Module/Thermocycler/index.tsx +49 -0
- package/src/hardware-sim/Module/index.tsx +227 -0
- package/src/hardware-sim/Pipette/EightEmanatingNozzles.tsx +23 -0
- package/src/hardware-sim/Pipette/EmanatingNozzle.tsx +52 -0
- package/src/hardware-sim/Pipette/PipetteRender.stories.tsx +71 -0
- package/src/hardware-sim/Pipette/PipetteRender.tsx +92 -0
- package/src/hardware-sim/Pipette/constants.ts +10 -0
- package/src/hardware-sim/Pipette/index.ts +1 -0
- package/src/hardware-sim/ProtocolDeck/LabwareInfo.tsx +68 -0
- package/src/hardware-sim/ProtocolDeck/ProtocolDeck.stories.tsx +25 -0
- package/src/hardware-sim/ProtocolDeck/__fixtures__/analysis_QIAseqFX24xv4_8.json +47145 -0
- package/src/hardware-sim/ProtocolDeck/index.tsx +174 -0
- package/src/hardware-sim/ProtocolDeck/types.ts +6 -0
- package/src/hardware-sim/ProtocolDeck/utils/getInitiallyLoadedLabwareByAdapter.ts +33 -0
- package/src/hardware-sim/ProtocolDeck/utils/getLabwareInSlots.ts +155 -0
- package/src/hardware-sim/ProtocolDeck/utils/getLabwareInfoByLiquidId.ts +42 -0
- package/src/hardware-sim/ProtocolDeck/utils/getModulesInSlots.ts +129 -0
- package/src/hardware-sim/ProtocolDeck/utils/getStandardDeckViewLayerBlockList.ts +29 -0
- package/src/hardware-sim/ProtocolDeck/utils/getWellFillFromLabwareId.ts +30 -0
- package/src/hardware-sim/ProtocolDeck/utils/index.ts +3 -0
- package/src/hardware-sim/RobotCoordinateSpace/RobotCoordinateSpace.tsx +28 -0
- package/src/hardware-sim/RobotCoordinateSpace/RobotCoordinateSpaceWithRef.tsx +52 -0
- package/src/hardware-sim/RobotCoordinateSpace/index.ts +2 -0
- package/src/hardware-sim/index.ts +11 -0
- package/src/hardware-sim/utils.ts +18 -0
- package/src/helix-design-system/borders.ts +32 -0
- package/src/helix-design-system/colors.ts +100 -0
- package/src/helix-design-system/index.ts +4 -0
- package/src/helix-design-system/product/index.ts +1 -0
- package/src/helix-design-system/product/typography.ts +151 -0
- package/src/helix-design-system/style.ts +2 -0
- package/src/hooks/index.ts +15 -0
- package/src/hooks/useConditionalConfirm.ts +70 -0
- package/src/hooks/useDrag.ts +90 -0
- package/src/hooks/useIdle.ts +68 -0
- package/src/hooks/useInterval.ts +38 -0
- package/src/hooks/useLongPress.ts +83 -0
- package/src/hooks/useMenuHandleClickOutside.tsx +46 -0
- package/src/hooks/useMountEffect.ts +12 -0
- package/src/hooks/usePrevious.ts +19 -0
- package/src/hooks/useScrolling.ts +33 -0
- package/src/hooks/useSelectDeckLocation/SelectDeckLocation.stories.tsx +55 -0
- package/src/hooks/useSelectDeckLocation/index.tsx +331 -0
- package/src/hooks/useSwipe.ts +86 -0
- package/src/hooks/useTimeout.ts +33 -0
- package/src/hooks/useToggle.ts +27 -0
- package/src/icons/Icon.stories.tsx +37 -0
- package/src/icons/Icon.tsx +79 -0
- package/src/icons/IconList.stories.tsx +108 -0
- package/src/icons/ModuleIcon.tsx +48 -0
- package/src/icons/NotificationIcon.tsx +41 -0
- package/src/icons/icon-data.ts +821 -0
- package/src/icons/index.ts +6 -0
- package/src/images/index.ts +1 -0
- package/src/images/labware/index.ts +1 -0
- package/src/images/labware/measurement-guide/images/depth/depth-plate-flat@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/depth/depth-plate-round@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/depth/depth-plate-v@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/depth/depth-reservoir-and-tubes-flat@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/depth/depth-reservoir-and-tubes-round@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/depth/depth-reservoir-and-tubes-v@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/depth/length-tip-rack@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/dimensions/footprint@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/dimensions/height-alum-block-plate@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/dimensions/height-alum-block-tubes@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/dimensions/height-plate-and-reservoir@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/dimensions/height-tip-rack@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/dimensions/height-tube-rack-irregular@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/dimensions/height-tube-rack@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/offset/offset-reservoir@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/offset/offset-well-circular@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/offset/offset-well-rectangular@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/shape/shape-circular@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/shape/shape-rectangular@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/spacing/spacing-reservoir-multi-row@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/spacing/spacing-reservoir@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/spacing/spacing-well-circular@3x.png +0 -0
- package/src/images/labware/measurement-guide/images/spacing/spacing-well-rectangular@3x.png +0 -0
- package/src/images/labware/measurement-guide/index.ts +272 -0
- package/src/index.ts +2 -0
- package/src/instrument/InstrumentDiagram.stories.tsx +42 -0
- package/src/instrument/InstrumentDiagram.tsx +58 -0
- package/src/instrument/InstrumentGroup.stories.tsx +88 -0
- package/src/instrument/InstrumentGroup.tsx +35 -0
- package/src/instrument/InstrumentInfo.tsx +107 -0
- package/src/instrument/PipetteSelect.stories.tsx +40 -0
- package/src/instrument/PipetteSelect.tsx +170 -0
- package/src/instrument/eight-channel-flex.png +0 -0
- package/src/instrument/index.ts +4 -0
- package/src/instrument/multi-channel_GEN1_800px.png +0 -0
- package/src/instrument/multi-channel_GEN2_800px.png +0 -0
- package/src/instrument/ninety-six-channel-gen1.png +0 -0
- package/src/instrument/pipetteGEN2Multi.png +0 -0
- package/src/instrument/pipetteGEN2Single.png +0 -0
- package/src/instrument/pipetteMulti.png +0 -0
- package/src/instrument/pipetteSingle.png +0 -0
- package/src/instrument/single-channel-flex.png +0 -0
- package/src/instrument/single-channel_GEN2_800px.png +0 -0
- package/src/instrument/single_channel_GEN1_800px.png +0 -0
- package/src/interaction-enhancers/ClickOutside.ts +57 -0
- package/src/interaction-enhancers/HandleKeypress.tsx +69 -0
- package/src/interaction-enhancers/index.ts +4 -0
- package/src/interaction-enhancers/useHover.ts +84 -0
- package/src/interaction-enhancers/useOnClickOutside.ts +42 -0
- package/src/legacy-hardware-sim/LabwareNameOverlay.tsx +22 -0
- package/src/legacy-hardware-sim/ModuleItem.tsx +145 -0
- package/src/legacy-hardware-sim/index.ts +2 -0
- package/src/lists/SidePanelGroup.tsx +48 -0
- package/src/lists/TitledList.tsx +155 -0
- package/src/lists/index.ts +3 -0
- package/src/modals/AlertModal.tsx +89 -0
- package/src/modals/ContinueModal.tsx +32 -0
- package/src/modals/LegacyModal.tsx +59 -0
- package/src/modals/Modal.stories.tsx +52 -0
- package/src/modals/Modal.tsx +96 -0
- package/src/modals/ModalHeader.tsx +100 -0
- package/src/modals/ModalShell.tsx +155 -0
- package/src/modals/Overlay.tsx +38 -0
- package/src/modals/SpinnerModal.tsx +35 -0
- package/src/modals/SpinnerModalPage.tsx +30 -0
- package/src/modals/index.ts +10 -0
- package/src/molecules/Banner/Banner.stories.tsx +41 -0
- package/src/molecules/Banner/index.tsx +147 -0
- package/src/molecules/DeckInfoLabel/DeckInfoLabel.stories.tsx +65 -0
- package/src/molecules/DeckInfoLabel/index.tsx +95 -0
- package/src/molecules/DeckLabel/DeckLabel.stories.tsx +31 -0
- package/src/molecules/DeckLabel/index.tsx +80 -0
- package/src/molecules/DropdownMenu/DropdownMenu.stories.tsx +30 -0
- package/src/molecules/DropdownMenu/index.tsx +343 -0
- package/src/molecules/InfoScreen/InfoScreen.stories.tsx +50 -0
- package/src/molecules/InfoScreen/index.tsx +54 -0
- package/src/molecules/LiquidIcon/LiquidIcon.stories.tsx +53 -0
- package/src/molecules/LiquidIcon/index.tsx +68 -0
- package/src/molecules/ParametersTable/ParametersTable.stories.tsx +172 -0
- package/src/molecules/ParametersTable/index.tsx +198 -0
- package/src/molecules/Tabs/Tabs.stories.tsx +74 -0
- package/src/molecules/Tabs/index.tsx +94 -0
- package/src/molecules/index.ts +8 -0
- package/src/nav/SidePanel.stories.tsx +29 -0
- package/src/nav/SidePanel.tsx +21 -0
- package/src/nav/index.ts +2 -0
- package/src/organisms/DeckLabelSet/DeckLabelSet.stories.tsx +46 -0
- package/src/organisms/DeckLabelSet/index.tsx +69 -0
- package/src/organisms/EndUserAgreementFooter/index.tsx +49 -0
- package/src/organisms/Toolbox/Toolbox.stories.tsx +23 -0
- package/src/organisms/Toolbox/index.tsx +160 -0
- package/src/organisms/index.ts +3 -0
- package/src/primitives/Box.stories.tsx +25 -0
- package/src/primitives/Box.tsx +17 -0
- package/src/primitives/Btn.stories.tsx +105 -0
- package/src/primitives/Btn.tsx +266 -0
- package/src/primitives/Flex.stories.tsx +50 -0
- package/src/primitives/Flex.tsx +17 -0
- package/src/primitives/ForeignObject.tsx +70 -0
- package/src/primitives/Link.stories.tsx +27 -0
- package/src/primitives/Link.tsx +32 -0
- package/src/primitives/README.md +188 -0
- package/src/primitives/Svg.stories.tsx +36 -0
- package/src/primitives/Svg.tsx +68 -0
- package/src/primitives/Text.stories.tsx +17 -0
- package/src/primitives/Text.tsx +18 -0
- package/src/primitives/index.ts +10 -0
- package/src/primitives/style-props.ts +197 -0
- package/src/primitives/types.ts +120 -0
- package/src/robot-types.ts +4 -0
- package/src/slotmap/OT2SlotMap.tsx +73 -0
- package/src/slotmap/index.ts +1 -0
- package/src/structure/Card.stories.tsx +28 -0
- package/src/structure/Card.tsx +64 -0
- package/src/structure/LabeledValue.stories.tsx +17 -0
- package/src/structure/LabeledValue.tsx +31 -0
- package/src/structure/Pill.tsx +43 -0
- package/src/structure/Splash.stories.tsx +24 -0
- package/src/structure/Splash.tsx +22 -0
- package/src/structure/TitleBar.stories.tsx +42 -0
- package/src/structure/TitleBar.tsx +81 -0
- package/src/structure/index.ts +7 -0
- package/src/styles/borders.ts +16 -0
- package/src/styles/colors.ts +58 -0
- package/src/styles/cursor.ts +12 -0
- package/src/styles/flexbox.ts +39 -0
- package/src/styles/index.ts +8 -0
- package/src/styles/layout.ts +31 -0
- package/src/styles/position.ts +5 -0
- package/src/styles/spacing.ts +11 -0
- package/src/styles/typography.ts +90 -0
- package/src/testing/utils/index.ts +2 -0
- package/src/testing/utils/matchers.ts +31 -0
- package/src/testing/utils/renderWithProviders.tsx +53 -0
- package/src/tooltips/DeprecatedTooltip.tsx +105 -0
- package/src/tooltips/HoverTooltip.tsx +83 -0
- package/src/tooltips/LegacyTooltip.stories.tsx +98 -0
- package/src/tooltips/LegacyTooltip.tsx +151 -0
- package/src/tooltips/constants.ts +28 -0
- package/src/tooltips/index.ts +10 -0
- package/src/tooltips/styles.ts +20 -0
- package/src/tooltips/types.ts +73 -0
- package/src/tooltips/useHoverTooltip.ts +47 -0
- package/src/tooltips/usePopper.ts +87 -0
- package/src/tooltips/useTooltip.ts +100 -0
- package/src/ui-style-constants/index.ts +4 -0
- package/src/ui-style-constants/responsiveness.ts +15 -0
- package/src/ui-style-constants/spacing.ts +18 -0
- package/src/ui-style-constants/typography.ts +258 -0
- package/src/ui-style-constants/viewport.ts +18 -0
- package/src/utils.ts +56 -0
- package/{vite.config.ts → vite.config.mts} +2 -0
- package/lib/index.mjs +0 -19869
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import type * as React from 'react'
|
|
2
|
+
|
|
3
|
+
import { Select } from './Select'
|
|
4
|
+
import styles from './Select.module.css'
|
|
5
|
+
|
|
6
|
+
import type { Story, Meta } from '@storybook/react'
|
|
7
|
+
|
|
8
|
+
export default {
|
|
9
|
+
title: 'Library/Molecules/Forms/Select',
|
|
10
|
+
component: Select,
|
|
11
|
+
} as Meta
|
|
12
|
+
|
|
13
|
+
const Template: Story<React.ComponentProps<typeof Select>> = args => (
|
|
14
|
+
<Select {...args} />
|
|
15
|
+
)
|
|
16
|
+
export const Basic = Template.bind({})
|
|
17
|
+
Basic.parameters = {
|
|
18
|
+
docs: {
|
|
19
|
+
description: {
|
|
20
|
+
component:
|
|
21
|
+
'Thin wrapper around `react-select` to apply our Opentrons-specific styles. All props are passed directly to [`react-select`](https://react-select.com/props) except for `styles`, `components`, and `classNamePrefix`. The `className` prop appends to the `className` we pass `react-select`. Those props are not passed directly because they provide the base styling of the component',
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
}
|
|
25
|
+
Basic.args = {
|
|
26
|
+
options: [
|
|
27
|
+
{ label: 'DNA', value: 'dna' },
|
|
28
|
+
{ label: 'RNA', value: 'rna' },
|
|
29
|
+
{ label: 'Protein', value: 'protein', isDisabled: true },
|
|
30
|
+
],
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const GroupedOptions = Template.bind({})
|
|
34
|
+
GroupedOptions.parameters = {
|
|
35
|
+
docs: {
|
|
36
|
+
description: {
|
|
37
|
+
component: 'You can also pass grouped options:',
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
}
|
|
41
|
+
GroupedOptions.args = {
|
|
42
|
+
options: [
|
|
43
|
+
{
|
|
44
|
+
label: 'Nucleic Acids',
|
|
45
|
+
options: [
|
|
46
|
+
{ label: 'DNA', value: 'dna' },
|
|
47
|
+
{ label: 'RNA', value: 'rna' },
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
label: 'Polypeptides',
|
|
52
|
+
options: [
|
|
53
|
+
{ label: 'Dipeptide', value: 'dipeptide' },
|
|
54
|
+
{ label: 'Tripeptide', value: 'Tripeptide' },
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export const Controlled = Template.bind({})
|
|
61
|
+
Controlled.parameters = {
|
|
62
|
+
docs: {
|
|
63
|
+
description: {
|
|
64
|
+
component:
|
|
65
|
+
'Passing `value` controls the input. **Note that `value` has the same format as an entry in `options`**',
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
}
|
|
69
|
+
Controlled.args = {
|
|
70
|
+
value: { label: 'DNA', value: 'dna' },
|
|
71
|
+
options: [
|
|
72
|
+
{ label: 'DNA', value: 'dna' },
|
|
73
|
+
{ label: 'RNA', value: 'rna' },
|
|
74
|
+
{ label: 'Protein', value: 'protein' },
|
|
75
|
+
],
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export const FormattedOptionLabel = Template.bind({})
|
|
79
|
+
FormattedOptionLabel.parameters = {
|
|
80
|
+
docs: {
|
|
81
|
+
description: {
|
|
82
|
+
component:
|
|
83
|
+
'You can control the renders of individual options with the `formatOptionLabel` prop:',
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
}
|
|
87
|
+
FormattedOptionLabel.args = {
|
|
88
|
+
options: [
|
|
89
|
+
{ label: 'DNA', value: 'dna' },
|
|
90
|
+
{ label: 'RNA', value: 'rna' },
|
|
91
|
+
{ label: 'Protein', value: 'protein' },
|
|
92
|
+
],
|
|
93
|
+
formatOptionLabel: (option, { context }) =>
|
|
94
|
+
context === 'menu' && option.value === 'rna' ? (
|
|
95
|
+
<span style={{ color: 'green' }}>{option.label}</span>
|
|
96
|
+
) : (
|
|
97
|
+
option.label
|
|
98
|
+
),
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export const StyleOverride = Template.bind({})
|
|
102
|
+
StyleOverride.parameters = {
|
|
103
|
+
docs: {
|
|
104
|
+
description: {
|
|
105
|
+
component:
|
|
106
|
+
"To override any styling, we use [`react-select`'s BEM](https://react-select.com/styles#using-classnames) class names with our specific prefix, which is `ot_select`. See `SelectField` for a specific example, where the background color of the `Control` element is modified if the field has an error",
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
}
|
|
110
|
+
StyleOverride.args = {
|
|
111
|
+
className: styles.example_select_override,
|
|
112
|
+
options: [
|
|
113
|
+
{ label: 'DNA', value: 'dna' },
|
|
114
|
+
{ label: 'RNA', value: 'rna' },
|
|
115
|
+
{ label: 'Protein', value: 'protein' },
|
|
116
|
+
],
|
|
117
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import ReactSelect, { components as reactSelectComponents } from 'react-select'
|
|
2
|
+
|
|
3
|
+
import cx from 'classnames'
|
|
4
|
+
|
|
5
|
+
import { Icon } from '../icons'
|
|
6
|
+
import styles from './Select.module.css'
|
|
7
|
+
import type {
|
|
8
|
+
DropdownIndicatorProps,
|
|
9
|
+
Props as ReactSelectProps,
|
|
10
|
+
MenuProps,
|
|
11
|
+
StylesConfig,
|
|
12
|
+
CSSObjectWithLabel,
|
|
13
|
+
} from 'react-select'
|
|
14
|
+
import type { POSITION_ABSOLUTE, POSITION_FIXED } from '../styles'
|
|
15
|
+
|
|
16
|
+
export { reactSelectComponents }
|
|
17
|
+
|
|
18
|
+
export const PLACEMENT_AUTO: 'auto' = 'auto'
|
|
19
|
+
export const PLACEMENT_BOTTOM: 'bottom' = 'bottom'
|
|
20
|
+
export const PLACEMENT_TOP: 'top' = 'top'
|
|
21
|
+
|
|
22
|
+
export const CONTEXT_MENU: 'menu' = 'menu'
|
|
23
|
+
export const CONTEXT_VALUE: 'value' = 'value'
|
|
24
|
+
|
|
25
|
+
export const SELECT_CX_PREFIX = 'ot_select'
|
|
26
|
+
|
|
27
|
+
export type ChangeAction =
|
|
28
|
+
| 'select-option'
|
|
29
|
+
| 'deselect-option'
|
|
30
|
+
| 'remove-value'
|
|
31
|
+
| 'pop-value'
|
|
32
|
+
| 'set-value'
|
|
33
|
+
| 'clear'
|
|
34
|
+
| 'create-option'
|
|
35
|
+
|
|
36
|
+
export interface SelectOption {
|
|
37
|
+
value: string
|
|
38
|
+
label?: string
|
|
39
|
+
isDisabled?: boolean
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface SelectOptionGroup {
|
|
43
|
+
options: SelectOption[]
|
|
44
|
+
label?: string
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// deprecated this type shouldn't be directly needed as the types for react-select
|
|
48
|
+
// combine options and groups for us now
|
|
49
|
+
export type SelectOptionOrGroup = SelectOption | SelectOptionGroup
|
|
50
|
+
|
|
51
|
+
export type SelectPlacement =
|
|
52
|
+
| typeof PLACEMENT_AUTO
|
|
53
|
+
| typeof PLACEMENT_BOTTOM
|
|
54
|
+
| typeof PLACEMENT_TOP
|
|
55
|
+
|
|
56
|
+
export type SelectPosition = typeof POSITION_ABSOLUTE | typeof POSITION_FIXED
|
|
57
|
+
|
|
58
|
+
export type SelectOptionContext = typeof CONTEXT_MENU | typeof CONTEXT_VALUE
|
|
59
|
+
|
|
60
|
+
export type SelectProps = ReactSelectProps<SelectOption>
|
|
61
|
+
|
|
62
|
+
const VOID_STYLE: unknown = undefined
|
|
63
|
+
const NO_STYLE_FN = (): CSSObjectWithLabel => VOID_STYLE as CSSObjectWithLabel
|
|
64
|
+
|
|
65
|
+
const CLEAR_STYLES: StylesConfig<SelectOption> = {
|
|
66
|
+
clearIndicator: NO_STYLE_FN,
|
|
67
|
+
container: NO_STYLE_FN,
|
|
68
|
+
control: NO_STYLE_FN,
|
|
69
|
+
dropdownIndicator: NO_STYLE_FN,
|
|
70
|
+
group: NO_STYLE_FN,
|
|
71
|
+
groupHeading: NO_STYLE_FN,
|
|
72
|
+
indicatorsContainer: NO_STYLE_FN,
|
|
73
|
+
indicatorSeparator: NO_STYLE_FN,
|
|
74
|
+
input: (styles: CSSObjectWithLabel) => ({
|
|
75
|
+
...styles,
|
|
76
|
+
zIndex: 2,
|
|
77
|
+
position: 'absolute',
|
|
78
|
+
}),
|
|
79
|
+
loadingIndicator: NO_STYLE_FN,
|
|
80
|
+
loadingMessage: NO_STYLE_FN,
|
|
81
|
+
menu: NO_STYLE_FN,
|
|
82
|
+
menuList: NO_STYLE_FN,
|
|
83
|
+
multiValue: NO_STYLE_FN,
|
|
84
|
+
multiValueLabel: NO_STYLE_FN,
|
|
85
|
+
multiValueRemove: NO_STYLE_FN,
|
|
86
|
+
option: NO_STYLE_FN,
|
|
87
|
+
// the following should not be cleared to ensure proper positioning
|
|
88
|
+
// included as comments so we can see what we're not touching
|
|
89
|
+
// noOptionsMessage: NO_STYLE_FN,
|
|
90
|
+
// menuPortal: _ => _,
|
|
91
|
+
// placeholder: _ => _,
|
|
92
|
+
// singleValue: _ => _,
|
|
93
|
+
// valueContainer: _ => _,
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function Select(props: SelectProps): JSX.Element {
|
|
97
|
+
return (
|
|
98
|
+
<ReactSelect
|
|
99
|
+
{...props}
|
|
100
|
+
styles={CLEAR_STYLES}
|
|
101
|
+
classNamePrefix={SELECT_CX_PREFIX}
|
|
102
|
+
className={cx(styles.select, props.className)}
|
|
103
|
+
components={{ DropdownIndicator, Menu }}
|
|
104
|
+
/>
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function DropdownIndicator(
|
|
109
|
+
props: DropdownIndicatorProps<SelectOption>
|
|
110
|
+
): JSX.Element {
|
|
111
|
+
return (
|
|
112
|
+
<reactSelectComponents.DropdownIndicator {...props}>
|
|
113
|
+
<div
|
|
114
|
+
className={cx(styles.dropdown_indicator, {
|
|
115
|
+
[styles.flipped]: props.selectProps.menuIsOpen,
|
|
116
|
+
})}
|
|
117
|
+
>
|
|
118
|
+
<Icon
|
|
119
|
+
name="menu-down-pd"
|
|
120
|
+
className={cx(styles.dropdown_indicator_icon)}
|
|
121
|
+
/>
|
|
122
|
+
</div>
|
|
123
|
+
</reactSelectComponents.DropdownIndicator>
|
|
124
|
+
)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const Menu = (props: MenuProps<SelectOption>): JSX.Element => (
|
|
128
|
+
<reactSelectComponents.Menu {...props}>
|
|
129
|
+
<div className={styles.menu}>{props.children}</div>
|
|
130
|
+
<div className={styles.menu_control_bridge} />
|
|
131
|
+
</reactSelectComponents.Menu>
|
|
132
|
+
)
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type * as React from 'react'
|
|
2
|
+
import cx from 'classnames'
|
|
3
|
+
import find from 'lodash/find'
|
|
4
|
+
|
|
5
|
+
import { Select } from './Select'
|
|
6
|
+
import styles from './SelectField.module.css'
|
|
7
|
+
|
|
8
|
+
import type { SelectProps } from './Select'
|
|
9
|
+
import type { ActionMeta, MultiValue, SingleValue } from 'react-select'
|
|
10
|
+
import type { SelectOption } from '.'
|
|
11
|
+
|
|
12
|
+
export interface SelectFieldProps {
|
|
13
|
+
/** optional HTML id for container */
|
|
14
|
+
id?: SelectProps['id']
|
|
15
|
+
/** field name */
|
|
16
|
+
name: NonNullable<SelectProps['name']>
|
|
17
|
+
/** react-Select option, usually label, value */
|
|
18
|
+
options: NonNullable<SelectProps['options']>
|
|
19
|
+
/** currently selected value */
|
|
20
|
+
value?: string | null
|
|
21
|
+
/** disable the select */
|
|
22
|
+
disabled?: SelectProps['isDisabled']
|
|
23
|
+
/** optional placeholder */
|
|
24
|
+
placeholder?: SelectProps['placeholder']
|
|
25
|
+
/** menuPosition prop to send to react-select */
|
|
26
|
+
menuPosition?: SelectProps['menuPosition']
|
|
27
|
+
/** render function for the option label passed to react-select */
|
|
28
|
+
formatOptionLabel?: SelectProps['formatOptionLabel']
|
|
29
|
+
/** optional className */
|
|
30
|
+
className?: string
|
|
31
|
+
/** optional caption. hidden when `error` is given */
|
|
32
|
+
caption?: React.ReactNode
|
|
33
|
+
/** if included, use error style and display error instead of caption */
|
|
34
|
+
error?: string | null
|
|
35
|
+
/** change handler called with (name, value) */
|
|
36
|
+
onValueChange?: (
|
|
37
|
+
name: string,
|
|
38
|
+
value: string,
|
|
39
|
+
actionMeta: ActionMeta<SelectOption>
|
|
40
|
+
) => void
|
|
41
|
+
/** blur handler called with (name) */
|
|
42
|
+
onLoseFocus?: (name: string) => void
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function SelectField(props: SelectFieldProps): JSX.Element {
|
|
46
|
+
const {
|
|
47
|
+
id,
|
|
48
|
+
name,
|
|
49
|
+
options,
|
|
50
|
+
disabled,
|
|
51
|
+
placeholder,
|
|
52
|
+
menuPosition,
|
|
53
|
+
formatOptionLabel,
|
|
54
|
+
className,
|
|
55
|
+
error,
|
|
56
|
+
onValueChange,
|
|
57
|
+
onLoseFocus,
|
|
58
|
+
} = props
|
|
59
|
+
// @ts-expect-error(mc, 2021-03-19): resolve this error
|
|
60
|
+
const allOptions = options.flatMap(og => og.options || [og])
|
|
61
|
+
const value = find(allOptions, opt => opt.value === props.value) || null
|
|
62
|
+
const caption = error || props.caption
|
|
63
|
+
// @ts-expect-error(sa, 2021-6-23): cast value to boolean
|
|
64
|
+
const captionCx = cx(styles.select_caption, { [styles.error]: error })
|
|
65
|
+
// @ts-expect-error(sa, 2021-6-23): cast value to boolean
|
|
66
|
+
const fieldCx = cx(styles.select_field, { [styles.error]: error }, className)
|
|
67
|
+
|
|
68
|
+
return (
|
|
69
|
+
<div>
|
|
70
|
+
<Select
|
|
71
|
+
className={fieldCx}
|
|
72
|
+
id={id}
|
|
73
|
+
name={name}
|
|
74
|
+
options={options}
|
|
75
|
+
value={value}
|
|
76
|
+
isDisabled={disabled}
|
|
77
|
+
placeholder={placeholder}
|
|
78
|
+
menuPosition={menuPosition}
|
|
79
|
+
formatOptionLabel={formatOptionLabel}
|
|
80
|
+
onChange={(
|
|
81
|
+
opt: SingleValue<SelectOption> | MultiValue<SelectOption>,
|
|
82
|
+
e: ActionMeta<SelectOption>
|
|
83
|
+
) => {
|
|
84
|
+
const value = (opt as SelectOption).value
|
|
85
|
+
onValueChange?.(name, value, e)
|
|
86
|
+
}}
|
|
87
|
+
onBlur={() => {
|
|
88
|
+
if (onLoseFocus != null) onLoseFocus(name)
|
|
89
|
+
}}
|
|
90
|
+
/>
|
|
91
|
+
{caption != null ? <p className={captionCx}>{caption}</p> : null}
|
|
92
|
+
</div>
|
|
93
|
+
)
|
|
94
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as React from 'react'
|
|
2
|
+
|
|
3
|
+
import { ToggleField as ToggleFieldComponent } from './ToggleField'
|
|
4
|
+
|
|
5
|
+
import type { Story, Meta } from '@storybook/react'
|
|
6
|
+
|
|
7
|
+
const Template: Story<
|
|
8
|
+
React.ComponentProps<typeof ToggleFieldComponent>
|
|
9
|
+
> = args => {
|
|
10
|
+
const [isOn, setIsOn] = React.useState<boolean>(false)
|
|
11
|
+
return (
|
|
12
|
+
<ToggleFieldComponent
|
|
13
|
+
{...args}
|
|
14
|
+
onChange={e => {
|
|
15
|
+
setIsOn(!isOn)
|
|
16
|
+
args.onChange(e)
|
|
17
|
+
}}
|
|
18
|
+
value={isOn}
|
|
19
|
+
/>
|
|
20
|
+
)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export const ToggleField = Template.bind({})
|
|
24
|
+
ToggleField.args = {
|
|
25
|
+
label: 'Toggle Me',
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export default {
|
|
29
|
+
title: 'Library/Molecules/Forms/Toggle Field',
|
|
30
|
+
component: ToggleField,
|
|
31
|
+
} as Meta
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type * as React from 'react'
|
|
2
|
+
import cx from 'classnames'
|
|
3
|
+
import { Icon } from '../icons'
|
|
4
|
+
|
|
5
|
+
import styles from './forms.module.css'
|
|
6
|
+
|
|
7
|
+
export interface ToggleFieldProps {
|
|
8
|
+
/** change handler */
|
|
9
|
+
onChange: (event: React.ChangeEvent<HTMLInputElement>) => unknown
|
|
10
|
+
/** checkbox is checked if value is true */
|
|
11
|
+
value?: boolean
|
|
12
|
+
/** classes to apply */
|
|
13
|
+
className?: string
|
|
14
|
+
/** classes to apply to inner label text div */
|
|
15
|
+
labelTextClassName?: string | null | undefined
|
|
16
|
+
/** name of field in form */
|
|
17
|
+
name?: string
|
|
18
|
+
/** label text for toggled off */
|
|
19
|
+
offLabel?: string
|
|
20
|
+
/** label text for toggled on */
|
|
21
|
+
onLabel?: string
|
|
22
|
+
/** checkbox is disabled if value is true */
|
|
23
|
+
disabled?: boolean
|
|
24
|
+
/** html tabindex property */
|
|
25
|
+
tabIndex?: number
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function ToggleField(props: ToggleFieldProps): JSX.Element {
|
|
29
|
+
const outerClassName = cx(styles.form_field, props.className, {
|
|
30
|
+
[styles.toggle_disabled]: props.disabled,
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
const innerDivClassName = cx(styles.toggle_icon, {
|
|
34
|
+
[styles.toggle_disabled]: props.disabled,
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
return (
|
|
38
|
+
<label className={outerClassName}>
|
|
39
|
+
<div className={innerDivClassName}>
|
|
40
|
+
<Icon
|
|
41
|
+
name={props.value ? 'ot-toggle-field-on' : 'ot-toggle-field-off'}
|
|
42
|
+
width="100%"
|
|
43
|
+
/>
|
|
44
|
+
</div>
|
|
45
|
+
<input
|
|
46
|
+
className={cx(styles.input_field, styles.accessibly_hidden)}
|
|
47
|
+
type="checkbox"
|
|
48
|
+
name={props.name}
|
|
49
|
+
checked={props.value || false}
|
|
50
|
+
disabled={props.disabled}
|
|
51
|
+
onChange={props.onChange}
|
|
52
|
+
tabIndex={props.tabIndex}
|
|
53
|
+
/>
|
|
54
|
+
<div className={cx(props.labelTextClassName, styles.label_text)}>
|
|
55
|
+
{props.value ? props.onLabel : props.offLabel}
|
|
56
|
+
</div>
|
|
57
|
+
</label>
|
|
58
|
+
)
|
|
59
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type * as React from 'react'
|
|
2
|
+
import {
|
|
3
|
+
fixture96Plate,
|
|
4
|
+
fixtureTiprack1000ul,
|
|
5
|
+
FLEX_ROBOT_TYPE,
|
|
6
|
+
HEATERSHAKER_MODULE_V1,
|
|
7
|
+
MAGNETIC_BLOCK_V1,
|
|
8
|
+
TEMPERATURE_MODULE_V2,
|
|
9
|
+
THERMOCYCLER_MODULE_V2,
|
|
10
|
+
} from '@opentrons/shared-data'
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
EXTENDED_DECK_CONFIG_FIXTURE,
|
|
14
|
+
STANDARD_SLOT_DECK_CONFIG_FIXTURE,
|
|
15
|
+
WASTE_CHUTE_DECK_CONFIG_FIXTURE,
|
|
16
|
+
} from './__fixtures__'
|
|
17
|
+
import { BaseDeck as BaseDeckComponent } from './BaseDeck'
|
|
18
|
+
|
|
19
|
+
import type { Meta, StoryObj } from '@storybook/react'
|
|
20
|
+
import type {
|
|
21
|
+
DeckConfiguration,
|
|
22
|
+
LabwareDefinition2,
|
|
23
|
+
} from '@opentrons/shared-data'
|
|
24
|
+
|
|
25
|
+
const meta: Meta<React.ComponentProps<typeof BaseDeckComponent>> = {
|
|
26
|
+
component: BaseDeckComponent,
|
|
27
|
+
title: 'Library/Molecules/Simulation/BaseDeck',
|
|
28
|
+
argTypes: {
|
|
29
|
+
deckConfig: {
|
|
30
|
+
options: ['single slot deck', 'staging area deck', 'waste chute deck'],
|
|
31
|
+
control: { type: 'radio' },
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
} as Meta
|
|
35
|
+
|
|
36
|
+
export default meta
|
|
37
|
+
type Story = StoryObj<React.ComponentProps<typeof BaseDeckComponent>>
|
|
38
|
+
|
|
39
|
+
const getDeckConfig = (args: any): DeckConfiguration => {
|
|
40
|
+
switch (args.deckConfig) {
|
|
41
|
+
case 'staging area deck':
|
|
42
|
+
return EXTENDED_DECK_CONFIG_FIXTURE
|
|
43
|
+
case 'waste chute deck':
|
|
44
|
+
return WASTE_CHUTE_DECK_CONFIG_FIXTURE
|
|
45
|
+
default:
|
|
46
|
+
return STANDARD_SLOT_DECK_CONFIG_FIXTURE
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export const BaseDeck: Story = {
|
|
51
|
+
args: {
|
|
52
|
+
robotType: FLEX_ROBOT_TYPE,
|
|
53
|
+
deckConfig: EXTENDED_DECK_CONFIG_FIXTURE,
|
|
54
|
+
labwareOnDeck: [
|
|
55
|
+
{
|
|
56
|
+
labwareLocation: { slotName: 'C2' },
|
|
57
|
+
definition: fixture96Plate as LabwareDefinition2,
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
labwareLocation: { slotName: 'C3' },
|
|
61
|
+
definition: fixtureTiprack1000ul as LabwareDefinition2,
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
modulesOnDeck: [
|
|
65
|
+
{
|
|
66
|
+
moduleLocation: { slotName: 'B1' },
|
|
67
|
+
moduleModel: THERMOCYCLER_MODULE_V2,
|
|
68
|
+
nestedLabwareDef: fixture96Plate as LabwareDefinition2,
|
|
69
|
+
innerProps: { lidMotorState: 'open' },
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
moduleLocation: { slotName: 'D1' },
|
|
73
|
+
moduleModel: TEMPERATURE_MODULE_V2,
|
|
74
|
+
nestedLabwareDef: fixture96Plate as LabwareDefinition2,
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
moduleLocation: { slotName: 'B3' },
|
|
78
|
+
moduleModel: HEATERSHAKER_MODULE_V1,
|
|
79
|
+
nestedLabwareDef: fixture96Plate as LabwareDefinition2,
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
moduleLocation: { slotName: 'D2' },
|
|
83
|
+
moduleModel: MAGNETIC_BLOCK_V1,
|
|
84
|
+
nestedLabwareDef: fixture96Plate as LabwareDefinition2,
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
darkFill: 'rebeccapurple',
|
|
88
|
+
lightFill: 'lavender',
|
|
89
|
+
},
|
|
90
|
+
render: args => {
|
|
91
|
+
const deckConfig = getDeckConfig(args)
|
|
92
|
+
return <BaseDeckComponent {...args} deckConfig={deckConfig} />
|
|
93
|
+
},
|
|
94
|
+
}
|