UNPKG

@atlaskit/adf-schema

Version:

Shared package that contains the ADF-schema (json) and ProseMirror node/mark specs

75 lines (73 loc) 2.34 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.clampLightness = void 0; var _rgbFromHex = require("./rgb-from-hex"); var _rgbToLch = require("./rgb-to-lch"); var clamp = function clamp(i, min, max) { return Math.round(Math.min(Math.max(i, min), max)); }; var rgbToHex = function rgbToHex(_ref) { var r = _ref.r, g = _ref.g, b = _ref.b; var convertComponent = function convertComponent(c) { var cBase16 = c.toString(16); return cBase16.length === 1 ? "0".concat(cBase16) : cBase16; }; return "#".concat(convertComponent(r)).concat(convertComponent(g)).concat(convertComponent(b)); }; var lchToLab = function lchToLab(_ref2) { var l = _ref2.l, c = _ref2.c, h = _ref2.h; var convertH = Number.isNaN(h) ? 0 : h * (Math.PI / 180); return { l: l, a: Math.cos(convertH) * c, b: Math.sin(convertH) * c }; }; var labToXyz = function labToXyz(_ref3) { var l = _ref3.l, a = _ref3.a, b = _ref3.b; var convertComponent = function convertComponent(c) { return c > 0.206896552 ? Math.pow(c, 3) : 0.12841855 * (c - 0.137931034); }; var y = (l + 16) / 116; var x = a / 500 + y; var z = y - b / 200; return { x: convertComponent(x) * 0.95047, y: convertComponent(y), z: convertComponent(z) * 1.08883 }; }; var xyzToRgb = function xyzToRgb(_ref4) { var x = _ref4.x, y = _ref4.y, z = _ref4.z; var convertComponent = function convertComponent(c) { return 255 * (c <= 0.00304 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055); }; return { r: clamp(convertComponent(3.2404542 * x - 1.5371385 * y - 0.4985314 * z), 0, 255), g: clamp(convertComponent(-0.969266 * x + 1.8760108 * y + 0.041556 * z), 0, 255), b: clamp(convertComponent(0.0556434 * x - 0.2040259 * y + 1.0572252 * z), 0, 255) }; }; var lchToRgb = function lchToRgb(lch) { return xyzToRgb(labToXyz(lchToLab(lch))); }; var clampLightness = exports.clampLightness = function clampLightness(color, newPercent) { var rgb = (0, _rgbFromHex.rgbFromHex)(color); if (rgb === null) { return color; } // LCH (rather than HSL) gives the best results here as the L component in LCH is based on human color perception var lch = (0, _rgbToLch.rgbToLch)(rgb); lch.l = clamp(newPercent, 0, 100); return rgbToHex(lchToRgb(lch)); };