react-color
Version:
A Collection of Color Pickers from Sketch, Photoshop, Chrome & more
128 lines (120 loc) • 3.51 kB
JavaScript
import React from 'react';
import PropTypes from 'prop-types';
import reactCSS from 'reactcss';
import merge from 'lodash-es/merge';
import * as color from '../../helpers/color';
import { ColorWrap, EditableInput, Checkboard } from '../common';
import BlockSwatches from './BlockSwatches';
export var Block = function Block(_ref) {
var onChange = _ref.onChange,
onSwatchHover = _ref.onSwatchHover,
hex = _ref.hex,
colors = _ref.colors,
width = _ref.width,
triangle = _ref.triangle,
_ref$styles = _ref.styles,
passedStyles = _ref$styles === undefined ? {} : _ref$styles,
_ref$className = _ref.className,
className = _ref$className === undefined ? '' : _ref$className;
var transparent = hex === 'transparent';
var handleChange = function handleChange(hexCode, e) {
color.isValidHex(hexCode) && onChange({
hex: hexCode,
source: 'hex'
}, e);
};
var styles = reactCSS(merge({
'default': {
card: {
width: width,
background: '#fff',
boxShadow: '0 1px rgba(0,0,0,.1)',
borderRadius: '6px',
position: 'relative'
},
head: {
height: '110px',
background: hex,
borderRadius: '6px 6px 0 0',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
position: 'relative'
},
body: {
padding: '10px'
},
label: {
fontSize: '18px',
color: color.getContrastingColor(hex),
position: 'relative'
},
triangle: {
width: '0px',
height: '0px',
borderStyle: 'solid',
borderWidth: '0 10px 10px 10px',
borderColor: 'transparent transparent ' + hex + ' transparent',
position: 'absolute',
top: '-10px',
left: '50%',
marginLeft: '-10px'
},
input: {
width: '100%',
fontSize: '12px',
color: '#666',
border: '0px',
outline: 'none',
height: '22px',
boxShadow: 'inset 0 0 0 1px #ddd',
borderRadius: '4px',
padding: '0 7px',
boxSizing: 'border-box'
}
},
'hide-triangle': {
triangle: {
display: 'none'
}
}
}, passedStyles), { 'hide-triangle': triangle === 'hide' });
return React.createElement(
'div',
{ style: styles.card, className: 'block-picker ' + className },
React.createElement('div', { style: styles.triangle }),
React.createElement(
'div',
{ style: styles.head },
transparent && React.createElement(Checkboard, { borderRadius: '6px 6px 0 0' }),
React.createElement(
'div',
{ style: styles.label },
hex
)
),
React.createElement(
'div',
{ style: styles.body },
React.createElement(BlockSwatches, { colors: colors, onClick: handleChange, onSwatchHover: onSwatchHover }),
React.createElement(EditableInput, {
style: { input: styles.input },
value: hex,
onChange: handleChange
})
)
);
};
Block.propTypes = {
width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
colors: PropTypes.arrayOf(PropTypes.string),
triangle: PropTypes.oneOf(['top', 'hide']),
styles: PropTypes.object
};
Block.defaultProps = {
width: 170,
colors: ['#D9E3F0', '#F47373', '#697689', '#37D67A', '#2CCCE4', '#555555', '#dce775', '#ff8a65', '#ba68c8'],
triangle: 'top',
styles: {}
};
export default ColorWrap(Block);