Skip to content

Commit a9268f9

Browse files
committed
Add updateAlpha prop to colorModel
1 parent eaf0403 commit a9268f9

9 files changed

+37
-8
lines changed

src/components/HslaColorPicker.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ import React from "react";
33
import { AlphaColorPicker } from "./common/AlphaColorPicker";
44
import { ColorModel, ColorPickerBaseProps, HslaColor } from "../types";
55
import { equalColorObjects } from "../utils/compare";
6-
import { hslaToHsva, hsvaToHsla } from "../utils/convert";
6+
import { hslaToHsva, hsvaToHsla, updateAlphaFromObject } from "../utils/convert";
77

88
const colorModel: ColorModel<HslaColor> = {
99
defaultColor: { h: 0, s: 0, l: 0, a: 1 },
1010
toHsva: hslaToHsva,
1111
fromHsva: hsvaToHsla,
1212
equal: equalColorObjects,
13+
updateAlpha: updateAlphaFromObject,
1314
};
1415

1516
export const HslaColorPicker = (props: Partial<ColorPickerBaseProps<HslaColor>>): JSX.Element => (

src/components/HslaStringColorPicker.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ import React from "react";
33
import { AlphaColorPicker } from "./common/AlphaColorPicker";
44
import { ColorModel, ColorPickerBaseProps } from "../types";
55
import { equalColorString } from "../utils/compare";
6-
import { hslaStringToHsva, hsvaToHslaString } from "../utils/convert";
6+
import { hslaStringToHsva, hsvaToHslaString, updateAlphaFromString } from "../utils/convert";
77

88
const colorModel: ColorModel<string> = {
99
defaultColor: "hsla(0, 0%, 0%, 1)",
1010
toHsva: hslaStringToHsva,
1111
fromHsva: hsvaToHslaString,
1212
equal: equalColorString,
13+
updateAlpha: updateAlphaFromString,
1314
};
1415

1516
export const HslaStringColorPicker = (

src/components/HsvaColorPicker.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ import React from "react";
33
import { AlphaColorPicker } from "./common/AlphaColorPicker";
44
import { ColorModel, ColorPickerBaseProps, HsvaColor } from "../types";
55
import { equalColorObjects } from "../utils/compare";
6-
import { roundHsva } from "../utils/convert";
6+
import { roundHsva, updateAlphaFromObject } from "../utils/convert";
77

88
const colorModel: ColorModel<HsvaColor> = {
99
defaultColor: { h: 0, s: 0, v: 0, a: 1 },
1010
toHsva: (hsva) => hsva,
1111
fromHsva: roundHsva,
1212
equal: equalColorObjects,
13+
updateAlpha: updateAlphaFromObject,
1314
};
1415

1516
export const HsvaColorPicker = (props: Partial<ColorPickerBaseProps<HsvaColor>>): JSX.Element => (

src/components/HsvaStringColorPicker.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ import React from "react";
33
import { AlphaColorPicker } from "./common/AlphaColorPicker";
44
import { ColorModel, ColorPickerBaseProps } from "../types";
55
import { equalColorString } from "../utils/compare";
6-
import { hsvaStringToHsva, hsvaToHsvaString } from "../utils/convert";
6+
import { hsvaStringToHsva, hsvaToHsvaString, updateAlphaFromString } from "../utils/convert";
77

88
const colorModel: ColorModel<string> = {
99
defaultColor: "hsva(0, 0%, 0%, 1)",
1010
toHsva: hsvaStringToHsva,
1111
fromHsva: hsvaToHsvaString,
1212
equal: equalColorString,
13+
updateAlpha: updateAlphaFromString,
1314
};
1415

1516
export const HsvaStringColorPicker = (

src/components/RgbaColorPicker.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ import React from "react";
33
import { AlphaColorPicker } from "./common/AlphaColorPicker";
44
import { ColorModel, ColorPickerBaseProps, RgbaColor } from "../types";
55
import { equalColorObjects } from "../utils/compare";
6-
import { rgbaToHsva, hsvaToRgba } from "../utils/convert";
6+
import { rgbaToHsva, hsvaToRgba, updateAlphaFromObject } from "../utils/convert";
77

88
const colorModel: ColorModel<RgbaColor> = {
99
defaultColor: { r: 0, g: 0, b: 0, a: 1 },
1010
toHsva: rgbaToHsva,
1111
fromHsva: hsvaToRgba,
1212
equal: equalColorObjects,
13+
updateAlpha: updateAlphaFromObject,
1314
};
1415

1516
export const RgbaColorPicker = (props: Partial<ColorPickerBaseProps<RgbaColor>>): JSX.Element => (

src/components/RgbaStringColorPicker.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ import React from "react";
33
import { AlphaColorPicker } from "./common/AlphaColorPicker";
44
import { ColorModel, ColorPickerBaseProps } from "../types";
55
import { equalColorString } from "../utils/compare";
6-
import { rgbaStringToHsva, hsvaToRgbaString } from "../utils/convert";
6+
import { rgbaStringToHsva, hsvaToRgbaString, updateAlphaFromString } from "../utils/convert";
77

88
const colorModel: ColorModel<string> = {
99
defaultColor: "rgba(0, 0, 0, 1)",
1010
toHsva: rgbaStringToHsva,
1111
fromHsva: hsvaToRgbaString,
1212
equal: equalColorString,
13+
updateAlpha: updateAlphaFromString,
1314
};
1415

1516
export const RgbaStringColorPicker = (

src/hooks/useColorManipulation.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,13 @@ export function useColorManipulation<T extends AnyColor>(
3636
// eslint-disable-next-line @typescript-eslint/no-unused-vars
3737
const { a: _, ...cacheHsv } = cache.current.hsva;
3838

39+
const isSupportAlpha = "updateAlpha" in colorModel;
40+
3941
// When alpha channel is changed, use cached RGB values to prevent rounding errors
4042
const newColor = equalColorObjects(hsv, cacheHsv)
41-
? Object.assign({}, cache.current.color, { a })
43+
? isSupportAlpha
44+
? colorModel.updateAlpha(cache.current.color, a)
45+
: cache.current.color
4246
: colorModel.fromHsva(hsva);
4347

4448
if (

src/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ export interface ColorModel<T extends AnyColor> {
3939
toHsva: (defaultColor: T) => HsvaColor;
4040
fromHsva: (hsva: HsvaColor) => T;
4141
equal: (first: T, second: T) => boolean;
42+
updateAlpha?:
43+
| ((color: string, alpha: number) => string)
44+
| ((color: ObjectColor, alpha: number) => ObjectColor);
4245
}
4346

4447
type ColorPickerHTMLAttributes = Omit<

src/utils/convert.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
import { round } from "./round";
2-
import { RgbaColor, RgbColor, HslaColor, HslColor, HsvaColor, HsvColor } from "../types";
2+
import {
3+
RgbaColor,
4+
RgbColor,
5+
HslaColor,
6+
HslColor,
7+
HsvaColor,
8+
HsvColor,
9+
ObjectColor,
10+
} from "../types";
311

412
/**
513
* Valid CSS <angle> units.
@@ -204,3 +212,11 @@ export const hsvaToHsv = (hsva: HsvaColor): HsvColor => {
204212
const { h, s, v } = roundHsva(hsva);
205213
return { h, s, v };
206214
};
215+
216+
export const updateAlphaFromString = (color: string, alpha: number): string => {
217+
return color.replace(/\d+\.\d+\)/, `${alpha})`);
218+
};
219+
220+
export const updateAlphaFromObject = (color: ObjectColor, alpha: number): ObjectColor => {
221+
return Object.assign({}, color, { a: alpha });
222+
};

0 commit comments

Comments
 (0)