solid-color
Version:
<p> <img width="100%" src="https://assets.solidjs.com/banner?type=solid-color&background=tiles&project=%20" alt="solid-color"> </p>
145 lines (144 loc) • 4.74 kB
JSX
import { mergeProps } from 'solid-js';
import * as color from '../../helpers/color';
import { EditableInput } from '../_common';
export default function PhotoshopPicker(_props) {
const props = mergeProps({}, _props);
const styles = {
fields: {
'padding-top': '5px',
'padding-bottom': '9px',
width: '80px',
position: 'relative',
},
divider: {
height: '5px',
},
rgbWrap: {
position: 'relative',
},
rgbInput: {
'margin-left': '40%',
width: '40%',
height: '18px',
border: '1px solid #888888',
'box-shadow': 'inset 0 1px 1px rgba(0,0,0,.1), 0 1px 0 0 #ECECEC',
'margin-bottom': '5px',
'font-size': '13px',
'padding-left': '3px',
'margin-right': '10px',
},
rgbLabel: {
left: '0px',
top: '0px',
width: '34px',
'text-transform': 'uppercase',
'font-size': '13px',
height: '18px',
'line-height': '22px',
position: 'absolute',
},
hexWrap: {
position: 'relative',
},
hexInput: {
'margin-left': '20%',
width: '80%',
height: '18px',
border: '1px solid #888888',
'box-shadow': 'inset 0 1px 1px rgba(0,0,0,.1), 0 1px 0 0 #ECECEC',
'margin-bottom': '6px',
'font-size': '13px',
'padding-left': '3px',
},
hexLabel: {
position: 'absolute',
top: '0px',
left: '0px',
width: '14px',
'text-transform': 'uppercase',
'font-size': '13px',
height: '18px',
'line-height': '22px',
},
fieldSymbols: {
position: 'absolute',
top: '5px',
right: '-7px',
'font-size': '13px',
},
symbol: {
height: '20px',
'line-height': '22px',
'padding-bottom': '7px',
},
};
const handleChange = (data, e) => {
if (data['#']) {
color.isValidHex(data['#']) &&
props.onChange({
hex: data['#'],
source: 'hex',
}, e);
}
else if (data.r || data.g || data.b) {
props.onChange({
r: data.r || props.rgb.r,
g: data.g || props.rgb.g,
b: data.b || props.rgb.b,
source: 'rgb',
}, e);
}
else if (data.h || data.s || data.v) {
props.onChange({
h: data.h || props.hsv.h,
s: data.s || props.hsv.s,
v: data.v || props.hsv.v,
source: 'hsv',
}, e);
}
};
return (<div style={styles.fields}>
<EditableInput styles={{
wrap: styles.rgbWrap,
input: styles.rgbInput,
label: styles.rgbLabel,
}} label="h" value={Math.round(props.hsv.h)} onChange={handleChange}/>
<EditableInput styles={{
wrap: styles.rgbWrap,
input: styles.rgbInput,
label: styles.rgbLabel,
}} label="s" value={Math.round(props.hsv.s * 100)} onChange={handleChange}/>
<EditableInput styles={{
wrap: styles.rgbWrap,
input: styles.rgbInput,
label: styles.rgbLabel,
}} label="v" value={Math.round(props.hsv.v * 100)} onChange={handleChange}/>
<div style={styles.divider}/>
<EditableInput styles={{
wrap: styles.rgbWrap,
input: styles.rgbInput,
label: styles.rgbLabel,
}} label="r" value={props.rgb.r} onChange={handleChange}/>
<EditableInput styles={{
wrap: styles.rgbWrap,
input: styles.rgbInput,
label: styles.rgbLabel,
}} label="g" value={props.rgb.g} onChange={handleChange}/>
<EditableInput styles={{
wrap: styles.rgbWrap,
input: styles.rgbInput,
label: styles.rgbLabel,
}} label="b" value={props.rgb.b} onChange={handleChange}/>
<div style={styles.divider}/>
<EditableInput styles={{
wrap: styles.hexWrap,
input: styles.hexInput,
label: styles.hexLabel,
}} label="#" value={props.hex.replace('#', '')} onChange={handleChange}/>
<div style={styles.fieldSymbols}>
<div style={styles.symbol}>°</div>
<div style={styles.symbol}>%</div>
<div style={styles.symbol}>%</div>
</div>
</div>);
}