diff --git a/src/transformers/utilities/rgbaFloatToHex.test.ts b/src/transformers/utilities/rgbaFloatToHex.test.ts new file mode 100644 index 000000000..34816fcf9 --- /dev/null +++ b/src/transformers/utilities/rgbaFloatToHex.test.ts @@ -0,0 +1,16 @@ +import {rgbaFloatToHex} from './rgbaFloatToHex' + +describe('Utilities: rgbaFloatToHex', () => { + it('valid RgbaFloat value', () => { + expect(rgbaFloatToHex({a: 1, b: 0.6, g: 0.4, r: 0.2})).toStrictEqual('#336699') + expect(rgbaFloatToHex({a: 0, b: 0.3, g: 0.4, r: 0.2})).toStrictEqual('#33664c') + expect(rgbaFloatToHex({b: 0.6, g: 0.4, r: 0.2})).toStrictEqual('#336699') + expect(rgbaFloatToHex({b: 0.56, g: 0.35, r: 0.123344})).toStrictEqual('#1f598e') + }) + + it('Invalid values', () => { + expect(() => rgbaFloatToHex({a: 1, b: 0.6, g: 0.4, r: 2})).toThrow( + 'Invalid RgbaFloat value. R, G and B values must be between 0 and 1', + ) + }) +}) diff --git a/src/transformers/utilities/rgbaFloatToHex.ts b/src/transformers/utilities/rgbaFloatToHex.ts index 9fb48f32f..8c2f47b8b 100644 --- a/src/transformers/utilities/rgbaFloatToHex.ts +++ b/src/transformers/utilities/rgbaFloatToHex.ts @@ -1,5 +1,15 @@ export const rgbaFloatToHex = ({r, g, b, a}: {r: number; g: number; b: number; a?: number}, alpha = true): string => { const values = [r, g, b, alpha === true && a && a < 1 ? a : undefined].filter(item => item !== undefined) as number[] - return `#${values.map(v => `${(v * 255).toString(16)}`.padStart(2, '0')).join('')}` + if (r > 1 || r < 0 || g > 1 || g < 0 || b > 1 || b < 0) { + throw new Error('Invalid RgbaFloat value. R, G and B values must be between 0 and 1.') + } + + return `#${values + .map(v => + Number(parseInt(`${v * 255}`, 10)) + .toString(16) + .padStart(2, '0'), + ) + .join('')}` }