@wordpress/components
Version:
UI components for WordPress.
126 lines (117 loc) • 3.58 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getOptimalTextColor = getOptimalTextColor;
exports.getOptimalTextShade = getOptimalTextShade;
exports.rgba = rgba;
var _memize = _interopRequireDefault(require("memize"));
var _colord = require("colord");
var _names = _interopRequireDefault(require("colord/plugins/names"));
/**
* External dependencies
*/
/** @type {HTMLDivElement} */
let colorComputationNode;
(0, _colord.extend)([_names.default]);
/**
* Generating a CSS compliant rgba() color value.
*
* @param {string} hexValue The hex value to convert to rgba().
* @param {number} alpha The alpha value for opacity.
* @return {string} The converted rgba() color value.
*
* @example
* rgba( '#000000', 0.5 )
* // rgba(0, 0, 0, 0.5)
*/
function rgba(hexValue = '', alpha = 1) {
return (0, _colord.colord)(hexValue).alpha(alpha).toRgbString();
}
/**
* @return {HTMLDivElement | undefined} The HTML element for color computation.
*/
function getColorComputationNode() {
if (typeof document === 'undefined') {
return;
}
if (!colorComputationNode) {
// Create a temporary element for style computation.
const el = document.createElement('div');
el.setAttribute('data-g2-color-computation-node', '');
// Inject for window computed style.
document.body.appendChild(el);
colorComputationNode = el;
}
return colorComputationNode;
}
/**
* @param {string | unknown} value
*
* @return {boolean} Whether the value is a valid color.
*/
function isColor(value) {
if (typeof value !== 'string') {
return false;
}
const test = (0, _colord.colord)(value);
return test.isValid();
}
/**
* Retrieves the computed background color. This is useful for getting the
* value of a CSS variable color.
*
* @param {string | unknown} backgroundColor The background color to compute.
*
* @return {string} The computed background color.
*/
function _getComputedBackgroundColor(backgroundColor) {
if (typeof backgroundColor !== 'string') {
return '';
}
if (isColor(backgroundColor)) {
return backgroundColor;
}
if (!backgroundColor.includes('var(')) {
return '';
}
if (typeof document === 'undefined') {
return '';
}
// Attempts to gracefully handle CSS variables color values.
const el = getColorComputationNode();
if (!el) {
return '';
}
el.style.background = backgroundColor;
// Grab the style.
const computedColor = window?.getComputedStyle(el).background;
// Reset.
el.style.background = '';
return computedColor || '';
}
const getComputedBackgroundColor = (0, _memize.default)(_getComputedBackgroundColor);
/**
* Get the text shade optimized for readability, based on a background color.
*
* @param {string | unknown} backgroundColor The background color.
*
* @return {string} The optimized text color (black or white).
*/
function getOptimalTextColor(backgroundColor) {
const background = getComputedBackgroundColor(backgroundColor);
return (0, _colord.colord)(background).isLight() ? '#000000' : '#ffffff';
}
/**
* Get the text shade optimized for readability, based on a background color.
*
* @param {string | unknown} backgroundColor The background color.
*
* @return {string} The optimized text shade (dark or light).
*/
function getOptimalTextShade(backgroundColor) {
const result = getOptimalTextColor(backgroundColor);
return result === '#000000' ? 'dark' : 'light';
}
//# sourceMappingURL=colors.js.map