@fr0st/color
Version:
FrostColor is a free, open-source color manipulation library for JavaScript.
1 lines • 11.5 kB
JavaScript
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Color=e()}(this,(function(){"use strict";const t=(t,e=0,n=100)=>Math.max(e,Math.min(n,t)),e=(t,e,r)=>n(t*(1-r)+e*r),n=(t,e=2)=>parseFloat(parseFloat(t).toFixed(e)),r=t=>9===t.length&&t[1]===t[2]&&t[3]===t[4]&&t[5]===t[6]&&t[7]===t[8]?`#${t[1]}${t[3]}${t[5]}${t[7]}`:7===t.length&&t[1]===t[2]&&t[3]===t[4]&&t[5]===t[6]?`#${t[1]}${t[3]}${t[5]}`:t;class i{constructor(e=0,r=1,i=null,s=1){null===i&&(s=r,i=r=e=n(2.55*e)),this._r=t(e,0,255),this._g=t(r,0,255),this._b=t(i,0,255),this._a=t(s,0,1)}valueOf(){return this.luma()}[Symbol.toPrimitive](t){return"number"===t?this.valueOf():this.toString()}get a(){return this._a}get b(){return this._b}get g(){return this._g}get r(){return this._r}}const s={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},a=Object.fromEntries(Object.entries(s).map((([t,e])=>[e,t]))),f=(t,e,n)=>6*(n=(n+1)%1)<1?t+6*(e-t)*n:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t,o=(t,e,r)=>{if(!r)return[0,0,0];e/=100;const i=(r/=100)<.5?r*(1+e):r+e-e*r,s=2*r-i,a=f(s,i,(t/=360)+1/3),o=f(s,i,t),d=f(s,i,t-1/3);return[n(255*a),n(255*o),n(255*d)]},d=(t,e,r)=>{if(r/=100,!e)return[n(255*r),n(255*r),n(255*r)];t=t/60%6,e/=100;const i=Math.floor(t),s=r*(1-e),a=r*(1-e*(t-i)),f=r*(1-e*(1-(t-i)));let o,d,h;switch(i){case 0:o=r,d=f,h=s;break;case 1:o=a,d=r,h=s;break;case 2:o=s,d=r,h=f;break;case 3:o=s,d=a,h=r;break;case 4:o=f,d=s,h=r;break;default:o=r,d=s,h=a}return[n(255*o),n(255*d),n(255*h)]},h=(t,e,r)=>{t/=255,e/=255,r/=255;const i=Math.min(t,e,r),s=Math.max(t,e,r),a=s-i,f=(s+i)/2;if(!a)return[0,0,n(100*f)];const o=f<.5?a/(s+i):a/(2-s-i),d=((s-t)/6+a/2)/a,h=((s-e)/6+a/2)/a,u=((s-r)/6+a/2)/a;let c=0;switch(s){case t:c=u-h;break;case e:c=1/3+d-u;break;case r:c=2/3+h-d}return c=(c+1)%1,[n(360*c),n(100*o),n(100*f)]},u=(t,e,r)=>{t/=255,e/=255,r/=255;const i=Math.min(t,e,r),s=Math.max(t,e,r),a=s-i,f=s;if(!a)return[0,0,n(100*f)];const o=a/s,d=((s-t)/6+a/2)/a,h=((s-e)/6+a/2)/a,u=((s-r)/6+a/2)/a;let c=0;switch(s){case t:c=u-h;break;case e:c=1/3+d-u;break;case r:c=2/3+h-d}return c=(c+1)%1,[n(360*c),n(100*o),n(100*f)]},c=(t,e,n,r)=>{[t,e,n]=[t,e,n].map((t=>(256|Math.round(t)).toString(16).slice(1)));const i=`#${t}${e}${n}`;return r>=1?i:i+(256|Math.round(255*r)).toString(16).slice(1)},l=t=>(t/=255)<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4);function g(t,e,r,s=1){const[a,f,o]=((t,e,r)=>[n(255*(1-t/100)),n(255*(1-e/100)),n(255*(1-r/100))])(t,e,r);return new i(a,f,o,s)}function b(t){const e=(t=t.trim()).length>6?t.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i):t.match(/^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f]?)$/i);if(!e)throw new Error("Invalid hex string");const n=e.slice(1,5).map((t=>t?parseInt(2==t.length?t:t+t,16):null));return new i(n[0],n[1],n[2],n[3]?n[3]/255:1)}function m(t,e,n,r=1){const[s,a,f]=o(t,e,n);return new i(s,a,f,r)}function w(t){const e=(t=t.trim()).match(/^hsl\(((?:\d*\.)?\d+)deg\s+((?:\d*\.)?\d+)\%\s+((?:\d*\.)?\d+)\%\)$/i);if(e)return m(e[1],e[2],e[3]);const n=t.match(/^hsl\(((?:\d*\.)?\d+)deg\s+((?:\d*\.)?\d+)\%\s+((?:\d*\.)?\d+)\%\s*\/\s*((?:\d*\.)?\d+)(\%?)\)$/i);if(n)return m(n[1],n[2],n[3],n[5]?n[4]/100:n[4]);const r=t.match(/^hsl\(((?:\d*\.)?\d+),\s*((?:\d*\.)?\d+)\%,\s*((?:\d*\.)?\d+)\%\)$/i);if(r)return m(r[1],r[2],r[3]);const i=t.match(/^hsla\(((?:\d*\.)?\d+),\s*((?:\d*\.)?\d+)\%,\s*((?:\d*\.)?\d+)\%,\s*((?:\d*\.)?\d+)(\%?)\)$/i);if(i)return m(i[1],i[2],i[3],i[5]?i[4]/100:i[4]);throw new Error("Invalid HSL string")}function p(t){const e=(t=t.trim()).match(/^rgb\(((?:\d*\.)?\d+)\s+((?:\d*\.)?\d+)\s+((?:\d*\.)?\d+)\)$/i);if(e)return new i(e[1],e[2],e[3]);const n=t.match(/^rgb\(((?:\d*\.)?\d+)\s+((?:\d*\.)?\d+)\s+((?:\d*\.)?\d+)\s*\/\s*((?:\d*\.)?\d+)(\%?)\)$/i);if(n)return new i(n[1],n[2],n[3],n[5]?n[4]/100:n[4]);const r=t.match(/^rgb\(((?:\d*\.)?\d+),\s*((?:\d*\.)?\d+),\s*((?:\d*\.)?\d+)\)$/i);if(r)return new i(r[1],r[2],r[3]);const s=t.match(/^rgba\(((?:\d*\.)?\d+),\s*((?:\d*\.)?\d+),\s*((?:\d*\.)?\d+),\s*((?:\d*\.)?\d+)(\%?)\)$/i);if(s)return new i(s[1],s[2],s[3],s[5]?s[4]/100:s[4]);throw new Error("Invalid RGB string")}const y=(t,e)=>{const n=t.luma(),r=e.luma();return(Math.max(n,r)+.05)/(Math.min(n,r)+.05)},k=(t,e)=>Math.hypot(t.r-e.r,t.g-e.g,t.b-e.b);function $(t,n,r){const s=e(t.r,n.r,r),a=e(t.g,n.g,r),f=e(t.b,n.b,r);return new i(s,a,f)}const M=new i(100),v=new i(50),S=new i(0);i.contrast=y,i.dist=k,i.findContrast=(t,e=null,{minContrast:n=4.5,stepSize:r=.01}={})=>{if(e||(e=t),y(t,e)>=n)return e;const i=["tint","shade"];for(let s=r;s<=1;s+=r)for(const r of i){const i=e[r](s);if(y(t,i)>=n)return i}return null},i.fromCMY=g,i.fromCMYK=function(t,e,r,i,s=1){return[t,e,r]=((t,e,r,i)=>[n(100*(t/100*(1-(i/=100))+i)),n(100*(e/100*(1-i)+i)),n(100*(r/100*(1-i)+i))])(t,e,r,i),g(t,e,r,s)},i.fromHexString=b,i.fromHSL=m,i.fromHSLString=w,i.fromHSV=function(t,e,n,r=1){const[s,a,f]=d(t,e,n);return new i(s,a,f,r)},i.fromRGB=function(t,e,n,r=1){return new i(t,e,n,r)},i.fromRGBString=p,i.fromString=function(t){if("transparent"===(t=t.toLowerCase().trim()))return new i(0,0,0,0);if(t in s&&(t=s[t]),"#"===t.substring(0,1))return b(t);if("rgb"===t.substring(0,3).toLowerCase())return p(t);if("hsl"===t.substring(0,3).toLowerCase())return w(t);throw new Error("Invalid color string")},i.mix=$,i.multiply=function(t,n,r){const s=e(t.r,t.r*n.r/255,r),a=e(t.g,t.g*n.g/255,r),f=e(t.b,t.b*n.b/255,r);return new i(s,a,f)};const x=i.prototype;return x.analogous=function(){const[t,e,n]=u(this.r,this.g,this.b),[r,s,a]=d(t+30,e,n),[f,o,h]=d(t-30,e,n);return[new i(r,s,a,this.a),new i(f,o,h,this.a)]},x.complementary=function(){const[t,e,n]=u(this.r,this.g,this.b),[r,s,a]=d(t+180,e,n);return new i(r,s,a,this.a)},x.darken=function(t){let[e,n,r]=h(this.r,this.g,this.b);r-=r*t;const[s,a,f]=o(e,n,r);return new i(s,a,f,this.a)},x.getAlpha=function(){return this.a},x.getBrightness=function(){return u(this.r,this.g,this.b)[2]},x.getHue=function(){return u(this.r,this.g,this.b)[0]},x.getSaturation=function(){return u(this.r,this.g,this.b)[1]},x.invert=function(){return new i(255-this.r,255-this.g,255-this.b,this.a)},x.label=function(){let t,e=Number.MAX_SAFE_INTEGER;for(const n in s){if(!{}.hasOwnProperty.call(s,n))continue;const r=b(s[n]),i=k(this,r);i<e&&(t=n,e=i)}return t},x.lighten=function(t){let[e,n,r]=h(this.r,this.g,this.b);r+=(100-r)*t;const[s,a,f]=o(e,n,r);return new i(s,a,f,this.a)},x.luma=function(){return t=this.r,e=this.g,n=this.b,.2126*(t=l(t))+.7152*(e=l(e))+.0722*l(n);var t,e,n},x.palette=function({shades:t=10,tints:e=10,tones:n=10}={}){return{shades:this.shades(t),tints:this.tints(e),tones:this.tones(n)}},x.setAlpha=function(t){return new i(this.r,this.g,this.b,t)},x.setBrightness=function(t){const[e,n,r]=u(this.r,this.g,this.b),[s,a,f]=d(e,n,t);return new i(s,a,f,this.a)},x.setHue=function(t){const[e,n,r]=u(this.r,this.g,this.b),[s,a,f]=d(t,n,r);return new i(s,a,f,this.a)},x.setSaturation=function(t){const[e,n,r]=u(this.r,this.g,this.b),[s,a,f]=d(e,t,r);return new i(s,a,f,this.a)},x.shade=function(t){return $(this,S,t)},x.shades=function(t=10){return new Array(t).fill().map(((e,n)=>this.shade(n/(t+1))))},x.split=function(){const[t,e,n]=u(this.r,this.g,this.b),[r,s,a]=d(t+150,e,n),[f,o,h]=d(t-150,e,n);return[new i(r,s,a,this.a),new i(f,o,h,this.a)]},x.tetradic=function(){const[t,e,n]=u(this.r,this.g,this.b),[r,s,a]=d(t+60,e,n),[f,o,h]=d(t+180,e,n),[c,l,g]=d(t-120,e,n);return[new i(r,s,a,this.a),new i(f,o,h,this.a),new i(c,l,g,this.a)]},x.tint=function(t){return $(this,M,t)},x.tints=function(t=10){return new Array(t).fill().map(((e,n)=>this.tint(n/(t+1))))},x.toHexString=function(){const t=c(this.r,this.g,this.b,this.a);return r(t)},x.toHSLString=function(){let[t,e,n]=h(this.r,this.g,this.b);t=Math.round(t),e=Math.round(e),n=Math.round(n);const r=Math.round(100*this.a);return r<100?`hsl(${t}deg ${e}% ${n}% / ${r}%)`:`hsl(${t}deg ${e}% ${n}%)`},x.toRGBString=function(){const t=Math.round(this.r),e=Math.round(this.g),n=Math.round(this.b),r=Math.round(100*this.a);return r<100?`rgb(${t} ${e} ${n} / ${r}%)`:`rgb(${t} ${e} ${n})`},x.toString=function(){if(!this.a)return"transparent";if(this.a<1)return this.toRGBString();const t=c(this.r,this.g,this.b,this.a);return t in a?a[t]:r(t)},x.tone=function(t){return $(this,v,t)},x.tones=function(t=10){return new Array(t).fill().map(((e,n)=>this.tone(n/(t+1))))},x.triadic=function(){const[t,e,n]=u(this.r,this.g,this.b),[r,s,a]=d(t+120,e,n),[f,o,h]=d(t-120,e,n);return[new i(r,s,a,this.a),new i(f,o,h,this.a)]},i}));