react-color
Version:
A Collection of Color Pickers from Sketch, Photoshop, Chrome & more
188 lines (169 loc) • 4.52 kB
JavaScript
'use strict'; /* @flow */
var React = require('react');
var ReactCSS = require('reactcss');
var merge = require('merge');
var _ = require('lodash');
var color = require('../helpers/color');
var Photoshop = require('./photoshop/Photoshop');
var Sketch = require('./sketch-2/Sketch');
var Chrome = require('./chrome/Chrome');
var Swatches = require('./swatches/Swatches');
var Slider = require('./slider/Slider');
var Material = require('./material/Material');
var Compact = require('./compact/Compact');
class ColorPicker extends ReactCSS.Component {
constructor(props: any) {
super();
this.state = merge(color.toState(props.color, 0), {
visible: props.display,
});
this.debounce = _.debounce(function(fn: any, data: any) {
fn(data);
}, 100);
this.handleChange = this.handleChange.bind(this);
this.handleHide = this.handleHide.bind(this);
this.handleAccept = this.handleAccept.bind(this);
this.handleCancel = this.handleCancel.bind(this);
}
classes(): any {
return {
'show': {
wrap: {
zIndex: '999',
position: 'absolute',
display: 'block',
},
picker: {
zIndex: '2',
position: 'relative',
},
cover: {
position: 'fixed',
top: '0',
bottom: '0',
left: '0',
right: '0',
},
},
'hide': {
wrap: {
zIndex: '999',
position: 'absolute',
display: 'none',
},
},
'right': {
wrap: {
left: '100%',
marginLeft: '20px',
top: '0',
},
},
'left': {
wrap: {
right: '100%',
marginRight: '20px',
top: '0',
},
},
'below': {
wrap: {
left: '0',
marginLeft: '0',
top: '100%',
marginTop: '20px',
},
},
'override': {
wrap: this.props.positionCSS,
},
};
}
styles(): any {
return this.css({
'below': this.props.position === 'below' && this.props.display !== null,
'right': this.props.position === 'right' && this.props.display !== null,
'left': this.props.position === 'left' && this.props.display !== null,
'show': this.state.visible === true,
'hide': this.state.visible === false,
'override': _.isPlainObject(this.props.positionCSS),
});
}
handleHide() {
if (this.state.visible === true) {
this.setState({
visible: false,
});
this.props.onClose && this.props.onClose({
hex: this.state.hex,
hsl: this.state.hsl,
rgb: this.state.rgb,
});
}
}
handleAccept() {
this.handleHide();
}
handleCancel() {
if (this.state.visible === true) {
this.setState({
visible: false,
});
}
}
handleChange(data: any) {
data = color.simpleCheckForValidColor(data);
if (data) {
var colors = color.toState(data, data.h || this.state.oldHue);
this.setState(colors);
this.props.onChangeComplete && this.debounce(this.props.onChangeComplete, colors);
this.props.onChange && this.props.onChange(colors);
}
}
componentWillReceiveProps(nextProps: any) {
this.setState(merge(color.toState(nextProps.color, this.state.oldHue), {
visible: nextProps.display,
}));
}
render(): any {
var Picker: any;
if (this.props.custom) {
Picker = this.props.custom;
} else if (this.props.type === 'sketch') {
Picker = Sketch;
} else if (this.props.type === 'photoshop') {
Picker = Photoshop;
} else if (this.props.type === 'chrome') {
Picker = Chrome;
} else if (this.props.type === 'swatches') {
Picker = Swatches;
} else if (this.props.type === 'slider') {
Picker = Slider;
} else if (this.props.type === 'material') {
Picker = Material;
} else if (this.props.type === 'compact') {
Picker = Compact;
}
return (
<div is="wrap">
<div is="picker">
<Picker {...this.state} onChange={ this.handleChange } onAccept={ this.handleAccept } onCancel={ this.handleCancel } />
</div>
<div is="cover" onClick={ this.handleHide }/>
</div>
);
}
}
ColorPicker.defaultProps = {
color: {
h: 250,
s: .50,
l: .20,
a: 1,
},
display: null,
type: 'sketch',
position: 'right',
positionCSS: {},
};
module.exports = ColorPicker;