@dotconnor/grommet
Version:
focus on the essential experience
165 lines (131 loc) • 4.98 kB
JavaScript
// Returns the specific color that should be used according to the theme.
// If 'dark' is supplied, it takes precedence over 'theme.dark'.
// Can return undefined.
export var normalizeColor = function normalizeColor(color, theme, dark) {
var colorSpec = theme.global && theme.global.colors[color] !== undefined ? theme.global.colors[color] : color; // If the color has a light or dark object, use that
var result = colorSpec;
if (colorSpec) {
if ((dark === true || dark === undefined && theme.dark) && colorSpec.dark !== undefined) {
result = colorSpec.dark;
} else if ((dark === false || !theme.dark) && colorSpec.light !== undefined) {
result = colorSpec.light;
}
} // allow one level of indirection in color names
if (result && theme.global && theme.global.colors[result] !== undefined) {
result = normalizeColor(result, theme, dark);
}
return result;
};
var parseHexToRGB = function parseHexToRGB(color) {
return color.length < 7 // 7 is what's needed for '#RRGGBB'
? color.match(/[A-Za-z0-9]{1}/g).map(function (v) {
return parseInt("" + v + v, 16);
}) : // https://stackoverflow.com/a/42429333
color.match(/[A-Za-z0-9]{2}/g).map(function (v) {
return parseInt(v, 16);
});
}; // From: https://stackoverflow.com/a/9493060/8513067
// Converts an HSL color value to RGB. Conversion formula
// adapted from http://en.wikipedia.org/wiki/HSL_color_space.
// Assumes h, s, and l are contained in the set [0, 1] and
// returns r, g, and b in the set [0, 255].
var hslToRGB = function hslToRGB(h, s, l) {
var r;
var g;
var b;
if (s === 0 || s === '0') {
// achromatic
r = l;
g = l;
b = l;
} else {
var hue2rgb = function hue2rgb(p, q, inT) {
var t = inT;
if (t < 0) t += 1;
if (t > 1) t -= 1;
if (t < 0.16666667) return p + (q - p) * 6 * t;
if (t < 1 / 2) return q;
if (t < 0.66666667) return p + (q - p) * (0.66666667 - t) * 6;
return p;
};
var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
var p = 2 * l - q;
r = hue2rgb(p, q, h + 0.33333333);
g = hue2rgb(p, q, h);
b = hue2rgb(p, q, h - 0.33333333);
}
return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
}; // allow for alpha: #RGB, #RGBA, #RRGGBB, or #RRGGBBAA
var hexExp = /^#[A-Za-z0-9]{3,4}$|^#[A-Za-z0-9]{6,8}$/;
var rgbExp = /^rgba?\(\s?([0-9]*)\s?,\s?([0-9]*)\s?,\s?([0-9]*)\s?\)/;
var rgbaExp = /^rgba?\(\s?([0-9]*)\s?,\s?([0-9]*)\s?,\s?([0-9]*)\s?,\s?([.0-9]*)\s?\)/; // e.g. hsl(240, 60%, 50%)
var hslExp = /^hsla?\(\s?([0-9]*)\s?,\s?([0-9]*)%?\s?,\s?([0-9]*)%?\s?.*?\)/;
var canExtractRGBArray = function canExtractRGBArray(color) {
return hexExp.test(color) || rgbExp.test(color) || rgbaExp.test(color) || hslExp.test(color);
};
var getRGBArray = function getRGBArray(color) {
if (hexExp.test(color)) {
var _parseHexToRGB = parseHexToRGB(color),
red = _parseHexToRGB[0],
green = _parseHexToRGB[1],
blue = _parseHexToRGB[2],
alpha = _parseHexToRGB[3];
return [red, green, blue, alpha !== undefined ? alpha / 255.0 : undefined];
}
var match = color.match(rgbExp);
if (match) {
return match.splice(1).map(function (v) {
return parseInt(v, 10);
});
}
match = color.match(rgbaExp);
if (match) {
return match.splice(1).map(function (v) {
return parseFloat(v, 10);
});
}
match = color.match(hslExp);
if (match) {
var _match$splice$map = match.splice(1).map(function (v) {
return parseInt(v, 10);
}),
h = _match$splice$map[0],
s = _match$splice$map[1],
l = _match$splice$map[2];
return hslToRGB(h / 360.0, s / 100.0, l / 100.0);
}
return color;
};
export var colorIsDark = function colorIsDark(color) {
if (color && canExtractRGBArray(color)) {
var _getRGBArray = getRGBArray(color),
red = _getRGBArray[0],
green = _getRGBArray[1],
blue = _getRGBArray[2],
alpha = _getRGBArray[3]; // if there is an alpha and it's greater than 50%, we can't really tell
if (alpha < 0.5) return undefined;
var brightness = (299 * red + 587 * green + 114 * blue) / 1000; // From: http://www.had2know.com/technology/color-contrast-calculator-web-design.html
// Above domain is no longer registered.
return brightness < 125;
}
return undefined;
};
export var getRGBA = function getRGBA(color, opacity) {
if (color && canExtractRGBArray(color)) {
var _getRGBArray2 = getRGBArray(color),
red = _getRGBArray2[0],
green = _getRGBArray2[1],
blue = _getRGBArray2[2],
alpha = _getRGBArray2[3];
var normalizedAlpha;
if (opacity !== undefined) {
normalizedAlpha = opacity;
} else if (alpha !== undefined) {
normalizedAlpha = alpha;
} else {
normalizedAlpha = 1;
}
return "rgba(" + red + ", " + green + ", " + blue + ", " + normalizedAlpha + ")";
}
return undefined;
};