UNPKG

colorpath

Version:
2 lines (1 loc) 2.87 kB
"use strict";var getAverage=function(r){return r.reduce(function(r,t){return r+t})/r.length},validatePercentages=function(r){return Math.max.apply(null,r)-Math.min.apply(null,r)<=.02},formatColor=function(r){if(Array.isArray(r))return r;if(r=""+r,/^#?[0123456789AaBbCcDdEeFf]{6}$/.test(r)){r=r.slice(-6);var t=parseInt(r[0]+r[1],16),e=parseInt(r[2]+r[3],16),n=parseInt(r[4]+r[5],16);return[t,e,n]}if(/\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}/.test(r)&&(r=/\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}/.exec(r)[0].split(",").map(function(r){return Number(r.trim())}),r.every(function(r){return r<=255})))return r;throw new Error(r+" is not a legal color!")},formatNumber=function(r){return Number(r.toPrecision(4))},util={getAverage:getAverage,validatePercentages:validatePercentages,formatColor:formatColor,formatNumber:formatNumber},tint=function(r,t){var e=util.formatColor(r);return e.map(function(r){r=Number(r);var e=255;return Math.round(r+(e-r)*t)})},shade=function(r,t){var e=util.formatColor(r);return e.map(function(r){return Math.round(r*(1-t))})},mix=function(r,t,e){var n=util.formatColor(r),a=util.formatColor(t);return n.map(function(r,t){var n=a[t];return Math.round(n-(n-r)*e)})},findTint=function(r,t){var e=util.formatColor(r),n=util.formatColor(t),a=[];if(e.forEach(function(r,t){var e=255,i=n[t];return r===e?void(i!==e&&a.push(-1)):void a.push((i-r)/(e-r))}),util.validatePercentages(a))return util.formatNumber(util.getAverage(a));throw new Error(t+" can not be tinted from "+r+", try findPath instead.")},findShade=function(r,t){var e=util.formatColor(r),n=util.formatColor(t),a=e.map(function(r,t){var e=n[t];return e/r});if(util.validatePercentages(a))return util.formatNumber(1-util.getAverage(a));throw new Error(t+" can not be shaded from "+r+", try findPath instead.")},source,destination,getMixerChannel=function(r,t){return Math.round((destination[r]-source[r]*t)/(1-t))},getPercentage=function(r,t){return(t-destination[r])/(t-source[r])},validatePercentage=function(r){return r=util.formatNumber(r),r>=0&&r<=1},validateMixer=function(r){return r.every(function(r){return r>=0&&r<=255})},findMixer=function(r,t){source=util.formatColor(r),destination=util.formatColor(t);for(var e,n=[],a=[0,255],i=0;i<3;i++)for(var o=0;o<2;o++){var u=a[o];if(e=getPercentage(i,u),n=[getMixerChannel(0,e),getMixerChannel(1,e),getMixerChannel(2,e)],validatePercentage(e)&&validateMixer(n))return{mixer:n,percentage:util.formatNumber(e)}}return{}},findPath=function(r,t){var e=util.formatColor(r),n=util.formatColor(t);try{try{return{method:"shade",percentage:findShade(e,n)}}catch(r){return{method:"tint",percentage:findTint(e,n)}}}catch(r){var a=findMixer(e,n);return{method:"mix",mixer:a.mixer,percentage:a.percentage}}},colorPath={tint:tint,shade:shade,mix:mix,findTint:findTint,findShade:findShade,findMixer:findMixer,findPath:findPath};module.exports=colorPath;