React Inline Grid
A predictable gird layout based on flexbox for React applications using inline styles.
Install
npm install react-inline-grid --save
API
Sample Usage
import React from 'react';
import ReactDOM from 'react-dom';
import { Grid, Row, Cell } from 'react-inline-grid';
const Layout = React.createClass({
render() {
return (
<Grid>
<Row is="center">
<Cell is="3 tablet-4 phone-4"><div>content_a</div></Cell>
<Cell is="3 tablet-4 phone-4"><div>content_b</div></Cell>
</Row>
</Grid>
);
}
});
ReactDOM.render(<Layout />, document.body);
The library exports Grid
, Row
and Cell
.
<Grid />
Grid wrap inner components with React Redux <Provider>
.
Using Redux, Grid's inner components can react to store update. Here Redux is used to handle MediaQueryList changes and update components style
property:
// phone
<div style="...; width: calc(100% - 16px);"><div>
// tablet
<div style="...; width: calc(50% - 16px);"><div>
// desktop
<div style="...; width: calc(25% - 16px);"><div>
Grid exposes the property options
allowing you to define custom grid settings.
options
shape:
{
columns: number // default = 12 - Columns size for the bigger media.
gutter: number // default = 16 - Gutter size in pixel.
margin: number // default = 16 - Margin size in pixel.
deaf: bool // default = false - Ignore MediaQueryList updates.
list: [ // default = [...] - List of target media.
{
name: string // required - Media name.
query: string // required - Media query to test.
gutter: number // default = options -> gutter - Media gutter size in pixel.
margin: number // default = options -> margin - Media margin size in pixel.
}
]
}
If options
is not provided, or invalid, it will be fixed to apply values inspired by Google Material Design Lite grid layout:
// options -> list
[
{
name: 'phone',
gutter: 16,
margin: 16,
columns: 4,
query: '(max-width: 479px)'
},
{
name: 'tablet',
gutter: 16,
margin: 16,
columns: 8,
query: '(min-width: 480px) and (max-width: 839px)'
},
{
name: 'desktop',
gutter: 16,
margin: 16,
columns: 12,
query: '(min-width: 840px)'
}
]
If no media match the queries, Grid will define the first options -> list -> value
as default current media in order to match the "popular" mobile first approch.
<Row />
Exposes the property is
(string) to update the following default style object:
{
display: 'flex',
flexFlow: 'row wrap',
alignItems: 'stretch'
}
is
specify the justify-content
style property as:
start
center
end
around
between
<Row is="center phone-end">
<Cell>
<div>Content</div>
</Cell>
</Row>
// not phone
<div style="...; justify-content:center;">
<Cell>
<div>Content</div>
</Cell>
</div>
// phone
<div style="...; justify-content:flex-end;">
<Cell>
<div>Content</div>
</Cell>
</div>
<Cell />
Exposes the property is
(string) to update the following default style object:
{
boxSizing: 'border-box'
}
is
specify cell size and align-self
style property as:
<value>
<media name?>-<value>
<media name?>-offset-<value>
top
middle
bottom
stretch
<Row>
<Cell is="middle 4 tablet-2 offset-1">
<div>Content</div>
</Cell>
</Row>
// desktop
<Row>
<div style="...; width:calc(33.33...% - 16px);align-self:center;margin-left:calc(8.33...% - 8px);">
<div>Content</div>
</div>
</Row>
// tablet
<Row>
<div style="...; width:calc(12.5% - 16px);align-self:center;margin-left:calc(25% - 8px);">
<div>Content</div>
</div>
</Row>
// phone
<Row>
<div style="...; width:calc(25% - 16px);align-self:center;margin-left:calc(100% - 8px);">
<div>Content</div>
</div>
</Row>
For both <Row />
and <Cell />
, is
property ask for an "already defined" values, the last one is used:
<Cell is="3 2 1">
<div>Content</div>
</Cell>
// will be defined as
<Cell is="1">
<div>Content</div>
</Cell>
Examples
The gh-pages page of this repository use some patterns as examples, but feel free to play and test your layouts using the examples
folder.
Run the gh-pages example:
git clone https://github.com/broucz/react-inline-grid.git
cd react-inline-grid
npm install
cd examples/react-transform-boilerplate
npm install
npm start
open http://localhost:3000/
Thanks
- Redux I learned a lot from package evolution, author @gaearon, contributors, and related discussions.
- React for the fun.
- React Redux to make it easier.