import tinycolor from 'tinycolor2'; import {oneOf} from '../../utils/assist'; function setAlpha(data, alpha) { const color = tinycolor(data); const {_a} = color; if (_a === undefined || _a === null) { color.setAlpha(alpha || 1); } return color; } function getColor(data, colorData) { const alpha = colorData && colorData.a; if (colorData) { // hsl is better than hex between conversions if (colorData.hsl) { return setAlpha(colorData.hsl, alpha); } if (colorData.hex && colorData.hex.length > 0) { return setAlpha(colorData.hex, alpha); } } return setAlpha(colorData, alpha); } export function changeColor(data, oldHue) { const colorData = data === '' ? '#2d8cf0' : data; const color = getColor(data, colorData); const hsl = color.toHsl(); const hsv = color.toHsv(); if (hsl.s === 0) { hsl.h = colorData.h || (colorData.hsl && colorData.hsl.h) || oldHue || 0; hsv.h = hsl.h; } // when the hsv.v is less than 0.0164 (base on test) // because of possible loss of precision // the result of hue and saturation would be miscalculated if (hsv.v < 0.0164) { hsv.h = colorData.h || (colorData.hsv && colorData.hsv.h) || 0; hsv.s = colorData.s || (colorData.hsv && colorData.hsv.s) || 0; } if (hsl.l < 0.01) { hsl.h = colorData.h || (colorData.hsl && colorData.hsl.h) || 0; hsl.s = colorData.s || (colorData.hsl && colorData.hsl.s) || 0; } return { hsl, hex: color.toHexString().toUpperCase(), rgba: color.toRgb(), hsv, oldHue: colorData.h || oldHue || hsl.h, source: colorData.source, a: colorData.a || color.getAlpha(), }; } export function clamp(value, min, max) { if (value < min) { return min; } if (value > max) { return max; } return value; } export function getIncrement(key, keys, increment) { return oneOf(key, keys) ? increment : 0; } export function getTouches(e, prop) { return e.touches ? e.touches[0][prop] : 0; } export function toRGBAString(rgba) { const {r, g, b, a} = rgba; return `rgba(${[r, g, b, a].join(',')})`; } export function isValidHex(hex) { return tinycolor(hex).isValid(); } function checkIteratee(data, counts, letter) { let {checked, passed} = counts; const value = data[letter]; if (value) { checked += 1; if (Number.isFinite(value)) { passed += 1; } } return {checked, passed}; } const keysToCheck = ['r', 'g', 'b', 'a', 'h', 's', 'l', 'v']; export function simpleCheckForValidColor(data) { const results = keysToCheck.reduce(checkIteratee.bind(null, data), {checked: 0, passed: 0}); return results.checked === results.passed ? data : undefined; }