@kcuf/mere-color
Version:
Mere color utils for generating, manipulation, a11y purposes.
54 lines (53 loc) • 2.16 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = adjustLightnessForContrast;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _util = require("../util");
var _parse = require("../parse");
var _a11y = require("../a11y");
/**
* Adjust the color's lightness to meet target contrast, returning the new color in the original notation normalized.
*/
function adjustLightnessForContrast(color, targetContrast) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var hsl = (0, _parse.parseToHsl)(color);
if (!hsl) {
return color;
}
var _options$bgc = options.bgc,
bgc = _options$bgc === void 0 ? '#fff' : _options$bgc,
_options$steps = options.steps,
steps = _options$steps === void 0 ? 100 : _options$steps,
_options$minLightness = options.minLightness,
minLightness = _options$minLightness === void 0 ? 0 : _options$minLightness,
_options$maxLightness = options.maxLightness,
maxLightness = _options$maxLightness === void 0 ? 100 : _options$maxLightness;
var bgcLuminance = (0, _a11y.a11yLuminance)(bgc);
if (bgcLuminance < 0) {
return color;
}
var minL = minLightness;
var maxL = maxLightness;
var targetLightness = (minLightness + maxLightness) / 2;
for (var i = 0; i < steps; i++) {
var rgb = (0, _util.hslToRgb)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, hsl), {}, {
l: targetLightness
}));
var contrast = (0, _util.computeContrast)((0, _util.rgbComputeLuminance)(rgb), bgcLuminance);
if (Math.abs(contrast - targetContrast) < 0.001) {
return (0, _util.toColorStringOriginalNotation)(rgb, color);
}
if (contrast > targetContrast) {
minL = targetLightness;
} else {
maxL = targetLightness;
}
targetLightness = (minL + maxL) / 2;
}
return (0, _util.toColorStringOriginalNotation)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, hsl), {}, {
l: targetLightness
}), color);
}