import React from 'react'; import type * as CSS from 'csstype'; import { validHex, color as handleColor, hexToHsva, type HsvaColor, type ColorResult, hsvaToHex, hsvaToRgbaString, } from '@uiw/color-convert'; import Alpha, { BACKGROUND_IMG } from '@uiw/react-color-alpha'; import Saturation from '@uiw/react-color-saturation'; import Hue from '@uiw/react-color-hue'; export interface ColorfulProps extends Omit, 'onChange' | 'color'> { prefixCls?: string; onChange?: (color: ColorResult) => void; color?: string | HsvaColor; disableAlpha?: boolean; } const Pointer = ({ style, color, ...props }: React.HTMLAttributes & { color: string }) => { const stylePointer: CSS.Properties = { '--colorful-pointer-background-color': '#fff', '--colorful-pointer-border': '2px solid #fff', height: 28, width: 28, position: 'absolute', transform: 'translate(-16px, -16px)', boxShadow: '0 2px 4px rgb(0 0 0 / 20%)', borderRadius: '50%', background: `url(${BACKGROUND_IMG})`, backgroundColor: 'var(--colorful-pointer-background-color)', border: 'var(--colorful-pointer-border)', zIndex: 1, ...style, } as CSS.Properties; return (
); }; const Colorful = React.forwardRef((props, ref) => { const { prefixCls = 'w-color-colorful', className, onChange, color, style, disableAlpha, ...other } = props; const hsva = (typeof color === 'string' && validHex(color) ? hexToHsva(color) : color || {}) as HsvaColor; const handleChange = (value: HsvaColor) => onChange && onChange(handleColor(value)); return (
} onChange={(newColor) => handleChange({ ...hsva, ...newColor })} /> handleChange({ ...hsva, ...newHue })} pointer={({ left }) => ( )} /> {!disableAlpha && ( } onChange={(newAlpha) => handleChange({ ...hsva, ...newAlpha })} /> )}
); }); Colorful.displayName = 'Colorful'; export default Colorful;