@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,78 @@
|
|
|
1
|
+
import type * as React from 'react'
|
|
2
|
+
import { SPACING } from '../../ui-style-constants'
|
|
3
|
+
import { DIRECTION_ROW } from '../../styles'
|
|
4
|
+
import { Flex } from '../../primitives'
|
|
5
|
+
import { PrimaryButton } from './PrimaryButton'
|
|
6
|
+
import { SecondaryButton } from './SecondaryButton'
|
|
7
|
+
import { AlertPrimaryButton } from './AlertPrimaryButton'
|
|
8
|
+
import { AltPrimaryButton } from './AltPrimaryButton'
|
|
9
|
+
|
|
10
|
+
import type { Story, Meta } from '@storybook/react'
|
|
11
|
+
|
|
12
|
+
export default {
|
|
13
|
+
title: 'Library/Atoms/Buttons',
|
|
14
|
+
} as Meta
|
|
15
|
+
|
|
16
|
+
const PrimaryButtonTemplate: Story<
|
|
17
|
+
React.ComponentProps<typeof PrimaryButton>
|
|
18
|
+
> = args => {
|
|
19
|
+
const { children } = args
|
|
20
|
+
return (
|
|
21
|
+
<Flex flexDirection={DIRECTION_ROW} gridGap={SPACING.spacing16}>
|
|
22
|
+
<PrimaryButton>{children}</PrimaryButton>
|
|
23
|
+
</Flex>
|
|
24
|
+
)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const Primary = PrimaryButtonTemplate.bind({})
|
|
28
|
+
Primary.args = {
|
|
29
|
+
children: 'primary button',
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const SecondaryButtonTemplate: Story<
|
|
33
|
+
React.ComponentProps<typeof SecondaryButton>
|
|
34
|
+
> = args => {
|
|
35
|
+
const { children } = args
|
|
36
|
+
return (
|
|
37
|
+
<Flex flexDirection={DIRECTION_ROW} gridGap={SPACING.spacing16}>
|
|
38
|
+
<SecondaryButton>{children}</SecondaryButton>
|
|
39
|
+
</Flex>
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export const Secondary = SecondaryButtonTemplate.bind({})
|
|
44
|
+
Secondary.args = {
|
|
45
|
+
children: 'secondary button',
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const AlertPrimaryButtonTemplate: Story<
|
|
49
|
+
React.ComponentProps<typeof AlertPrimaryButton>
|
|
50
|
+
> = args => {
|
|
51
|
+
const { children } = args
|
|
52
|
+
return (
|
|
53
|
+
<Flex>
|
|
54
|
+
<AlertPrimaryButton>{children}</AlertPrimaryButton>
|
|
55
|
+
</Flex>
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export const AlertPrimary = AlertPrimaryButtonTemplate.bind({})
|
|
60
|
+
AlertPrimary.args = {
|
|
61
|
+
children: 'alert tertiary button',
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const AltPrimaryButtonTemplate: Story<
|
|
65
|
+
React.ComponentProps<typeof AltPrimaryButton>
|
|
66
|
+
> = args => {
|
|
67
|
+
const { children } = args
|
|
68
|
+
return (
|
|
69
|
+
<Flex>
|
|
70
|
+
<AltPrimaryButton>{children}</AltPrimaryButton>
|
|
71
|
+
</Flex>
|
|
72
|
+
)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export const AltPrimary = AltPrimaryButtonTemplate.bind({})
|
|
76
|
+
AltPrimary.args = {
|
|
77
|
+
children: 'alt primary button',
|
|
78
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export * from './buttons'
|
|
2
|
+
export * from './Checkbox'
|
|
3
|
+
export * from './CheckboxField'
|
|
4
|
+
export * from './Chip'
|
|
5
|
+
export * from './Divider'
|
|
6
|
+
export * from './InputField'
|
|
7
|
+
export * from './ListButton'
|
|
8
|
+
export * from './ListItem'
|
|
9
|
+
export * from './ListItem/ListItemChildren//ListItemDescriptor'
|
|
10
|
+
export * from './MenuList'
|
|
11
|
+
export * from './MenuList/MenuItem'
|
|
12
|
+
export * from './MenuList/OverflowBtn'
|
|
13
|
+
export * from './Snackbar'
|
|
14
|
+
export * from './StepMeter'
|
|
15
|
+
export * from './StepMeter'
|
|
16
|
+
export * from './StyledText'
|
|
17
|
+
export * from './Tag'
|
|
18
|
+
export * from './Toast'
|
|
19
|
+
export * from './ToggleGroup'
|
|
20
|
+
export * from './Tooltip'
|
package/src/barrel.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// TODO(BC, 2024-01-04): This is intentionally a subset of the exports from
|
|
2
|
+
// index.ts. Once the cruft is removed from index.ts, these two files should probably converge
|
|
3
|
+
|
|
4
|
+
// opentrons components library package
|
|
5
|
+
|
|
6
|
+
export * from './hardware-sim'
|
|
7
|
+
|
|
8
|
+
export * from './primitives'
|
|
9
|
+
|
|
10
|
+
export * from './ui-style-constants'
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type * as React from 'react'
|
|
2
|
+
import cx from 'classnames'
|
|
3
|
+
import omit from 'lodash/omit'
|
|
4
|
+
|
|
5
|
+
import { Icon } from '../icons'
|
|
6
|
+
import styles from './buttons.module.css'
|
|
7
|
+
|
|
8
|
+
import { BUTTON_TYPE_BUTTON } from '../primitives'
|
|
9
|
+
|
|
10
|
+
import type { BUTTON_TYPE_SUBMIT, BUTTON_TYPE_RESET } from '../primitives'
|
|
11
|
+
import type { IconName } from '../icons'
|
|
12
|
+
import type { UseHoverTooltipTargetProps } from '../tooltips'
|
|
13
|
+
|
|
14
|
+
export interface ButtonProps {
|
|
15
|
+
/** id attribute */
|
|
16
|
+
id?: string
|
|
17
|
+
/** click handler */
|
|
18
|
+
onClick?: React.MouseEventHandler
|
|
19
|
+
/** name attribute */
|
|
20
|
+
name?: string
|
|
21
|
+
/** title attribute */
|
|
22
|
+
title?: string
|
|
23
|
+
/** disabled attribute (setting disabled removes onClick) */
|
|
24
|
+
disabled?: boolean | null | undefined
|
|
25
|
+
/** use hover style even when not hovered */
|
|
26
|
+
hover?: boolean | null | undefined
|
|
27
|
+
/** optional Icon name */
|
|
28
|
+
iconName?: IconName
|
|
29
|
+
/** classes to apply */
|
|
30
|
+
className?: string
|
|
31
|
+
/** inverts the default color/background/border of default button style */
|
|
32
|
+
inverted?: boolean
|
|
33
|
+
/** contents of the button */
|
|
34
|
+
children?: React.ReactNode
|
|
35
|
+
/** type of button (default "button") */
|
|
36
|
+
type?:
|
|
37
|
+
| typeof BUTTON_TYPE_SUBMIT
|
|
38
|
+
| typeof BUTTON_TYPE_RESET
|
|
39
|
+
| typeof BUTTON_TYPE_BUTTON
|
|
40
|
+
/** ID of form that button is for */
|
|
41
|
+
form?: string
|
|
42
|
+
/** custom element or component to use instead of `<button>` */
|
|
43
|
+
Component?: React.ComponentType<any> | keyof JSX.IntrinsicElements
|
|
44
|
+
/** handlers for HoverTooltipComponent */
|
|
45
|
+
hoverTooltipHandlers?: UseHoverTooltipTargetProps | null | undefined
|
|
46
|
+
/** html tabindex property */
|
|
47
|
+
tabIndex?: number
|
|
48
|
+
/** catch all prop for pass-through props */
|
|
49
|
+
[name: string]: any
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// props to strip if using a custom component
|
|
53
|
+
const STRIP_PROPS = [
|
|
54
|
+
'inverted',
|
|
55
|
+
'iconName',
|
|
56
|
+
'children',
|
|
57
|
+
'Component',
|
|
58
|
+
'hoverTooltipHandlers',
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Basic, un-styled button. You probably want to use a styled button
|
|
63
|
+
* instead. All buttons take the same props.
|
|
64
|
+
*
|
|
65
|
+
* If you need access to the ButtonProps type, you can:
|
|
66
|
+
* ```js
|
|
67
|
+
* import {type ButtonProps} from '@opentrons/components'
|
|
68
|
+
* ```
|
|
69
|
+
* @deprecated Use {@link Btn}
|
|
70
|
+
*/
|
|
71
|
+
export function Button(props: ButtonProps): JSX.Element {
|
|
72
|
+
const { id, name, title, disabled, hover, tabIndex, form } = props
|
|
73
|
+
const className = cx(props.className, { [styles.hover]: hover })
|
|
74
|
+
const onClick = !disabled ? props.onClick : undefined
|
|
75
|
+
const Component: any = props.Component ?? 'button'
|
|
76
|
+
const type = props.type ?? BUTTON_TYPE_BUTTON
|
|
77
|
+
|
|
78
|
+
// pass all props if using a custom component
|
|
79
|
+
const buttonProps = !props.Component
|
|
80
|
+
? { id, name, type, form, title, disabled, onClick, className, tabIndex }
|
|
81
|
+
: {
|
|
82
|
+
...omit(props, STRIP_PROPS),
|
|
83
|
+
className: cx(className, { [styles.disabled]: disabled }),
|
|
84
|
+
onClick,
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// TODO(mc, 2019-04-02): hoverTooltipHandlers should probably be named more
|
|
88
|
+
// generically, and the Button component should probably be configured as a
|
|
89
|
+
// ref forwarder
|
|
90
|
+
return (
|
|
91
|
+
<Component {...props.hoverTooltipHandlers} {...buttonProps}>
|
|
92
|
+
{props.iconName && <Icon name={props.iconName} className={styles.icon} />}
|
|
93
|
+
{props.children}
|
|
94
|
+
</Component>
|
|
95
|
+
)
|
|
96
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import cx from 'classnames'
|
|
2
|
+
|
|
3
|
+
import { Button } from './Button'
|
|
4
|
+
import styles from './buttons.module.css'
|
|
5
|
+
|
|
6
|
+
import type { ButtonProps } from './Button'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Primary application button. Fills its container and has a dark
|
|
10
|
+
* background with white text
|
|
11
|
+
*
|
|
12
|
+
* @deprecated Use {@link PrimaryButton}
|
|
13
|
+
*/
|
|
14
|
+
export function DeprecatedPrimaryButton(props: ButtonProps): JSX.Element {
|
|
15
|
+
const className = cx(styles.button_primary, props.className, {
|
|
16
|
+
[styles.inverted]: props.inverted,
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<Button {...props} className={className}>
|
|
21
|
+
{props.children}
|
|
22
|
+
</Button>
|
|
23
|
+
)
|
|
24
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import classnames from 'classnames'
|
|
2
|
+
|
|
3
|
+
import { Button } from './Button'
|
|
4
|
+
import styles from './buttons.module.css'
|
|
5
|
+
|
|
6
|
+
import type { ButtonProps } from './Button'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Flat-styled button with a default width of `9rem` and no background fill
|
|
10
|
+
*/
|
|
11
|
+
export function FlatButton(props: ButtonProps): JSX.Element {
|
|
12
|
+
const className = classnames(styles.button_flat, props.className, {
|
|
13
|
+
[styles.inverted]: props.inverted,
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<Button {...props} className={className}>
|
|
18
|
+
{props.children}
|
|
19
|
+
</Button>
|
|
20
|
+
)
|
|
21
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import cx from 'classnames'
|
|
2
|
+
|
|
3
|
+
import { Icon } from '../icons'
|
|
4
|
+
import { FlatButton } from './FlatButton'
|
|
5
|
+
|
|
6
|
+
import styles from './buttons.module.css'
|
|
7
|
+
|
|
8
|
+
import type { IconProps } from '../icons'
|
|
9
|
+
import type { ButtonProps } from './Button'
|
|
10
|
+
|
|
11
|
+
interface Props extends ButtonProps {
|
|
12
|
+
name: IconProps['name']
|
|
13
|
+
spin?: IconProps['spin']
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* FlatButton variant for a button that is a single icon. Takes props of
|
|
18
|
+
* both Button _and_ Icon. Use `name` to specify icon name.
|
|
19
|
+
*
|
|
20
|
+
* @deprecated Use {@link Btn} and {@link Icon}
|
|
21
|
+
*/
|
|
22
|
+
export function IconButton(props: Props): JSX.Element {
|
|
23
|
+
// TODO(mc, 2020-02-04): ButtonProps::name conflicts with IconProps::name
|
|
24
|
+
// this component will need to be redone so underlying `button` can still
|
|
25
|
+
// receive an HTML name for a11y
|
|
26
|
+
const { name, spin, ...buttonProps } = props
|
|
27
|
+
const iconProps = { name, spin }
|
|
28
|
+
const className = cx(styles.button_icon, props.className, {
|
|
29
|
+
[styles.inverted]: props.inverted,
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<FlatButton {...buttonProps} className={className} iconName={undefined}>
|
|
34
|
+
<Icon {...iconProps} />
|
|
35
|
+
</FlatButton>
|
|
36
|
+
)
|
|
37
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import cx from 'classnames'
|
|
2
|
+
|
|
3
|
+
import { Button } from './Button'
|
|
4
|
+
import styles from './buttons.module.css'
|
|
5
|
+
|
|
6
|
+
import type { ButtonProps } from './Button'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Button with no background fill and a dark border.
|
|
10
|
+
* Use inverted prop for buttons on dark backgrounds.
|
|
11
|
+
*
|
|
12
|
+
* @deprecated Use {@link SecondaryBtn}
|
|
13
|
+
*/
|
|
14
|
+
export function OutlineButton(props: ButtonProps): JSX.Element {
|
|
15
|
+
const className = cx(styles.button_outline, props.className, {
|
|
16
|
+
[styles.inverted]: props.inverted,
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<Button {...props} className={className}>
|
|
21
|
+
{props.children}
|
|
22
|
+
</Button>
|
|
23
|
+
)
|
|
24
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type * as React from 'react'
|
|
2
|
+
|
|
3
|
+
import styles from './styles.module.css'
|
|
4
|
+
|
|
5
|
+
export interface ControlInfoProps {
|
|
6
|
+
children: React.ReactNode
|
|
7
|
+
className?: string
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function ControlInfo(props: ControlInfoProps): JSX.Element {
|
|
11
|
+
const { children, className = styles.control_info } = props
|
|
12
|
+
return <div className={className}>{children}</div>
|
|
13
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type * as React from 'react'
|
|
2
|
+
import cx from 'classnames'
|
|
3
|
+
|
|
4
|
+
import { OutlineButton } from '../buttons'
|
|
5
|
+
import { LabeledControl } from './LabeledControl'
|
|
6
|
+
import styles from './styles.module.css'
|
|
7
|
+
|
|
8
|
+
import type { ButtonProps } from '../buttons'
|
|
9
|
+
|
|
10
|
+
export interface LabeledButtonProps {
|
|
11
|
+
label: string
|
|
12
|
+
buttonProps: ButtonProps
|
|
13
|
+
children: React.ReactNode
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function LabeledButton(props: LabeledButtonProps): JSX.Element {
|
|
17
|
+
const { label, buttonProps } = props
|
|
18
|
+
const buttonClass = cx(styles.labeled_button, buttonProps.className)
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<LabeledControl
|
|
22
|
+
label={label}
|
|
23
|
+
control={<OutlineButton {...buttonProps} className={buttonClass} />}
|
|
24
|
+
>
|
|
25
|
+
{props.children}
|
|
26
|
+
</LabeledControl>
|
|
27
|
+
)
|
|
28
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type * as React from 'react'
|
|
2
|
+
import cx from 'classnames'
|
|
3
|
+
|
|
4
|
+
import { DeprecatedCheckboxField } from '../forms'
|
|
5
|
+
import { LabeledControl } from './LabeledControl'
|
|
6
|
+
import styles from './styles.module.css'
|
|
7
|
+
|
|
8
|
+
export interface LabeledCheckboxProps {
|
|
9
|
+
label: string
|
|
10
|
+
name: string
|
|
11
|
+
value: boolean
|
|
12
|
+
className?: string
|
|
13
|
+
children: React.ReactNode
|
|
14
|
+
onChange: React.ChangeEventHandler<HTMLInputElement>
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function LabeledCheckbox(props: LabeledCheckboxProps): JSX.Element {
|
|
18
|
+
const { label, value, name, onChange } = props
|
|
19
|
+
const checkboxClass = cx(styles.labeled_checkbox, props.className)
|
|
20
|
+
return (
|
|
21
|
+
<LabeledControl
|
|
22
|
+
label={label}
|
|
23
|
+
control={
|
|
24
|
+
<DeprecatedCheckboxField
|
|
25
|
+
className={checkboxClass}
|
|
26
|
+
name={name}
|
|
27
|
+
value={value}
|
|
28
|
+
onChange={onChange}
|
|
29
|
+
/>
|
|
30
|
+
}
|
|
31
|
+
>
|
|
32
|
+
{props.children}
|
|
33
|
+
</LabeledControl>
|
|
34
|
+
)
|
|
35
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type * as React from 'react'
|
|
2
|
+
|
|
3
|
+
import { ControlInfo } from './ControlInfo'
|
|
4
|
+
import styles from './styles.module.css'
|
|
5
|
+
|
|
6
|
+
export interface LabeledControlProps {
|
|
7
|
+
label: string
|
|
8
|
+
control: React.ReactNode
|
|
9
|
+
children?: React.ReactNode
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function LabeledControl(props: LabeledControlProps): JSX.Element {
|
|
13
|
+
const { label, control, children } = props
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<div className={styles.labeled_control_wrapper}>
|
|
17
|
+
<div className={styles.labeled_control}>
|
|
18
|
+
<p className={styles.labeled_control_label}>{label}</p>
|
|
19
|
+
{control}
|
|
20
|
+
</div>
|
|
21
|
+
{children && <ControlInfo>{children}</ControlInfo>}
|
|
22
|
+
</div>
|
|
23
|
+
)
|
|
24
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type * as React from 'react'
|
|
2
|
+
|
|
3
|
+
import { StackedLabeledControl } from './StackedLabeledControl'
|
|
4
|
+
import { RadioGroup } from '../forms'
|
|
5
|
+
|
|
6
|
+
import type { RadioGroupProps } from '../forms'
|
|
7
|
+
|
|
8
|
+
export interface LabeledRadioGroupProps extends RadioGroupProps {
|
|
9
|
+
label: string
|
|
10
|
+
children: React.ReactNode
|
|
11
|
+
'data-test'?: string
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function LabeledRadioGroup(props: LabeledRadioGroupProps): JSX.Element {
|
|
15
|
+
const { label, value, options, onChange } = props
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<StackedLabeledControl
|
|
19
|
+
label={label}
|
|
20
|
+
control={
|
|
21
|
+
<RadioGroup value={value} options={options} onChange={onChange} />
|
|
22
|
+
}
|
|
23
|
+
>
|
|
24
|
+
{props.children}
|
|
25
|
+
</StackedLabeledControl>
|
|
26
|
+
)
|
|
27
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type * as React from 'react'
|
|
2
|
+
|
|
3
|
+
import { DropdownField } from '../forms'
|
|
4
|
+
import { LabeledControl } from './LabeledControl'
|
|
5
|
+
import styles from './styles.module.css'
|
|
6
|
+
|
|
7
|
+
import type { DropdownFieldProps } from '../forms'
|
|
8
|
+
|
|
9
|
+
export interface LabeledSelectProps extends DropdownFieldProps {
|
|
10
|
+
label: string
|
|
11
|
+
children: React.ReactNode
|
|
12
|
+
/** optional data test id for the container */
|
|
13
|
+
'data-test'?: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function LabeledSelect(props: LabeledSelectProps): JSX.Element {
|
|
17
|
+
const { label, value, options, onChange } = props
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<LabeledControl
|
|
21
|
+
label={label}
|
|
22
|
+
control={
|
|
23
|
+
<DropdownField
|
|
24
|
+
className={styles.labeled_select}
|
|
25
|
+
value={value}
|
|
26
|
+
options={options}
|
|
27
|
+
onChange={onChange}
|
|
28
|
+
/>
|
|
29
|
+
}
|
|
30
|
+
>
|
|
31
|
+
{props.children}
|
|
32
|
+
</LabeledControl>
|
|
33
|
+
)
|
|
34
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type * as React from 'react'
|
|
2
|
+
|
|
3
|
+
import { LabeledControl } from './LabeledControl'
|
|
4
|
+
import { ToggleButton } from './ToggleButton'
|
|
5
|
+
import styles from './styles.module.css'
|
|
6
|
+
|
|
7
|
+
export interface LabeledToggleProps {
|
|
8
|
+
label: string
|
|
9
|
+
toggledOn: boolean
|
|
10
|
+
disabled?: boolean
|
|
11
|
+
children?: React.ReactNode
|
|
12
|
+
onClick: () => unknown
|
|
13
|
+
/** optional data test id for the container */
|
|
14
|
+
'data-test'?: string
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function LabeledToggle(props: LabeledToggleProps): JSX.Element {
|
|
18
|
+
const { label, toggledOn, disabled, onClick } = props
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<LabeledControl
|
|
22
|
+
label={label}
|
|
23
|
+
control={
|
|
24
|
+
<ToggleButton
|
|
25
|
+
className={styles.labeled_toggle_button}
|
|
26
|
+
toggledOn={toggledOn}
|
|
27
|
+
disabled={disabled}
|
|
28
|
+
onClick={onClick}
|
|
29
|
+
/>
|
|
30
|
+
}
|
|
31
|
+
>
|
|
32
|
+
{props.children}
|
|
33
|
+
</LabeledControl>
|
|
34
|
+
)
|
|
35
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type * as React from 'react'
|
|
2
|
+
|
|
3
|
+
import { ControlInfo } from './ControlInfo'
|
|
4
|
+
import styles from './styles.module.css'
|
|
5
|
+
|
|
6
|
+
export interface StackedLabeledControlProps {
|
|
7
|
+
label: string
|
|
8
|
+
control: React.ReactNode
|
|
9
|
+
children?: React.ReactNode
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function StackedLabeledControl(
|
|
13
|
+
props: StackedLabeledControlProps
|
|
14
|
+
): JSX.Element {
|
|
15
|
+
const { label, control, children } = props
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<div className={styles.labeled_control_wrapper}>
|
|
19
|
+
<p className={styles.stacked_labeled_control_label}>{label}</p>
|
|
20
|
+
{children && (
|
|
21
|
+
<ControlInfo className={styles.stacked_control_info}>
|
|
22
|
+
{children}
|
|
23
|
+
</ControlInfo>
|
|
24
|
+
)}
|
|
25
|
+
<div className={styles.stacked_labeled_control}>{control}</div>
|
|
26
|
+
</div>
|
|
27
|
+
)
|
|
28
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// reusable toggle button with on off styling for connect to robot and opt in/out
|
|
2
|
+
import cx from 'classnames'
|
|
3
|
+
import { IconButton } from '../buttons'
|
|
4
|
+
import styles from './styles.module.css'
|
|
5
|
+
|
|
6
|
+
import type { ButtonProps } from '../buttons'
|
|
7
|
+
|
|
8
|
+
export interface ToggleButtonProps extends ButtonProps {
|
|
9
|
+
toggledOn: boolean
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function ToggleButton(props: ToggleButtonProps): JSX.Element {
|
|
13
|
+
// TODO(mc, 2020-02-04): destructuring `name` to avoid flow error
|
|
14
|
+
// ButtonProps::name conflicts with IconProps::name, and IconButton
|
|
15
|
+
// has `name` prop to pass to Icon. IconButton will need to be redone
|
|
16
|
+
const { toggledOn, name, ...buttonProps } = props
|
|
17
|
+
const className = cx(styles.robot_item_icon, props.className, {
|
|
18
|
+
[styles.toggled_on]: toggledOn,
|
|
19
|
+
[styles.toggled_off]: !toggledOn,
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
const toggleIcon = toggledOn ? 'ot-toggle-switch-on' : 'ot-toggle-switch-off'
|
|
23
|
+
|
|
24
|
+
return <IconButton {...buttonProps} name={toggleIcon} className={className} />
|
|
25
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// TODO: All of these are not actually reusable and shouldn't be in the
|
|
2
|
+
// components library. They belong in the app components (and they also
|
|
3
|
+
// belong in the please-refactor-these-to-use-primitives-and-styled-components
|
|
4
|
+
// category). We should move them all.
|
|
5
|
+
export * from './ToggleButton'
|
|
6
|
+
export * from './LabeledToggle'
|
|
7
|
+
export * from './LabeledButton'
|
|
8
|
+
export * from './LabeledSelect'
|
|
9
|
+
export * from './LabeledCheckbox'
|
|
10
|
+
export * from './LabeledRadioGroup'
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as React from 'react'
|
|
2
|
+
|
|
3
|
+
import { DeprecatedCheckboxField as DeprecatedCheckboxComponent } from './DeprecatedCheckboxField'
|
|
4
|
+
|
|
5
|
+
import type { Story, Meta } from '@storybook/react'
|
|
6
|
+
|
|
7
|
+
export default {
|
|
8
|
+
title: 'Library/Molecules/Forms/Deprecated Checkbox Field',
|
|
9
|
+
component: DeprecatedCheckboxComponent,
|
|
10
|
+
} as Meta
|
|
11
|
+
|
|
12
|
+
const Template: Story<
|
|
13
|
+
React.ComponentProps<typeof DeprecatedCheckboxComponent>
|
|
14
|
+
> = args => {
|
|
15
|
+
const [isChecked, setIsChecked] = React.useState<boolean>(false)
|
|
16
|
+
return (
|
|
17
|
+
<DeprecatedCheckboxComponent
|
|
18
|
+
{...args}
|
|
19
|
+
onChange={e => {
|
|
20
|
+
setIsChecked(!isChecked)
|
|
21
|
+
args.onChange(e)
|
|
22
|
+
}}
|
|
23
|
+
value={isChecked}
|
|
24
|
+
/>
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
export const DeprecatedCheckboxField = Template.bind({})
|
|
28
|
+
DeprecatedCheckboxField.args = {
|
|
29
|
+
label: 'Remember this setting?',
|
|
30
|
+
isIndeterminate: false,
|
|
31
|
+
}
|