Flex is a layout component with a very limited subset of the props available to Box and a special prop of its own.
Use this component for flexbox layouts, especially when even spacing between elements is desired (see the gap
prop!).
also known as Row, Stack, Flexbox
Props
Accessibility
Subcomponents
Flex.Item
Use Flex.Item within a Flex container for more precise control over the child element. Flex children that are not explicitly wrapped in Flex.Item will be wrapped in the the component automatically to apply gap
spacing.
Flex.Item Props
Variants
Flex Layout
Flex is strictly for flex layouts. If you're new to flex layout, please read the excellent CSS-Tricks guide to flexbox for a great introduction. Also check out the entertaining Flexbox Froggy game for a fun way to get comfortable with flexbox properties.
Gap
Flex's gap
prop determines spacing between children. Use a single number for equal row and column spacing, or an object to specify different spacing for each direction. For example, use gap={{ row: 2, column: 4 }}
for different spacing between items in rows and columns (regardless of the specified direction
). Or use the gap={3}
shorthand for equal spacing for rows and columns.
import { Flex, Box, Text } from 'gestalt'; export default function Example() { return ( <Flex width="100%" height="100%" justifyContent="center" alignItems="center" > <Flex gap={6} direction="column"> <Flex direction="column" gap={2}> <Text>Equal vertical/horizontal spacing</Text> <Box borderStyle="sm" padding={2} rounding={3} width={150}> <Flex alignItems="center" gap={4} wrap> {[1, 2, 3, 4, 5, 6].map((x) => ( <Box key={`equalGap ${x}`} width={50} color="selected"> <Text color="light">Item {x}</Text> </Box> ))} </Flex> </Box> </Flex> <Flex direction="column" gap={2}> <Text>Different vertical/horizontal spacing</Text> <Box borderStyle="sm" padding={2} rounding={3} width={150}> <Flex alignItems="center" gap={{ row: 2, column: 8 }} wrap> {[1, 2, 3, 4, 5, 6].map((x) => ( <Box width={50} color="selected" key={`diffGap${x}`}> <Text color="light">Item {x}</Text> </Box> ))} </Flex> </Box> </Flex> </Flex> </Flex> ); }
Menu
Flex makes flexbox layouts with equally-spaced children a snap!
import { Flex, Box, Text } from 'gestalt'; export default function Example() { return ( <Flex height="100%" alignItems="center" justifyContent="center"> <Box borderStyle="sm" paddingX={2} paddingY={3} rounding={3} width={130}> <Flex alignItems="center" direction="column" gap={4}> <Text>Menu Item 1</Text> <Text>Menu Item 2</Text> <Text>Menu Item 3</Text> </Flex> </Box> </Flex> ); }
Applying flex properties to children
When using the gap
prop, Flex wraps each child in a Flex.Item sub-component. If one or more of those children need specific flex properties, you can use Flex.Item directly.
import { Flex, Box, Button } from 'gestalt'; export default function Example() { return ( <Flex width="100%" height="100%" justifyContent="center" alignItems="center" > <Box paddingX={2} paddingY={2} width="100%"> <Flex alignItems="center" gap={4}> <Button text="Button 1" /> <Flex.Item flex="grow"> <Button text="Button 2" /> </Flex.Item> <Button text="Button 3" /> </Flex> </Box> </Flex> ); }
Initial item width using flexBasis
If an item needs a different width in the flex layout than the content would otherwise indicate, flexBasis
can be used.
import { Flex, Text } from 'gestalt'; export default function Example() { return ( <Flex width="100%" height="100%" justifyContent="center" alignItems="center" > <Flex alignItems="center" gap={4}> <Flex.Item flexBasis={200}> <Text>Some text</Text> </Flex.Item> <Text>Some text</Text> <Flex.Item flexBasis="10em"> <Text> Some really really really really really really really long text </Text> </Flex.Item> </Flex> </Flex> ); }
Overflowing children and minWidth
Extra-wide children can sometimes overflow the Flex parent container, breaking the layout (and skipping truncation, if applicable).
To fix this, simply wrap the wide child in Flex.Item with minWidth={0}
. Voila!
For more info, check out this very helpful blog post.
import { Flex, Box, Text, Icon, Badge } from 'gestalt'; export default function Example() { return ( <Flex width="100%" height="100%" justifyContent="center" alignItems="center" > <Box padding={3} rounding={3}> <Flex alignItems="center" gap={3}> <Icon accessibilityLabel="Private" icon="lock" /> <Flex.Item minWidth={0}> <Text lineClamp={2}> Some really long title text that just keeps going and going and going and going and going and going and going and going and going and going and going and going and going and going and going and going </Text> </Flex.Item> <Badge text="Try it out!" /> </Flex> </Box> </Flex> ); }
Component quality checklist
Quality item | Status | Status description |
---|---|---|
Figma Library | Component is not currently available in Figma. | |
Responsive Web | Ready | Component is available in code for web and mobile web. |
iOS | Component is not currently available in code for iOS. | |
Android | Component is not currently available in code for Android. |