@opentrons/components 0.1.6-alpha.2 → 0.1.6-alpha.21
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,11 @@
|
|
|
1
|
+
export * from './BaseDeck'
|
|
2
|
+
export * from './BaseDeck/__fixtures__'
|
|
3
|
+
export * from './ProtocolDeck'
|
|
4
|
+
export * from './ProtocolDeck/utils'
|
|
5
|
+
export * from './Deck'
|
|
6
|
+
export * from './DeckConfigurator'
|
|
7
|
+
export * from './DeckSlotLocation'
|
|
8
|
+
export * from './Labware'
|
|
9
|
+
export * from './Module'
|
|
10
|
+
export * from './Pipette'
|
|
11
|
+
export * from './RobotCoordinateSpace'
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AffineTransformMatrix } from '@opentrons/shared-data'
|
|
2
|
+
|
|
3
|
+
export const IDENTITY_AFFINE_TRANSFORM: AffineTransformMatrix = [
|
|
4
|
+
[1, 0, 0, 0],
|
|
5
|
+
[0, 1, 0, 0],
|
|
6
|
+
[0, 0, 1, 0],
|
|
7
|
+
[0, 0, 0, 1],
|
|
8
|
+
]
|
|
9
|
+
|
|
10
|
+
// multiply two matrices together (dot product)
|
|
11
|
+
export function multiplyMatrices(a: number[][], b: number[][]): number[][] {
|
|
12
|
+
const transposedB = b[0].map((_val, index) => b.map(row => row[index]))
|
|
13
|
+
return a.map(rowA =>
|
|
14
|
+
transposedB.map(rowB =>
|
|
15
|
+
rowA.reduce((acc, valA, colIndexA) => acc + valA * rowB[colIndexA], 0)
|
|
16
|
+
)
|
|
17
|
+
)
|
|
18
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { COLORS } from '.'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Constants
|
|
5
|
+
*/
|
|
6
|
+
export const borderRadius2 = '2px' // WEB ONLY!
|
|
7
|
+
export const borderRadius4 = '4px'
|
|
8
|
+
export const borderRadius8 = '8px'
|
|
9
|
+
export const borderRadius12 = '12px'
|
|
10
|
+
export const borderRadius16 = '16px'
|
|
11
|
+
export const borderRadius40 = '40px'
|
|
12
|
+
export const borderRadiusFull = '200px'
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Styles
|
|
16
|
+
*/
|
|
17
|
+
export const styleSolid = 'solid'
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Special-case borders
|
|
21
|
+
*/
|
|
22
|
+
export const activeLineBorder = `1px ${styleSolid} ${COLORS.blue50}`
|
|
23
|
+
export const lineBorder = `1px ${styleSolid} ${COLORS.grey30}`
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Shadows
|
|
27
|
+
*/
|
|
28
|
+
export const smallDropShadow = '0px 3px 6px rgba(0, 0, 0, 0.23)'
|
|
29
|
+
export const tinyDropShadow = '0px 1px 3px 0px rgba(0, 0, 0, .33)'
|
|
30
|
+
// touch screen
|
|
31
|
+
export const shadowBig = '0px 3px 6px rgba(0,0,0,0.23)'
|
|
32
|
+
export const shadowSmall = '0px 0px 40px rgba(0,0,0,0.4)'
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// some colors are slightly adjusted for on-device display screen differences
|
|
2
|
+
// isTouchscreen hex values are dev concerns only - designs will reflect the standard hex values
|
|
3
|
+
import { isTouchscreen } from '../ui-style-constants/responsiveness'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* green
|
|
7
|
+
*/
|
|
8
|
+
export const green60 = '#03683E'
|
|
9
|
+
export const green50 = isTouchscreen ? '#1CA850' : '#04AA65'
|
|
10
|
+
export const green40 = isTouchscreen ? '#8EF3A8' : '#91E2C0'
|
|
11
|
+
export const green35 = isTouchscreen ? '#8AFBAB' : '#AFEDD3'
|
|
12
|
+
export const green30 = '#C4F6E0'
|
|
13
|
+
export const green20 = '#E8F7ED'
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* red
|
|
17
|
+
*/
|
|
18
|
+
export const red60 = '#941313'
|
|
19
|
+
export const red55 = '#C71A1B'
|
|
20
|
+
export const red50 = '#DE1B1B'
|
|
21
|
+
export const red40 = '#F5B2B3'
|
|
22
|
+
export const red35 = '#F8C8C9'
|
|
23
|
+
export const red30 = '#FAD6D6'
|
|
24
|
+
export const red20 = '#FCE9E9'
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* yellow
|
|
28
|
+
*/
|
|
29
|
+
export const yellow60 = '#825512'
|
|
30
|
+
export const yellow50 = '#F09D20'
|
|
31
|
+
export const yellow40 = '#FCD48B'
|
|
32
|
+
export const yellow35 = '#FFE1A4'
|
|
33
|
+
export const yellow30 = '#FFE9BE'
|
|
34
|
+
export const yellow20 = '#FDF3E2'
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* purple
|
|
38
|
+
*/
|
|
39
|
+
export const purple60 = isTouchscreen ? '#612367' : '#562566'
|
|
40
|
+
export const purple55 = isTouchscreen ? '#822E89' : '#713187'
|
|
41
|
+
export const purple50 = isTouchscreen ? '#9E39A8' : '#893BA4'
|
|
42
|
+
export const purple40 = isTouchscreen ? '#E2A9EA' : '#CEA4DF'
|
|
43
|
+
export const purple35 = isTouchscreen ? '#ECC2F2' : '#DBBCE7'
|
|
44
|
+
export const purple30 = isTouchscreen ? '#F4DEF7' : '#E6D5EC'
|
|
45
|
+
export const purple20 = isTouchscreen ? '#FFF3FE' : '#F1E8F5'
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* blue
|
|
49
|
+
*/
|
|
50
|
+
export const blue60 = '#004196'
|
|
51
|
+
export const blue55 = '#0056C8'
|
|
52
|
+
export const blue40 = '#A9CEFD'
|
|
53
|
+
export const blue35 = '#BFDCFD'
|
|
54
|
+
export const blue30 = '#D0E6FE'
|
|
55
|
+
export const blue20 = '#E1EFFF'
|
|
56
|
+
export const blue10 = '#F1F8FF'
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* grey
|
|
60
|
+
*/
|
|
61
|
+
export const grey60 = '#4A4C4E'
|
|
62
|
+
export const grey55 = '#626467'
|
|
63
|
+
export const grey50 = '#737578'
|
|
64
|
+
export const grey40 = '#B7B8B9'
|
|
65
|
+
export const grey35 = '#CBCCCC'
|
|
66
|
+
export const grey30 = '#DEDEDE'
|
|
67
|
+
export const grey20 = '#E9E9E9'
|
|
68
|
+
export const grey10 = '#F3F3F3'
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* core
|
|
72
|
+
*/
|
|
73
|
+
export const black90 = '#16212D'
|
|
74
|
+
export const black80 = '#24313F'
|
|
75
|
+
export const black70 = '#39495B'
|
|
76
|
+
export const white = '#FFFFFF'
|
|
77
|
+
export const blue50 = '#006CFA'
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Semi-opaques
|
|
81
|
+
* */
|
|
82
|
+
export const transparentWhite80 = `${white}CC`
|
|
83
|
+
export const transparentWhite50 = `${white}80`
|
|
84
|
+
export const transparentBlack80 = `${black90}80`
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* flex
|
|
88
|
+
*/
|
|
89
|
+
export const flex55 = '#0297CC'
|
|
90
|
+
export const flex50 = '#00BDFF'
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* extras
|
|
94
|
+
*/
|
|
95
|
+
export const transparent = 'transparent'
|
|
96
|
+
// opacity hex codes to append to 6-digit color hex codes
|
|
97
|
+
export const opacity20HexCode = '33' // 20% opacity
|
|
98
|
+
export const opacity40HexCode = '66' // 40% opacity
|
|
99
|
+
export const opacity60HexCode = '99' // 60% opacity
|
|
100
|
+
export const opacity90HexCode = 'E6' // 90% opacity
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * as TYPOGRAPHY from './typography'
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Note: these values are only currently correct for desktop and should not be used on ODD.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// Valid for most typography styles
|
|
6
|
+
export const fontFamily = 'Public Sans'
|
|
7
|
+
|
|
8
|
+
export const fontWeightRegular = '400'
|
|
9
|
+
export const fontWeightSemiBold = '600'
|
|
10
|
+
export const fontWeightBold = '700'
|
|
11
|
+
|
|
12
|
+
// Display styles
|
|
13
|
+
const fontFamilyDisplay = fontFamily
|
|
14
|
+
const fontSizeDisplay = '2.4375rem' // 39px
|
|
15
|
+
const lineHeightDisplay = '3rem' // 48px
|
|
16
|
+
|
|
17
|
+
// Display-Bold
|
|
18
|
+
export const fontSizeDisplayBold = fontSizeDisplay
|
|
19
|
+
export const lineHeightDisplayBold = lineHeightDisplay
|
|
20
|
+
export const fontFamilyDisplayBold = fontFamilyDisplay
|
|
21
|
+
export const fontWeightDisplayBold = fontWeightBold
|
|
22
|
+
export const fontStyleDisplayBold = `${fontWeightDisplayBold} ${fontSizeDisplayBold}/${lineHeightDisplayBold} ${fontFamilyDisplayBold}`
|
|
23
|
+
|
|
24
|
+
// Heading-Large
|
|
25
|
+
const fontSizeHeadingLarge = '1.625rem' // 26px
|
|
26
|
+
const lineHeightHeadingLarge = '2rem' // 32px
|
|
27
|
+
const fontFamilyHeadingLarge = fontFamily
|
|
28
|
+
|
|
29
|
+
// Heading-Large-Regular
|
|
30
|
+
export const fontFamilyHeadingLargeRegular = fontFamilyHeadingLarge
|
|
31
|
+
export const fontSizeHeadingLargeRegular = fontSizeHeadingLarge
|
|
32
|
+
export const lineHeightHeadingLargeRegular = lineHeightHeadingLarge
|
|
33
|
+
export const fontWeightHeadingLargeRegular = fontWeightRegular
|
|
34
|
+
export const fontStyleHeadingLargeRegular = `${fontWeightHeadingLargeRegular} ${fontSizeHeadingLargeRegular}/${lineHeightHeadingLargeRegular} ${fontFamilyHeadingLargeRegular}`
|
|
35
|
+
|
|
36
|
+
// Heading-Large-Bold
|
|
37
|
+
export const fontFamilyHeadingLargeBold = fontFamilyHeadingLarge
|
|
38
|
+
export const fontSizeHeadingLargeBold = fontSizeHeadingLarge
|
|
39
|
+
export const lineHeightHeadingLargeBold = lineHeightHeadingLarge
|
|
40
|
+
export const fontWeightHeadingLargeBold = fontWeightBold
|
|
41
|
+
export const fontStyleHeadingLargeBold = `${fontWeightHeadingLargeBold} ${fontSizeHeadingLargeBold}/${lineHeightHeadingLargeBold} ${fontFamilyHeadingLargeBold}`
|
|
42
|
+
|
|
43
|
+
// Heading-Medium
|
|
44
|
+
const fontSizeHeadingMedium = '1.4375rem' // 23px
|
|
45
|
+
const lineHeightHeadingMedium = '1.75rem' // 28px
|
|
46
|
+
const fontFamilyHeadingMedium = fontFamily
|
|
47
|
+
|
|
48
|
+
// Heading-Medium-Regular
|
|
49
|
+
export const fontSizeHeadingMediumSemiBold = fontSizeHeadingMedium
|
|
50
|
+
export const lineHeightHeadingMediumSemiBold = lineHeightHeadingMedium
|
|
51
|
+
|
|
52
|
+
export const fontFamilyHeadingMediumSemiBold = fontFamilyHeadingMedium
|
|
53
|
+
export const fontWeightHeadingMediumSemiBold = fontWeightSemiBold
|
|
54
|
+
export const fontStyleHeadingMediumSemiBold = `${fontWeightHeadingMediumSemiBold} ${fontSizeHeadingMediumSemiBold}/${lineHeightHeadingMediumSemiBold} ${fontFamilyHeadingMediumSemiBold}`
|
|
55
|
+
export const fontStyleHeadingMediumBold = `${fontWeightBold} ${fontSizeHeadingMedium}/${lineHeightHeadingMediumSemiBold} ${fontFamilyHeadingMediumSemiBold}`
|
|
56
|
+
|
|
57
|
+
// Heading-Small
|
|
58
|
+
const fontSizeHeadingSmall = '1.125rem' // 18px
|
|
59
|
+
const lineHeightHeadingSmall = '1.5rem' // 24px
|
|
60
|
+
const fontFamilyHeadingSmall = fontFamily
|
|
61
|
+
|
|
62
|
+
// Heading-Small-Regular
|
|
63
|
+
export const fontSizeHeadingSmallRegular = fontSizeHeadingSmall
|
|
64
|
+
export const lineHeightHeadingSmallRegular = lineHeightHeadingSmall
|
|
65
|
+
export const fontFamilyHeadingSmallRegular = fontFamilyHeadingSmall
|
|
66
|
+
export const fontWeightHeadingSmallRegular = '400'
|
|
67
|
+
export const fontStyleHeadingSmallRegular = `${fontWeightHeadingSmallRegular} ${fontSizeHeadingSmallRegular}/${lineHeightHeadingSmallRegular} ${fontFamilyHeadingSmallRegular}`
|
|
68
|
+
|
|
69
|
+
// Heading-Small-Bold
|
|
70
|
+
export const fontSizeHeadingSmallBold = fontSizeHeadingSmall
|
|
71
|
+
export const lineHeightHeadingSmallBold = lineHeightHeadingSmall
|
|
72
|
+
export const fontFamilyHeadingSmallBold = fontFamilyHeadingSmall
|
|
73
|
+
export const fontWeightHeadingSmallBold = fontWeightBold
|
|
74
|
+
export const fontStyleHeadingSmallBold = `${fontWeightHeadingSmallBold} ${fontSizeHeadingSmallBold}/${lineHeightHeadingSmallBold} ${fontFamilyHeadingSmallBold}`
|
|
75
|
+
export const fontStyleHeadingSmallSemiBold = `${fontWeightSemiBold} ${fontSizeHeadingSmallBold}/${lineHeightHeadingSmallBold} ${fontFamilyHeadingSmallBold}`
|
|
76
|
+
|
|
77
|
+
// Body-Large
|
|
78
|
+
const fontSizeBodyLarge = '1rem' // 16px
|
|
79
|
+
const lineHeightBodyLarge = '1.5rem' // 24px
|
|
80
|
+
const fontFamilyBodyLarge = fontFamily
|
|
81
|
+
|
|
82
|
+
// Body-Large-Medium
|
|
83
|
+
export const fontSizeBodyLargeSemiBold = fontSizeBodyLarge
|
|
84
|
+
export const lineHeightBodyLargeSemiBold = lineHeightBodyLarge
|
|
85
|
+
export const fontFamilyBodyLargeSemiBold = fontFamilyBodyLarge
|
|
86
|
+
export const fontWeightBodyLargeSemiBold = fontWeightSemiBold
|
|
87
|
+
export const fontStyleBodyLargeSemiBold = `${fontWeightBodyLargeSemiBold} ${fontSizeBodyLargeSemiBold}/${lineHeightBodyLargeSemiBold} ${fontFamilyBodyLargeSemiBold}`
|
|
88
|
+
|
|
89
|
+
// Body-Large-Regular
|
|
90
|
+
export const fontSizeBodyLargeRegular = fontSizeBodyLarge
|
|
91
|
+
export const lineHeightBodyLargeRegular = lineHeightBodyLarge
|
|
92
|
+
export const fontFamilyBodyLargeRegular = fontFamilyBodyLarge
|
|
93
|
+
export const fontWeightBodyLargeRegular = fontWeightRegular
|
|
94
|
+
export const fontStyleBodyLargeRegular = `${fontWeightBodyLargeRegular} ${fontSizeBodyLargeRegular}/${lineHeightBodyLargeRegular} ${fontFamilyBodyLargeRegular}`
|
|
95
|
+
|
|
96
|
+
// Body-Default
|
|
97
|
+
const fontSizeBodyDefault = '0.875rem' // 14px
|
|
98
|
+
const lineHeightBodyDefault = '1.25rem' // 20px
|
|
99
|
+
const fontFamilyBodyDefault = fontFamily
|
|
100
|
+
|
|
101
|
+
// Body-Default-Medium
|
|
102
|
+
export const fontSizeBodyDefaultSemiBold = fontSizeBodyDefault
|
|
103
|
+
export const lineHeightBodyDefaultSemiBold = lineHeightBodyDefault
|
|
104
|
+
export const fontFamilyBodyDefaultSemiBold = fontFamilyBodyDefault
|
|
105
|
+
export const fontWeightBodyDefaultSemiBold = fontWeightSemiBold
|
|
106
|
+
export const fontStyleBodyDefaultSemiBold = `${fontWeightBodyDefaultSemiBold} ${fontSizeBodyDefaultSemiBold}/${lineHeightBodyDefaultSemiBold} ${fontFamilyBodyDefaultSemiBold}`
|
|
107
|
+
|
|
108
|
+
// Body-Default-Regular
|
|
109
|
+
export const fontSizeBodyDefaultRegular = fontSizeBodyDefault
|
|
110
|
+
export const lineHeightBodyDefaultRegular = lineHeightBodyDefault
|
|
111
|
+
export const fontFamilyBodyDefaultRegular = fontFamilyBodyDefault
|
|
112
|
+
export const fontWeightBodyDefaultRegular = fontWeightRegular
|
|
113
|
+
export const fontStyleBodyDefaultRegular = `${fontWeightBodyDefaultRegular} ${fontSizeBodyDefaultRegular}/${lineHeightBodyDefaultRegular} ${fontFamilyBodyDefaultRegular}`
|
|
114
|
+
|
|
115
|
+
// Caption
|
|
116
|
+
const fontSizeCaption = '0.8125rem' // 13px
|
|
117
|
+
const lineHeightCaption = '1rem' // 16px
|
|
118
|
+
const fontFamilyCaption = fontFamily
|
|
119
|
+
|
|
120
|
+
// Caption-Bold
|
|
121
|
+
export const fontSizeCaptionBold = fontSizeCaption
|
|
122
|
+
export const lineHeightCaptionBold = lineHeightCaption
|
|
123
|
+
export const fontFamilyCaptionBold = fontFamilyCaption
|
|
124
|
+
export const fontWeightCaptionBold = fontWeightBold
|
|
125
|
+
export const fontStyleCaptionBold = `${fontWeightCaptionBold} ${fontSizeCaptionBold}/${lineHeightCaptionBold} ${fontFamilyCaptionBold}`
|
|
126
|
+
|
|
127
|
+
// Caption-Medium
|
|
128
|
+
export const fontSizeCaptionSemiBold = fontSizeCaption
|
|
129
|
+
export const lineHeightCaptionSemiBold = lineHeightCaption
|
|
130
|
+
export const fontFamilyCaptionSemiBold = fontFamilyCaption
|
|
131
|
+
export const fontWeightCaptionSemiBold = fontWeightSemiBold
|
|
132
|
+
export const fontStyleCaptionSemiBold = `${fontWeightCaptionSemiBold} ${fontSizeCaptionSemiBold}/${lineHeightCaptionSemiBold} ${fontFamilyCaptionSemiBold}`
|
|
133
|
+
|
|
134
|
+
// Caption-Regular
|
|
135
|
+
export const fontSizeCaptionRegular = fontSizeCaption
|
|
136
|
+
export const lineHeightCaptionRegular = lineHeightCaption
|
|
137
|
+
export const fontFamilyCaptionRegular = fontFamilyCaption
|
|
138
|
+
export const fontWeightCaptionRegular = fontWeightRegular
|
|
139
|
+
export const fontStyleCaptionRegular = `${fontWeightCaptionRegular} ${fontSizeCaptionRegular}/${lineHeightCaptionRegular} ${fontFamilyCaptionRegular}`
|
|
140
|
+
|
|
141
|
+
// Code
|
|
142
|
+
const fontSizeCode = '0.8125rem' // 12px
|
|
143
|
+
const lineHeightCode = '1.25rem' // 20px
|
|
144
|
+
const fontFamilyCode = 'Reddit Mono'
|
|
145
|
+
|
|
146
|
+
// Code-Regular
|
|
147
|
+
export const fontSizeCodeRegular = fontSizeCode
|
|
148
|
+
export const lineHeightCodeRegular = lineHeightCode
|
|
149
|
+
export const fontFamilyCodeRegular = fontFamilyCode
|
|
150
|
+
export const fontWeightCodeRegular = fontWeightRegular
|
|
151
|
+
export const fontStyleCodeRegular = `${fontWeightCodeRegular} ${fontSizeCodeRegular}/${lineHeightCodeRegular} ${fontFamilyCodeRegular}`
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// generic react hooks that don't fit cleanly anywhere else
|
|
2
|
+
|
|
3
|
+
export * from './useConditionalConfirm'
|
|
4
|
+
export * from './useDrag'
|
|
5
|
+
export * from './useIdle'
|
|
6
|
+
export * from './useInterval'
|
|
7
|
+
export * from './useLongPress'
|
|
8
|
+
export * from './useMountEffect'
|
|
9
|
+
export * from './usePrevious'
|
|
10
|
+
export * from './useScrolling'
|
|
11
|
+
export * from './useSelectDeckLocation'
|
|
12
|
+
export * from './useSwipe'
|
|
13
|
+
export * from './useTimeout'
|
|
14
|
+
export * from './useToggle'
|
|
15
|
+
export * from './useMenuHandleClickOutside'
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { useState } from 'react'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* useConditionalConfirm is intended for cases where we want to block and defer
|
|
5
|
+
* a particular user action until the user clicks "ok" in any kind of "are you sure?"
|
|
6
|
+
* confirmation UI. The arguments passed to the confirm function will be preserved and
|
|
7
|
+
* used to call handleContinue. Ex. a click event is being deferred by a modal. When the
|
|
8
|
+
* user confirms, the initial click event passed as an argument will be used as the argument in
|
|
9
|
+
* the callback.
|
|
10
|
+
* @param {() => unknown)} handleContinue (the action we may want to require confirmation for)
|
|
11
|
+
* @param {boolean} shouldBlock (if no confirmation is needed, we will avoid the modal and immediately call handleContinue)
|
|
12
|
+
* @example
|
|
13
|
+
* ```js
|
|
14
|
+
* import { useConditionalConfirm } from '@opentrons/components'
|
|
15
|
+
*
|
|
16
|
+
* const ExampleDangerForm = props => {
|
|
17
|
+
* const {
|
|
18
|
+
* confirm,
|
|
19
|
+
* showConfirmation,
|
|
20
|
+
* cancel,
|
|
21
|
+
* } = useConditionalConfirm(props.goAhead, props.dangerIsPresent)
|
|
22
|
+
*
|
|
23
|
+
* return (
|
|
24
|
+
* <>
|
|
25
|
+
* {showConfirmation && (
|
|
26
|
+
* <AreYouSureModal
|
|
27
|
+
* handleCancel={cancel}
|
|
28
|
+
* handleContinue={confirm}
|
|
29
|
+
* />
|
|
30
|
+
* )}
|
|
31
|
+
* <DangerFormFields />
|
|
32
|
+
* <DangerousSubmit onClick={confirm} />
|
|
33
|
+
* </>
|
|
34
|
+
* )
|
|
35
|
+
* }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
export interface UseConditionalConfirmResult<T extends any[]> {
|
|
40
|
+
confirm: (...args: T) => void
|
|
41
|
+
showConfirmation: boolean
|
|
42
|
+
cancel: () => unknown
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export const useConditionalConfirm = <T extends any[]>(
|
|
46
|
+
handleContinue: (...args: T) => any,
|
|
47
|
+
shouldBlock: boolean
|
|
48
|
+
): UseConditionalConfirmResult<T> => {
|
|
49
|
+
const [pendingArgs, setPendingArgs] = useState<T | null>(null)
|
|
50
|
+
const pendingConfirm = pendingArgs !== null
|
|
51
|
+
const confirm: (...args: T) => void = (...confirmArgs) => {
|
|
52
|
+
if (shouldBlock && !pendingConfirm) {
|
|
53
|
+
setPendingArgs(confirmArgs)
|
|
54
|
+
} else {
|
|
55
|
+
// call handleContinue with pending args if we have them
|
|
56
|
+
const handleContinueArgs =
|
|
57
|
+
pendingArgs !== null ? pendingArgs : confirmArgs
|
|
58
|
+
handleContinue(...handleContinueArgs)
|
|
59
|
+
setPendingArgs(null)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
confirm,
|
|
65
|
+
showConfirmation: pendingConfirm,
|
|
66
|
+
cancel: () => {
|
|
67
|
+
setPendingArgs(null)
|
|
68
|
+
},
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { useState, useEffect, useRef } from 'react'
|
|
2
|
+
import interact from 'interactjs'
|
|
3
|
+
import type { CSSProperties, MutableRefObject } from 'react'
|
|
4
|
+
|
|
5
|
+
export interface ElementPosition {
|
|
6
|
+
width: number
|
|
7
|
+
height: number
|
|
8
|
+
x: number
|
|
9
|
+
y: number
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface UseDragResult {
|
|
13
|
+
ref: MutableRefObject<null>
|
|
14
|
+
style: CSSProperties
|
|
15
|
+
position: ElementPosition
|
|
16
|
+
isEnabled: boolean
|
|
17
|
+
enable: () => void
|
|
18
|
+
disable: () => void
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* useDrag makes HTMLElement draggable for on-device app
|
|
23
|
+
* This hook should be used when isOnDevice is true
|
|
24
|
+
* @param {ElementPosition} (width, height, x, and y, they are HTMLElement's size and the initial position)
|
|
25
|
+
* @returns {UseDragResult}
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
export const useDrag = (position: ElementPosition): UseDragResult => {
|
|
29
|
+
const [elementPosition, setElementPosition] = useState<ElementPosition>(
|
|
30
|
+
position
|
|
31
|
+
)
|
|
32
|
+
const [isEnabled, setIsEnabled] = useState<boolean>(true)
|
|
33
|
+
const interactiveRef = useRef(null)
|
|
34
|
+
let { x, y, width, height } = elementPosition
|
|
35
|
+
|
|
36
|
+
const enable = (): void => {
|
|
37
|
+
if (interactiveRef?.current != null) {
|
|
38
|
+
interact((interactiveRef.current as unknown) as HTMLElement)
|
|
39
|
+
.draggable({
|
|
40
|
+
modifiers: [],
|
|
41
|
+
inertia: false,
|
|
42
|
+
})
|
|
43
|
+
.on('dragmove', (event: Interact.InteractEvent) => {
|
|
44
|
+
x += Number(event.dx)
|
|
45
|
+
y += Number(event.dy)
|
|
46
|
+
|
|
47
|
+
setElementPosition({
|
|
48
|
+
width,
|
|
49
|
+
height,
|
|
50
|
+
x,
|
|
51
|
+
y,
|
|
52
|
+
})
|
|
53
|
+
})
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const disable = (): void => {
|
|
57
|
+
if (interactiveRef?.current != null) {
|
|
58
|
+
interact((interactiveRef.current as unknown) as HTMLElement).unset()
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
if (isEnabled) {
|
|
64
|
+
enable()
|
|
65
|
+
} else {
|
|
66
|
+
disable()
|
|
67
|
+
}
|
|
68
|
+
return disable
|
|
69
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
70
|
+
}, [isEnabled])
|
|
71
|
+
|
|
72
|
+
return {
|
|
73
|
+
ref: interactiveRef,
|
|
74
|
+
style: {
|
|
75
|
+
transform: `translate3D(${elementPosition.x}px, ${elementPosition.y}px, 0)`,
|
|
76
|
+
width: `${elementPosition.width}px`,
|
|
77
|
+
height: `${elementPosition.height}px`,
|
|
78
|
+
position: 'absolute' as React.CSSProperties['position'],
|
|
79
|
+
touchAction: 'none',
|
|
80
|
+
},
|
|
81
|
+
position: elementPosition,
|
|
82
|
+
isEnabled,
|
|
83
|
+
enable: () => {
|
|
84
|
+
setIsEnabled(true)
|
|
85
|
+
},
|
|
86
|
+
disable: () => {
|
|
87
|
+
setIsEnabled(false)
|
|
88
|
+
},
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { useState, useEffect, useRef } from 'react'
|
|
2
|
+
|
|
3
|
+
const USER_EVENTS: Array<keyof DocumentEventMap> = [
|
|
4
|
+
'click',
|
|
5
|
+
'dblclick',
|
|
6
|
+
'keypress',
|
|
7
|
+
'mousemove',
|
|
8
|
+
'pointerover',
|
|
9
|
+
'pointerenter',
|
|
10
|
+
'pointerdown',
|
|
11
|
+
'pointermove',
|
|
12
|
+
'pointerout',
|
|
13
|
+
'pointerleave',
|
|
14
|
+
'scroll',
|
|
15
|
+
'touchmove',
|
|
16
|
+
'touchstart',
|
|
17
|
+
'mousedown',
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
const DEFAULT_OPTIONS = {
|
|
21
|
+
events: USER_EVENTS,
|
|
22
|
+
initialState: true,
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* React hook to check user events
|
|
27
|
+
*
|
|
28
|
+
* @param {number} idleTime (idle time)
|
|
29
|
+
* @param {object} options (events that the app need to check, initialState: initial state true => idle)
|
|
30
|
+
* @returns {boolean}
|
|
31
|
+
*/
|
|
32
|
+
export function useIdle(
|
|
33
|
+
idleTime: number,
|
|
34
|
+
options?: Partial<{
|
|
35
|
+
events: Array<keyof DocumentEventMap>
|
|
36
|
+
initialState: boolean
|
|
37
|
+
}>
|
|
38
|
+
): boolean {
|
|
39
|
+
const { events, initialState } = { ...DEFAULT_OPTIONS, ...options }
|
|
40
|
+
const [idle, setIdle] = useState<boolean>(initialState)
|
|
41
|
+
const idleTimer = useRef<number>()
|
|
42
|
+
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
const handleEvents = (): void => {
|
|
45
|
+
setIdle(false)
|
|
46
|
+
|
|
47
|
+
if (idleTimer.current != null) {
|
|
48
|
+
window.clearTimeout(idleTimer.current)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
idleTimer.current = window.setTimeout(() => {
|
|
52
|
+
setIdle(true)
|
|
53
|
+
}, idleTime)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
events.forEach(event => {
|
|
57
|
+
document.addEventListener(event, handleEvents)
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
return () => {
|
|
61
|
+
events.forEach(event => {
|
|
62
|
+
document.removeEventListener(event, handleEvents)
|
|
63
|
+
})
|
|
64
|
+
}
|
|
65
|
+
}, [events, idleTime])
|
|
66
|
+
|
|
67
|
+
return idle
|
|
68
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { useEffect, useRef } from 'react'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* React hook to call a function on an interval; copied from:
|
|
5
|
+
* https://overreacted.io/making-setinterval-declarative-with-react-hooks/
|
|
6
|
+
*
|
|
7
|
+
* @template T (type of the input value)
|
|
8
|
+
* @param {() => unknown} callback (function to call on an interval)
|
|
9
|
+
* @param {number | null} delay (interval delay, or null to stop interval)
|
|
10
|
+
* @param {boolean} [immediate=false] (trigger the callback immediately before starting the interval)
|
|
11
|
+
* @returns {void}
|
|
12
|
+
*/
|
|
13
|
+
export function useInterval(
|
|
14
|
+
callback: () => unknown,
|
|
15
|
+
delay: number | null,
|
|
16
|
+
immediate: boolean = false
|
|
17
|
+
): void {
|
|
18
|
+
const savedCallback: React.MutableRefObject<
|
|
19
|
+
(() => unknown) | undefined
|
|
20
|
+
> = useRef()
|
|
21
|
+
|
|
22
|
+
// remember the latest callback
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
savedCallback.current = callback
|
|
25
|
+
}, [callback])
|
|
26
|
+
|
|
27
|
+
// set up the interval
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
const tick = (): unknown => savedCallback.current && savedCallback.current()
|
|
30
|
+
if (delay !== null && delay > 0) {
|
|
31
|
+
if (immediate) tick()
|
|
32
|
+
const id = setInterval(tick, delay)
|
|
33
|
+
return () => {
|
|
34
|
+
clearInterval(id)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}, [delay, immediate])
|
|
38
|
+
}
|