zent
Version:
一套前端设计语言和基于React的实现
138 lines (128 loc) • 3.31 kB
JavaScript
/**
* This component is adapted from https://github.com/casesandberg/react-color.
* See LICENSE for permissions.
*
* It's a modified Sketch color picker.
*/
import React, { Component, PureComponent } from 'react';
import Popover from 'popover';
import PropTypes from 'prop-types';
import cx from 'classnames';
import ColorBoard from './ColorBoard';
import SketchPresetColors from './SketchPresetColors';
import PopoverClickTrigger from './PopoverClickTrigger';
class ColorPicker extends (PureComponent || Component) {
state = {
popVisible: false
};
static propTypes = {
color: PropTypes.string.isRequired,
showAlpha: PropTypes.bool,
onChange: PropTypes.func,
className: PropTypes.string,
wrapperClassName: PropTypes.string,
prefix: PropTypes.string,
type: PropTypes.oneOf(['default', 'simple']),
presetColors: PropTypes.array
};
static defaultProps = {
showAlpha: false,
onChange() {},
className: '',
wrapperClassName: '',
prefix: 'zent',
type: 'default',
presetColors: [
'#FFFFFF',
'#F8F8F8',
'#F2F2F2',
'#999999',
'#444444',
'#FF4444',
'#FF6500',
'#FF884D',
'#FFCD00',
'#3FBD00',
'#3FBC87',
'#00CD98',
'#5197FF',
'#BADCFF',
'#FFEFB8'
]
};
static ColorBoard = ColorBoard;
handleChange = color => {
const { onChange, showAlpha } = this.props;
let transColor = color;
if (typeof color === 'object') {
transColor = showAlpha ? color.rgba : color.hex;
}
onChange(transColor);
};
handleVisibleChange = visible => {
this.setState({
popVisible: visible
});
};
render() {
const {
color,
showAlpha,
prefix,
className,
wrapperClassName,
type,
presetColors
} = this.props;
const { popVisible } = this.state;
const openClassName = popVisible ? 'open' : '';
const backgroundColor = color;
return (
<Popover
className={cx(`${prefix}-color-picker-popover`, className)}
position={Popover.Position.AutoBottomLeft}
display="inline"
cushion={5}
visible={popVisible}
onVisibleChange={this.handleVisibleChange}
>
<PopoverClickTrigger>
<div
className={cx(
`${prefix}-color-picker`,
wrapperClassName,
openClassName
)}
tabIndex={0}
>
<div className={`${prefix}-color-picker__text`}>
<div
className={`${prefix}-color-picker__preview`}
style={{ backgroundColor }}
/>
</div>
</div>
</PopoverClickTrigger>
<Popover.Content>
{type === 'simple' ? (
<SketchPresetColors
colors={presetColors}
onClick={this.handleChange}
prefix={prefix}
type={type}
/>
) : (
<ColorBoard
color={color}
showAlpha={showAlpha}
onChange={this.handleChange}
prefix={prefix}
type={type}
/>
)}
</Popover.Content>
</Popover>
);
}
}
export default ColorPicker;