A Package for CSS Grid and Flexbox React Components
First install the package:
npm install --save @sillvva/react-styled-flexgrid
Then you can import the components like so:
import { Grid, Flex } from "@sillvva/react-styled-flexgrid";
react-styled-flexgrid allows you to specify different configurations for your grid and flexbox components for different screen sizes. The breakpoints used are as follows:
Breakpoint | Screen Width |
---|---|
xs | >= 0px |
sm | >= 576px |
md | >= 768px |
lg | >= 992px |
xl | >= 1199px |
For each of the props of the Grid
, Grid.Item
, Flex
and Flex.Item
components, you can define a different value for each breakpoint. Each breakpoint defines the properties for the screen width listed or higher. If you define a higher break point, it's values will take precedent. If you define the xs
breakpoint, but no others, then it wil be treated the same as having no breakpoints.
For example:
<Flex justify={{xs: "right", md: "center"}}></Flex>
For more detailed information on how CSS Grid works, visit this complete guide.
The CSS Grid components are made of three parts: Grid
, Grid.Row
, and Grid.Item
. Here is a grid of ratings that adds a second column at larger screen sizes:
const Ratings = (props) => {
const columnBuilder = (columns) => {
return Array(columns).fill("1fr 110px").join(" ");
};
return (
<Grid
colGap={{xs: 5, lg: 30}}
rowGap={{xs: 5, lg: 10}}
columns={{xs: columnBuilder(1), lg: columnBuilder(2)}}>
{Array(2).fill(1).map((col, i) => (
<Grid.Row key={"ratings" + i}>
<Grid.Item show={{xs: i === 0, lg: true}}>
<h5>Skill</h5>
</Grid.Item>
<Grid.Item justify="right" show={{xs: i === 0, lg: true}}>
<h5>Rating</h5>
</Grid.Item>
</Grid.Row>
))}
<RatedItem name="Angular" rating={3} />
<RatedItem name="Bootstrap Framework" rating={5} />
<RatedItem name="CSS3" rating={5} />
<RatedItem name="Express" rating={3.5} />
<RatedItem name="HTML5" rating={5} />
<RatedItem name="JavaScript" rating={5} />
<RatedItem name="jQuery" rating={5} />
<RatedItem name="JSON" rating={5} />
<RatedItem name="Node.Js" rating={3.5} />
<RatedItem name="PHP" rating={4} />
<RatedItem name="PhpStorm" rating={4} />
<RatedItem name="React" rating={4} />
<RatedItem name="SASS / SCSS" rating={4} />
<RatedItem name="TypeScript" rating={3.5} />
</Grid>
);
};
as
- define the flex container as a specific element, by tag name.- Default:
"div"
- Default:
style
- define additional inline stylesclassName
- add additional css classes
inline
- (Type:Boolean
) determines whether to usedisplay: grid
ordisplay: inline-grid
;columns
- defines the column sizes for the grid- Type:
String
- Example:"1fr 110px 1fr 110px"
- Type:
Array
- Example:["1fr", 110, "1fr", 110]
{min: Integer | String}
- creates equal width columns with a minimum width. Items in a grid with this type of column definition will wrap.
- Type:
rows
- defines the row sizes for the grid.- Type:
String
- Example:"100px 100px"
- Type:
Array
- Example:[100, "100px"]
- Type:
areas
- defines a grid template by referencing the names of the grid areas which are specified with thearea
prop of theGrid.Item
component. Repeating the name of a grid area causes the content to span those cells. A period signifies an empty cell. The syntax itself provides a visualization of the structure of the grid.- Type:
String[][]
- Example:[["Header", "Header"],["Sidebar", "Body"]]
- Type:
autoColWidth
andautoRowHeight
- (Integer | String
) defines the cell size for sections of a grid not defined bycolumns
androws
. For example, if a grid had 5 items in a grid ofcolumns={[100, 100]} rows={[100, 100]}
, thenautoRowHeight
would define the height of the 5th item as it is placed into a third undefined row.flow
- If you have grid items that you don't explicitly place on the grid, the auto-placement algorithm kicks in to automatically place the items. This property controls how the auto-placement algorithm works.- Default:
"row"
row
- tells the auto-placement algorithm to fill in each row in turn, adding new rows as necessarycolumn
- tells the auto-placement algorithm to fill in each column in turn, adding new columns as necessaryrow dense
andcolumn dense
- tells the auto-placement algorithm to attempt to fill in holes earlier in the grid if smaller items come up later
- Default:
gap
- (Type:Integer | String
) defines the gap between cells in CSS unitscolGap
- (Type:Integer | String
) defines the gap between cell columns in CSS unitsrowGap
- (Type:Integer | String
) defines the gap between cell rows in CSS unitsalign
- Sometimes the total size of your grid might be less than the size of its grid container. This could happen if all of your grid items are sized with non-flexible units like px. This property aligns the grid along the vertical (column) axis.start
- aligns the grid to be flush with the start edge of the grid containerend
- aligns the grid to be flush with the end edge of the grid containercenter
- aligns the grid in the center of the grid containerstretch
- resizes the grid items to allow the grid to fill the full height of the grid containerspace-around
- places an even amount of space between each grid item, with half-sized spaces on the far endsspace-between
- places an even amount of space between each grid item, with no space at the far endsspace-evenly
- places an even amount of space between each grid item, including the far ends
justify
- Sometimes the total size of your grid might be less than the size of its grid container. This could happen if all of your grid items are sized with non-flexible units like px. This property aligns the grid along the horizontal (row) axis.start
- aligns the grid to be flush with the start edge of the grid containerend
- aligns the grid to be flush with the end edge of the grid containercenter
- aligns the grid in the center of the grid containerstretch
- resizes the grid items to allow the grid to fill the full height of the grid containerspace-around
- places an even amount of space between each grid item, with half-sized spaces on the far endsspace-between
- places an even amount of space between each grid item, with no space at the far endsspace-evenly
- places an even amount of space between each grid item, including the far ends
alignItems
- Aligns grid items along the vertical (column) axis. This value applies to all grid items inside the container.- Default:
"stretch"
start
- aligns items to be flush with the start edge of their cellend
- aligns items to be flush with the end edge of their cellcenter
- aligns items in the center of their cellstretch
- fills the whole width of the cell
- Default:
justifyItems
- Aligns grid items along the horizontal (row) axis. This value applies to all grid items inside the container.- Default:
"stretch"
start
- aligns items to be flush with the start edge of their cellend
- aligns items to be flush with the end edge of their cellcenter
- aligns items in the center of their cellstretch
- fills the whole width of the cell
- Default:
width
- (Type:Integer | String
) The width of the grid container in CSS unitsheight
- (Type:Integer | String
) The height of the grid container in CSS unitsshow
- (Type:Boolean
) controls whether the grid container is presentitemProps
- defines a global set of props for the immediate children of this component.
This is simply a higher order component for rendering an array of multiple grid items as seen in the example above.
as
- define the flex container as a specific element, by tag name.- Default:
"div"
- Default:
style
- define additional inline stylesclassName
- add additional css classes
area
- (Type:String
) gives an item a name so that it can be referenced by a template created with theareas
prop of theGrid
component.column
- (Type:String
) same as[columnStart] / [columnEnd]
columnStart
- (Type:Integer | String
) determines a grid item's location within the grid by referring to specific grid lines.columnEnd
- (Type:Integer | String
) determines a grid item's location within the grid by referring to specific grid lines.row
- (Type:String
) same as[rowStart] / [rowEnd]
rowStart
- (Type:Integer | String
) determines a grid item's location within the grid by referring to specific grid lines.rowEnd
- (Type:Integer | String
) determines a grid item's location within the grid by referring to specific grid lines.align
- (Type:String
) aligns a grid item inside a cell along the vertical (column) axis. This value applies to a grid item inside a single cell.- Default:
"stretch"
start
- aligns item to be flush with the start edge of their cellend
- aligns item to be flush with the end edge of their cellcenter
- aligns item in the center of their cellstretch
- fills the whole width of the cell
- Default:
justify
- (Type:String
) aligns a grid item inside a cell along the horizontal (row) axis. This value applies to a grid item inside a single cell.- Default:
"stretch"
start
- aligns item to be flush with the start edge of their cellend
- aligns item to be flush with the end edge of their cellcenter
- aligns item in the center of their cellstretch
- fills the whole width of the cell
- Default:
width
- (Type:Integer | String
) The width of the grid item in CSS unitsheight
- (Type:Integer | String
) The height of the grid item in CSS unitsshow
- (Type:Boolean
) controls whether the grid item is presentitemProps
- defines a global set of props for the immediate children of this component.
For more information on how flexbox works, visit this complete guide.
The Flexbox components are made of two parts: Flex
and Flex.Item
. Here is a navbar example of flexbox usage:
const Navbar = (props) => {
const navbarHeight = 60;
return (
<Flex as="header" height={navbarHeight} alignItems="center" className="navbar">
<Flex.Item width={100}>Logo</Flex.Item>
<Flex.Item
as="nav"
flex={{ min: "auto", grow: 1 }}
itemProps={{
alignItems: "center",
height: navbarHeight,
inline: true,
show: { xs: false, md: true }
}}>
<Flex as="a" href="/services">
Services
</Flex>
<Flex as="a" href="/pricing">
Services
</Flex>
</Flex.Item>
<Flex.Item itemProps={{ alignItems: "center", height: navbarHeight }}>
<Flex as="a" href="/account" show={{ xs: false, md: true }}>
Account
</Flex>
<Flex as="span" show={{ xs: true, md: false }}>
<svg width="1em" height="1em" viewBox="0 0 20 20">
<path d="M20 5V2H0v3h20zm0 6V8H0v3h20zm0 6v-3H0v3h20z" fill="currentColor" />
</svg>
</Flex>
</Flex.Item>
</Flex>
);
};
This is the flexbox container component.
as
- define the flex container as a specific element, by tag name.- Default:
"div"
- Default:
style
- define additional inline stylesclassName
- add additional css classes
inline
- (Type:Boolean
) determines whether to usedisplay: flex
ordisplay: inline-flex
;dir
- defines the direction of the main axis- Default:
"row"
row
- left to right inltr
; right to left inrtl
row-reverse
- right to left inltr
; left to right inrtl
column
- same asrow
but top to bottomcolumn-reverse
- same asrow-reverse
but bottom to top
- Default:
wrap
- defines the wrapping behavior- Default:
"nowrap"
nowrap
- all flex items will be on one linewrap
- flex items will wrap onto multiple lines, from top to bottomwrap-reverse
- flex items will wrap onto multiple lines from bottom to top
- Default:
justify
- defines the alignment along the main axis- Default:
"flex-start"
flex-start
- items are packed toward the start of the main axis (seedir
)flex-end
- items are packed toward the end of the main axis (seedir
)center
- items are centered along the main axisspace-between
- items are evenly distributed on the main axis; first item is on the start line, last item on the end line.space-around
- items are evenly distributed on the main axis with equal space around them. Note that visually the spaces aren't equal, since all the items have equal space on both sides. The first item will have one unit of space against the container edge, but two units of space between the next item because that next item has its own spacing that applies.space-evenly
- items are distributed so that the spacing between any two items (and the space to the edges) is equal.
- Default:
align
- This aligns a flex container's lines within when there is extra space in the cross-axis, similar to howjustify
aligns individual items within the main-axis. Note: this property has no effect when items are not wrapped.- Default:
"stretch"
flex-start
- lines packed to the start of the containerflex-end
- lines packed to the end of the containercenter
- lines packed to the center of the containerspace-between
- lines evenly distributed; the first line is at the start of the container while the last one is at the endspace-around
- lines evenly distributed with equal space around each linestretch
- lines stretch to take up the remaining space
- Default:
alignItems
- defines the default behavior for how flex items are laid out along the cross axis on the current line. Think of it as thejustify
version for the cross-axis (perpendicular to the main-axis).- Default:
"stretch"
stretch
- stretch to fill the container (still respect min-width/max-width)flex-start
- cross-start margin edge of the items is placed on the cross-start lineflex-end
- cross-end margin edge of the items is placed on the cross-end linecenter
- items are centered in the cross-axisbaseline
- items are aligned such as their baselines align
- Default:
width
- (Type:Integer | String
) The width of the flex container in CSS unitsheight
- (Type:Integer | String
) The height of the flex container in CSS unitsshow
- (Type:Boolean
) controls whether the flex container is presentitemProps
- defines a global set of props for the immediate children of this component.
align
aligns rows of items when wrapping occurs perpendicular to the main axis.
alignItems
aligns items in each row perpendicular to the main axis of that row.
as
- define the flex item as a specific element, by tag name.- Default:
"div"
- Default:
style
- define additional inline stylesclassName
- add additional css classes
order
- controls the order in which a flex item appears in the flex container.- Type:
Integer
- Type:
flex
- defines the size of the flex item- Type:
Integer
- a unitless value that serves as the flex item's ratio of available space inside the flex container. {min: Integer | String, grow: Integer}
min
- the minimum width of the flex item in CSS unitsgrow
- the ratio of available space it grows to inside the flex container. If set to 0, the item will remain a fixed width.
{max: Integer | String, shrink: Integer}
max
- the maximum width of the flex item in CSS unitsshrink
- defines the ability for a flex item to shrink. If set to 0, the item will remain a fixed width.
- Type:
grow
- the ratio of available space it grows to inside the flex container.shrink
- defines the ability for a flex item to shrink.basis
- defines the default size of an element before the remaining space is distributed.align
- defines how the flex item is laid out perpendicular to the main axis.- Default:
"stretch"
stretch
- stretch to fill the container (still respect min-width/max-width)flex-start
- cross-start margin edge of the items is placed on the cross-start lineflex-end
- cross-end margin edge of the items is placed on the cross-end linecenter
- items are centered in the cross-axisbaseline
- items are aligned such as their baselines align
- Default:
width
- (Type:Integer | String
) The width of the flex item in CSS unitsheight
- (Type:Integer | String
) The height of the flex item in CSS unitsshow
- (Type:Boolean
) controls whether the flex item is presentitemProps
- defines a global set of props for the immediate children of this component.