140 lines
4.9 KiB
React
140 lines
4.9 KiB
React
import classNames from 'classnames';
|
|
import PropTypes from 'prop-types';
|
|
import React from 'react';
|
|
import stylePropType from 'react-style-proptype';
|
|
import styles from './box.css';
|
|
|
|
const getRandomColor = (function () {
|
|
// In "DEBUG" mode this is used to output a random background color for each
|
|
// box. The function gives the same "random" set for each seed, allowing re-
|
|
// renders of the same content to give the same random display.
|
|
const random = (function (seed) {
|
|
let mW = seed;
|
|
let mZ = 987654321;
|
|
const mask = 0xffffffff;
|
|
return function () {
|
|
mZ = ((36969 * (mZ & 65535)) + (mZ >> 16)) & mask;
|
|
mW = ((18000 * (mW & 65535)) + (mW >> 16)) & mask;
|
|
let result = ((mZ << 16) + mW) & mask;
|
|
result /= 4294967296;
|
|
return result + 1;
|
|
};
|
|
}(601));
|
|
return function () {
|
|
const r = Math.max(parseInt(random() * 100, 10) % 256, 1);
|
|
const g = Math.max(parseInt(random() * 100, 10) % 256, 1);
|
|
const b = Math.max(parseInt(random() * 100, 10) % 256, 1);
|
|
return `rgb(${r},${g},${b})`;
|
|
};
|
|
}());
|
|
|
|
const Box = props => {
|
|
const {
|
|
alignContent,
|
|
alignItems,
|
|
alignSelf,
|
|
basis,
|
|
children,
|
|
className,
|
|
componentRef,
|
|
direction,
|
|
element,
|
|
grow,
|
|
height,
|
|
justifyContent,
|
|
width,
|
|
wrap,
|
|
shrink,
|
|
style,
|
|
...componentProps
|
|
} = props;
|
|
return React.createElement(element, {
|
|
className: classNames(className, styles.box),
|
|
ref: componentRef,
|
|
style: Object.assign(
|
|
{
|
|
alignContent: alignContent,
|
|
alignItems: alignItems,
|
|
alignSelf: alignSelf,
|
|
flexBasis: basis,
|
|
flexDirection: direction,
|
|
flexGrow: grow,
|
|
flexShrink: shrink,
|
|
flexWrap: wrap,
|
|
justifyContent: justifyContent,
|
|
width: width,
|
|
height: height
|
|
},
|
|
process.env.DEBUG ? {
|
|
backgroundColor: getRandomColor(),
|
|
outline: `1px solid black`
|
|
} : {},
|
|
style
|
|
),
|
|
...componentProps
|
|
}, children);
|
|
};
|
|
Box.propTypes = {
|
|
/** Defines how the browser distributes space between and around content items vertically within this box. */
|
|
alignContent: PropTypes.oneOf([
|
|
'flex-start', 'flex-end', 'center', 'space-between', 'space-around', 'stretch'
|
|
]),
|
|
/** Defines how the browser distributes space between and around flex items horizontally within this box. */
|
|
alignItems: PropTypes.oneOf([
|
|
'flex-start', 'flex-end', 'center', 'baseline', 'stretch'
|
|
]),
|
|
/** Specifies how this box should be aligned inside of its container (requires the container to be flexable). */
|
|
alignSelf: PropTypes.oneOf([
|
|
'auto', 'flex-start', 'flex-end', 'center', 'baseline', 'stretch'
|
|
]),
|
|
/** Specifies the initial length of this box */
|
|
basis: PropTypes.oneOfType([
|
|
PropTypes.number,
|
|
PropTypes.oneOf(['auto'])
|
|
]),
|
|
/** Specifies the the HTML nodes which will be child elements of this box. */
|
|
children: PropTypes.node,
|
|
/** Specifies the class name that will be set on this box */
|
|
className: PropTypes.string,
|
|
/**
|
|
* A callback function whose first parameter is the underlying dom elements.
|
|
* This call back will be executed immediately after the component is mounted or unmounted
|
|
*/
|
|
componentRef: PropTypes.func,
|
|
/** https://developer.mozilla.org/en-US/docs/Web/CSS/flex-direction */
|
|
direction: PropTypes.oneOf([
|
|
'row', 'row-reverse', 'column', 'column-reverse'
|
|
]),
|
|
/** Specifies the type of HTML element of this box. Defaults to div. */
|
|
element: PropTypes.string,
|
|
/** Specifies the flex grow factor of a flex item. */
|
|
grow: PropTypes.number,
|
|
/** The height in pixels (if specified as a number) or a string if different units are required. */
|
|
height: PropTypes.oneOfType([
|
|
PropTypes.number,
|
|
PropTypes.string
|
|
]),
|
|
/** https://developer.mozilla.org/en-US/docs/Web/CSS/justify-content */
|
|
justifyContent: PropTypes.oneOf([
|
|
'flex-start', 'flex-end', 'center', 'space-between', 'space-around'
|
|
]),
|
|
/** Specifies the flex shrink factor of a flex item. */
|
|
shrink: PropTypes.number,
|
|
/** An object whose keys are css property names and whose values correspond the the css property. */
|
|
style: stylePropType,
|
|
/** The width in pixels (if specified as a number) or a string if different units are required. */
|
|
width: PropTypes.oneOfType([
|
|
PropTypes.number,
|
|
PropTypes.string
|
|
]),
|
|
/** How whitespace should wrap within this block. */
|
|
wrap: PropTypes.oneOf([
|
|
'nowrap', 'wrap', 'wrap-reverse'
|
|
])
|
|
};
|
|
Box.defaultProps = {
|
|
element: 'div',
|
|
style: {}
|
|
};
|
|
module.exports = Box;
|