UNPKG

duoyun-ui

Version:

A lightweight desktop UI component library, implemented using Gem

99 lines 3.67 kB
// e.g: chart export const commonColors = Array(20) .fill(null) .map((_, index) => Math.abs((326 + index * 81 * (index % 2 ? 1 : -1)) % 360) / 360) .map((h) => [h, 78 / 100, 64 / 100]) .map((hsl) => hslToRgb(hsl)) .map((rgb) => rgbToHexColor(rgb)); export function rgbToRgbColor([r, g, b, a = 1]) { const rgbStr = [r, g, b].join(); return a === 1 ? `rgb(${rgbStr})` : `rgba(${rgbStr},${Number(a.toFixed(2))})`; } export function rgbToHslColor([r, g, b, a = 1]) { const [h, s, l] = rgbToHsl([r, g, b]); const hslStr = `${Math.round(h * 360)},${Math.round(s * 100)}%,${Math.round(l * 100)}%`; return a === 1 ? `hsl(${hslStr})` : `hsla(${hslStr},${Number(a.toFixed(2))})`; } export function rgbToHexColor(rgba) { const rgb = rgba.slice(0, 3); return `#${(rgba.length === 4 && rgba[3] !== 1 ? [...rgb, rgba[3] * 255] : rgb) .map((e) => Math.round(e).toString(16).padStart(2, '0')) .join('')}`; } export function randomColor(type) { const randomNumber = () => Math.round(Math.random() * 255); const rgb = [randomNumber(), randomNumber(), randomNumber()]; switch (type) { case 'rgba': return rgbToRgbColor(rgb); case 'hsla': return rgbToHslColor(rgb); case 'hex': return rgbToHexColor(rgb); default: return rgb; } } export function parseHexColor(str) { const s = str.replace('#', ''); const fullHex = s.length === 3 || s.length === 4 ? s.replace(/\w/g, ($1) => $1 + $1) : s; const [r, g, b, a = 255] = fullHex .split(/(\w{2})/) .filter((e) => !!e) .map((e) => parseInt(e, 16)); return [r, g, b, a / 255]; } /** * Note: ignore alpha */ export function luminance([r, g, b]) { const a = [r, g, b].map((v) => { v /= 255; return v <= 0.03928 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4; }); return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722; } /** * Note: ignore alpha */ export function contrast(rgb1, rgb2) { const l1 = luminance([rgb1[0], rgb1[1], rgb1[2]]) + 0.05; const l2 = luminance([rgb2[0], rgb2[1], rgb2[2]]) + 0.05; return Math.max(l1, l2) / Math.min(l1, l2); } /** * Note: ignore alpha * * @see * https://stackoverflow.com/questions/8022885/rgb-to-hsv-color-in-javascript */ export function rgbToHsl(rgb) { const [r, g, b] = rgb.map((e) => e / 255); const v = Math.max(r, g, b), c = v - Math.min(r, g, b), f = 1 - Math.abs(v + v - c - 1); const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c); return [(h < 0 ? h + 6 : h) / 6, f ? c / f : 0, (v + v - c) / 2]; } export function hslToRgb([h, s, l]) { const a = s * Math.min(l, 1 - l); const f = (n, k = (n + h * 12) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1); return [f(0), f(8), f(4)].map((e) => Math.round(e * 255)); } export function rgbToHsv(rgb) { const [r, g, b] = rgb.map((e) => e / 255); const v = Math.max(r, g, b), c = v - Math.min(r, g, b); const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c); return [(h < 0 ? h + 6 : h) / 6, v && c / v, v]; } export function hsvToRgb([h, s, v]) { const f = (n, k = (n + h * 6) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0); return [f(5), f(3), f(1)].map((e) => Math.round(e * 255)); } export function hslToHsv([h, s, l]) { const v = s * Math.min(l, 1 - l) + l; return [h, v ? 2 - (2 * l) / v : 0, v]; } export function hsvToHsl([h, s, v]) { const l = v - (v * s) / 2, m = Math.min(l, 1 - l); return [h, m ? (v - l) / m : 0, l]; } //# sourceMappingURL=color.js.map