UNPKG

@wordpress/components

Version:
126 lines (117 loc) 3.58 kB
"use strict"; 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