gitlab-org--gitlab-foss/app/assets/javascripts/lib/utils/color_utils.js

77 lines
2.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const colorValidatorEl = document.createElement('div');
/**
* Validates whether the specified color expression
* is supported by the browsers DOM API and has a valid form.
*
* This utility assigns the color expression to a detached DOM
* elements color property. If the color expression is valid,
* the DOM API will accept the value.
*
* @param {String} color color expression rgba, hex, hsla, etc.
*/
export const isValidColorExpression = (colorExpression) => {
colorValidatorEl.style.color = '';
colorValidatorEl.style.color = colorExpression;
return colorValidatorEl.style.color.length > 0;
};
/**
* Convert hex color to rgb array
*
* @param hex string
* @returns array|null
*/
export const hexToRgb = (hex) => {
// Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
const fullHex = hex.replace(shorthandRegex, (_m, r, g, b) => r + r + g + g + b + b);
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(fullHex);
return result
? [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)]
: null;
};
export const textColorForBackground = (backgroundColor) => {
const [r, g, b] = hexToRgb(backgroundColor);
if (r + g + b > 500) {
return '#333333';
}
return '#FFFFFF';
};
/**
* Check whether a color matches the expected hex format
*
* This matches any hex (0-9 and A-F) value which is either 3 or 6 characters in length
*
* An empty string will return `null` which means that this is neither valid nor invalid.
* This is useful for forms resetting the validation state
*
* @param color string = ''
*
* @returns {null|boolean}
*/
export const validateHexColor = (color = '') => {
if (!color) {
return null;
}
return /^#([0-9A-F]{3}){1,2}$/i.test(color);
};
export function darkModeEnabled() {
const ideDarkThemes = ['dark', 'solarized-dark', 'monokai'];
// eslint-disable-next-line @gitlab/require-i18n-strings
const isWebIde = document.body.dataset.page?.startsWith('ide:');
if (isWebIde) {
return ideDarkThemes.includes(window.gon?.user_color_scheme);
}
return document.body.classList.contains('gl-dark');
}