HEX
Server: Apache
System: Linux efa57bbe-abb1-400d-2985-3b056fbc2701.secureserver.net 6.1.147-1.el9.elrepo.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Jul 24 12:33:32 EDT 2025 x86_64
User: root (0)
PHP: 8.0.30.4
Disabled: NONE
Upload Files
File: /var/www/wp-content/plugins/pojo-accessibility/modules/scanner/assets/js/utils/convert-colors.js
export const expandHex = (hex) => {
	hex = hex.replace(/^#/, '');
	if (hex.length === 3) {
		hex = hex
			.split('')
			.map((c) => c + c)
			.join('');
	}
	return `#${hex}`;
};

export const rgbOrRgbaToHex = (color) => {
	const match = color.match(
		/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)/i,
	);
	if (!match) {
		return null;
	} // Not an RGB or RGBA string

	const r = parseInt(match[1]).toString(16).padStart(2, '0');
	const g = parseInt(match[2]).toString(16).padStart(2, '0');
	const b = parseInt(match[3]).toString(16).padStart(2, '0');

	// If alpha present and less than 1, include it
	if (match[4] !== undefined && parseFloat(match[4]) < 1) {
		const a = Math.round(parseFloat(match[4]) * 255)
			.toString(16)
			.padStart(2, '0');
		return `#${r}${g}${b}${a}`.toUpperCase(); // 8-digit hex with alpha
	}

	return `#${r}${g}${b}`.toUpperCase(); // 6-digit hex
};

export const hexToRGB = (hex) => {
	hex = expandHex(hex).replace(/^#/, '');
	const num = parseInt(hex, 16);
	// eslint-disable-next-line no-bitwise
	return [(num >> 16) & 255, (num >> 8) & 255, num & 255];
};

export const hexToHsl = (hex) => {
	hex = expandHex(hex).replace(/^#/, '');

	// Handle optional alpha (default 255)
	const hasAlpha = hex.length === 8;
	const r = parseInt(hex.slice(0, 2), 16) / 255;
	const g = parseInt(hex.slice(2, 4), 16) / 255;
	const b = parseInt(hex.slice(4, 6), 16) / 255;
	const a = hasAlpha ? parseInt(hex.slice(6, 8), 16) / 255 : 1;

	const max = Math.max(r, g, b);
	const min = Math.min(r, g, b);
	let h, s;
	const l = (max + min) / 2;

	if (max === min) {
		h = s = 0;
	} else {
		const d = max - min;
		s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
		switch (max) {
			case r:
				h = (g - b) / d + (g < b ? 6 : 0);
				break;
			case g:
				h = (b - r) / d + 2;
				break;
			case b:
				h = (r - g) / d + 4;
				break;
		}
		h *= 60;
	}

	return {
		h: Math.round(h),
		s: Math.round(s * 100),
		l: Math.round(l * 100),
		a: parseFloat(a.toFixed(2)), // keep 2 decimal alpha
	};
};

export const hslToHex = ({ h, s, l, a = 1 }) => {
	s /= 100;
	l /= 100;

	const c = (1 - Math.abs(2 * l - 1)) * s;
	const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
	const m = l - c / 2;

	let r, g, b;
	if (h < 60) {
		[r, g, b] = [c, x, 0];
	} else if (h < 120) {
		[r, g, b] = [x, c, 0];
	} else if (h < 180) {
		[r, g, b] = [0, c, x];
	} else if (h < 240) {
		[r, g, b] = [0, x, c];
	} else if (h < 300) {
		[r, g, b] = [x, 0, c];
	} else {
		[r, g, b] = [c, 0, x];
	}

	const toHex = (v) =>
		Math.round((v + m) * 255)
			.toString(16)
			.padStart(2, '0');

	const alphaHex = Math.round(a * 255)
		.toString(16)
		.padStart(2, '0');

	return a < 1
		? `#${toHex(r)}${toHex(g)}${toHex(b)}${alphaHex}`.toUpperCase()
		: `#${toHex(r)}${toHex(g)}${toHex(b)}`.toUpperCase();
};