Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | 1x 1x 10x 10x 10x 10x 5x 10x 7x 5x 10x 10x 5x 2x 2x 2x 5x 1x | import React from 'react';
import type * as CSS from 'csstype';
import { type HsvaColor, type ColorResult, color as handleColor, validHex, hexToHsva, hsvaToHex } from '@uiw/color-convert';
import EditableInput from '@uiw/react-color-editable-input';
import RGBA from '@uiw/react-color-editable-input-rgba';
export interface MaterialProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'color'> {
prefixCls?: string;
color?: string | HsvaColor;
onChange?: (color: ColorResult) => void;
}
const styleRBG: CSS.Properties<string | number> = {
boxShadow: 'initial',
borderWidth: '0 0 1px 0',
borderBottomColor: 'var(--material-border-bottom-color)',
borderBottomStyle: 'solid',
height: 30,
outline: 0,
fontSize: 15,
padding: 0,
};
const Material = React.forwardRef<HTMLDivElement, MaterialProps>((props, ref) => {
const { prefixCls = 'w-color-material', className, style, color, onChange, ...other } = props;
const hsva = (typeof color === 'string' && validHex(color) ? hexToHsva(color) : color) as HsvaColor;
const hex = color ? hsvaToHex(hsva).replace(/^#/, '') : '';
const handleChange = (hsv: HsvaColor) => {
onChange && onChange(handleColor(hsv));
};
const handleHex = (value: string | number, evn: React.ChangeEvent<HTMLInputElement>) => {
if (typeof value === 'string' && validHex(value) && /(3|6)/.test(String(value.length))) {
onChange && onChange(handleColor(hexToHsva(value)));
}
};
const styleWrapper = {
'--material-border-bottom-color': '#eee',
'--material-background-color': '#fff',
padding: 16,
width: 98,
fontFamily: 'Roboto',
backgroundColor: 'var(--material-background-color)',
...style,
} as CSS.Properties<string | number>;
return (
<div ref={ref} className={[prefixCls, className || ''].filter(Boolean).join(' ')} style={styleWrapper} {...other}>
<EditableInput
label="Hex"
value={hex.toLocaleUpperCase()}
onChange={(evn, val) => handleHex(val, evn)}
onBlur={(evn) => {
const value = evn.target.value;
evn.target.value = value.slice(0, 6);
handleHex(value.slice(0, 6), evn);
}}
inputStyle={{
outline: 0,
border: 0,
height: 30,
fontSize: 15,
padding: 0,
boxShadow: 'initial',
borderWidth: '0 0 2px 0',
borderBottomColor: hex ? `#${hex}` : 'var(--material-border-bottom-color)',
borderBottomStyle: 'solid',
background: 'transparent',
}}
style={{ flexDirection: 'column-reverse', alignItems: 'flex-start' }}
/>
<RGBA
hsva={hsva}
placement="top"
style={{ marginTop: 11 }}
rProps={{
style: {
alignItems: 'flex-start',
},
inputStyle: { ...styleRBG },
}}
gProps={{
style: {
alignItems: 'flex-start',
},
inputStyle: { ...styleRBG },
}}
bProps={{
style: {
alignItems: 'flex-start',
},
inputStyle: { ...styleRBG },
}}
aProps={false}
onChange={(result) => handleChange(result.hsva)}
/>
</div>
);
});
Material.displayName = 'Material';
export default Material;
|