From b8d423da1cd0507c189f52f6ac175915df45a02f Mon Sep 17 00:00:00 2001 From: Valentyna Date: Thu, 9 Jan 2025 04:10:02 -0800 Subject: [PATCH] feat(react-color-picker): added alpha input field (#33536) Co-authored-by: Dmytro Kirpa --- .../ColorPickerDefault.stories.tsx | 51 +++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerDefault.stories.tsx b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerDefault.stories.tsx index 3d903f1a6eb8b..394822d70e830 100644 --- a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerDefault.stories.tsx +++ b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerDefault.stories.tsx @@ -50,7 +50,7 @@ const useStyles = makeStyles({ width: '80px', }, spinButton: { - width: '50px', + minWidth: '60px', }, }); @@ -62,17 +62,20 @@ type RgbKey = 'r' | 'g' | 'b'; export const Default = () => { const hexId = useId('hex-input'); + const alphaId = useId('alpha-input'); const styles = useStyles(); const [color, setColor] = React.useState(DEFAULT_COLOR_HSV); const [hex, setHex] = React.useState(tinycolor(color).toHexString()); const [rgb, setRgb] = React.useState(tinycolor(color).toRgb()); + const [alpha, setAlpha] = React.useState(color.a); const [namedColor, setNamedColor] = React.useState(''); const handleChange: ColorPickerProps['onColorChange'] = (_, data) => { setColor({ ...data.color, a: data.color.a ?? 1 }); setHex(tinycolor(data.color).toHexString()); setRgb(tinycolor(data.color).toRgb()); + setAlpha(data.color.a ?? 1); const _namedColor = tinycolor(`hsl(${data.color.h},100%,50%)`).toName(); if (_namedColor) { setNamedColor(_namedColor); @@ -96,6 +99,26 @@ export const Default = () => { } }; + const onAlphaChange: SpinButtonProps['onChange'] = React.useCallback( + (_ev, data) => { + const value = data.value ?? parseFloat(data.displayValue ?? ''); + + if (Number.isNaN(value) || value < 0 || value > 1) { + return; + } + + const newColor = tinycolor({ ...color, a: value }); + + if (newColor.isValid) { + setColor(newColor.toHsv()); + setHex(newColor.toHex()); + setRgb(newColor.toRgb()); + setAlpha(newColor.a); + } + }, + [setAlpha, setRgb, setHex, setColor, color], + ); + const colorAriaAttributes = { 'aria-label': 'ColorPicker', 'aria-roledescription': '2D slider', @@ -110,7 +133,6 @@ export const Default = () => {
-
{ const newColor = tinycolor(value); if (newColor.isValid) { setColor(newColor.toHsv()); + setRgb(newColor.toRgb()); } setHex(oldValue => (HEX_COLOR_REGEX.test(value) ? value : oldValue)); }} @@ -126,8 +149,9 @@ export const Default = () => { +
-
+
); }; @@ -182,6 +206,27 @@ const InputRgbField = ({ ); }; +const InputAlphaField = ({ + label = 'Alpha', + value, + onChange, + id, +}: { + value: number; + label?: string; + onChange?: SpinButtonProps['onChange']; + id: string; +}) => { + const styles = useStyles(); + + return ( +
+ + +
+ ); +}; + const handleOnBlur = (e: React.FocusEvent) => { const value = tinycolor(e.target.value); if (!value.isValid) {