react-boxen

A layout primitive for React.

Usage no npm install needed!

<script type="module">
  import reactBoxen from 'https://cdn.skypack.dev/react-boxen';
</script>

README

React Boxen

A layout primitive for React.

React Boxen utilizes Styled Components to provide cross-browser layout.

Why?

  • Flex Box Plus - Provides a helpful layer of abstraction on top of the robust (and sometimes confusing) display flex properties
  • Child spacing - Provides consistent spacing between child elements vertically, horizontally, and wrapping

Installation

npm install react-boxen --save or yarn add react-boxen

Usage Examples

Spacing vertically

This example produces a layout with each child spaced vertically.

import React from "react"
import Box from "react-boxen"

const css = {
  parent: `
    padding: 1em;
    background: lightgray;
  `,
  child: `
    padding: 0.75em;
    background: white;
  `
}

export default () =>
  <Box
    css={css.parent}
    childSpacing="10px">
    <Box css={css.child}>Child 1</Box>
    <Box css={css.child}>Child 2</Box>
    <Box css={css.child}>Child 3</Box>
  </Box>

Spacing horizontally

This example produces a layout with each child spaced horizontally.

import React from "react"
import Box from "react-boxen"

const css = {
  parent: `
    padding: 1em;
    background: lightgray;
  `,
  child: `
    padding: 0.75em;
    background: white;
  `
}

export default () =>
  <Box
    css={css.parent}
    childDirection="row"
    childSpacing="10px">
    <Box css={css.child}>Child 1</Box>
    <Box css={css.child}>Child 2</Box>
    <Box css={css.child}>Child 3</Box>
  </Box>

Child grow

When a child receives grow as a prop (or data-grow for native elements) it fills the available space.

import React from "react"
import Box from "react-boxen"

const css = {
  parent: `
    padding: 1em;
    background: lightgray;
  `,
  child: `
    padding: 0.75em;
    background: white;
  `
}

export default () =>
  <Box
    css={css.parent}
    childDirection="row"
    childSpacing="10px">
    <Box css={css.child}>Child 1</Box>
    <Box grow css={css.child}>Child 2</Box>
    <Box css={css.child}>Child 3</Box>
  </Box>

API

Box Properties

Properties placed on the Box component directly.

Property Type Value (default *) Description
css String Template literal containing valid CSS See styled-components documentation
childAlign String flex-start * flex-end center stretch baseline Align children along the cross axis
childBasis String Length Assigns flex-basis on children
childDirection String column * column-reverse row row-reverse Vertical or horizontal orientation of children
childJustify String flex-start * flex-end center space-between space-around Align children along the main axis
childWrap String nowrap * wrap wrap-reverse Define whether or not children can wrap
childWrapLastGrow Bool True * Setting to false preserves any orphan element's width when childWrap is wrap.
childSpacing String Length Spacing between children on any axis (accepts shorthand value 5px 10em)
padding String Length Accepts shorthand 5px 10em
...rest Any Any Rest of props (aside from children) are spread onto Box itself (e.g. onClick, onPress, etc.)

Child Properties

Properties added to any direct child. For compound components use values as shown. For native elements (e.g. <div />) use data-<grow|shrink|...> (i.e. <div data-grow>Child</div>).

Property Type Value (default *) Description
basis String Length Individual flex-basis. This controls the length (width or height) along the main axis.
grow Number 0 * Amount Box should grow to fill available space
scroll Bool False * Sets child wrapper to 100% height and overflow auto
shrink Number 0 * Amount Box should shrink inside available space
spacerRef Func null * A function used to access the reference of the child's wrapping Spacer

Roadmap

Technically, there is nothing preventing usage with React Native. The web is a more immediate proving ground. As the API solidifies, testing and support will be hammered out for RN. PRs are always welcome!