blockstack-ui
Version:
Blockstack UI components built with css-in-js and styled-system.
226 lines (215 loc) • 3.79 kB
JavaScript
import * as React from 'react'
import styled from 'styled-components'
import tag from '../clean-tag'
import {
space,
width,
fontSize,
color,
fontFamily,
textAlign,
lineHeight,
fontWeight,
fontStyle,
letterSpacing,
display,
maxWidth,
minWidth,
height,
maxHeight,
minHeight,
sizeWidth,
sizeHeight,
size,
ratioPadding,
ratio,
verticalAlign,
alignItems,
alignContent,
justifyItems,
justifyContent,
flexWrap,
flexBasis,
flexDirection,
flex,
justifySelf,
alignSelf,
order,
gridGap,
gridColumnGap,
gridRowGap,
gridColumn,
gridRow,
gridAutoFlow,
gridAutoColumns,
gridAutoRows,
gridTemplateColumns,
gridTemplateRows,
gridTemplateAreas,
gridArea,
borders,
borderColor,
borderRadius,
boxShadow,
opacity,
overflow,
background,
backgroundImage,
backgroundPosition,
backgroundRepeat,
backgroundSize,
position,
zIndex,
top,
right,
bottom,
left,
textStyle,
buttonStyle,
styles,
style
} from 'styled-system'
// Custom system props
const flexGrow = style({
prop: 'flexGrow'
})
const flexShrink = style({
prop: 'flexShrink'
})
const cursor = style({
prop: 'cursor'
})
const transform = style({
prop: 'transform'
})
const textTransform = style({
prop: 'textTransform'
})
const transition = style({
prop: 'transition',
key: 'transitions'
})
// get all system props
const allPropTypes = Object.keys(styles)
.filter((key) => typeof styles[key] === 'function')
.reduce((a, key) => Object.assign(a, styles[key].propTypes), {})
// prevent them from being passed to dom element
const blacklist = [
...Object.keys(allPropTypes),
'theme',
'cursor',
'transform',
'flexGrow',
'flexShrink',
'textTransform',
'transition',
'zIndex',
'suppressClassNameWarning',
'Type',
'staticContext'
]
const Base = styled(tag)`
${space};
${flexGrow};
${flexShrink};
${cursor};
${textTransform};
${transform};
${transition};
${width};
${fontSize};
${color};
${fontFamily};
${textAlign};
${lineHeight};
${fontWeight};
${fontStyle};
${letterSpacing};
${display};
${maxWidth};
${minWidth};
${height};
${maxHeight};
${minHeight};
${sizeWidth};
${sizeHeight};
${size};
${ratioPadding};
${ratio};
${verticalAlign};
${alignItems};
${alignContent};
${justifyItems};
${justifyContent};
${flexWrap};
${flexBasis};
${flexDirection};
${flex};
${justifySelf};
${alignSelf};
${order};
${gridGap};
${gridColumnGap};
${gridRowGap};
${gridColumn};
${gridRow};
${gridAutoFlow};
${gridAutoColumns};
${gridAutoRows};
${gridTemplateColumns};
${gridTemplateRows};
${gridTemplateAreas};
${gridArea};
${borders};
${borderColor};
${borderRadius};
${boxShadow};
${opacity};
${overflow};
${background};
${backgroundImage};
${backgroundPosition};
${backgroundRepeat};
${backgroundSize};
${position};
${zIndex};
${top};
${right};
${bottom};
${left};
${textStyle};
${buttonStyle};
`
Base.defaultProps = {
suppressClassNameWarning: true,
blacklist
}
const Box = (props) => <Base {...props} />
const Flex = (props) => <Base {...props} />
const Grid = (props) => <Base {...props} />
const Inline = (props) => <Base {...props} />
Box.defaultProps = {
suppressClassNameWarning: true,
blacklist
}
Flex.defaultProps = {
suppressClassNameWarning: true,
blacklist,
display: 'flex'
}
Grid.defaultProps = {
suppressClassNameWarning: true,
blacklist,
display: 'flex'
}
Inline.defaultProps = {
suppressClassNameWarning: true,
blacklist,
display: 'inline-block',
is: 'span'
}
Box.displayName = 'Box'
Flex.displayName = 'Flex'
Grid.displayName = 'Grid'
Inline.displayName = 'Inline'
export { Base, Box, Flex, Inline, Grid, blacklist }