UNPKG

accessible-colors

Version:

Utility functions for working with colors in adherence to WCAG 2.1 guidelines.

9 lines (8 loc) 2.76 kB
/** * @license * author: Christopher Hawke (https://github.com/cdhawke) * accessible-colors.js v1.0.8 * Released under the MIT license. */ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});const t=t=>{const r=e(t);return n(r)},r=t=>{const r=l(t);return o(r)},n=t=>{const{r:r,g:n,b:l}=t;return`#${(r<<16|n<<8|l).toString(16).padStart(6,"0")}`},l=t=>{const r=parseInt(t.replace(/^#/,""),16);return{r:r>>16&255,g:r>>8&255,b:255&r}},e=({h:t,s:r,l:n})=>{let l,e,o;if(0==r)l=e=o=n;else{const s=(t,r,n)=>(n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(r-t)*n:n<.5?r:n<2/3?t+(r-t)*(2/3-n)*6:t),u=n<.5?n*(1+r):n+r-n*r,a=2*n-u;l=s(a,u,t+1/3),e=s(a,u,t),o=s(a,u,t-1/3)}return{r:Math.round(255*l),g:Math.round(255*e),b:Math.round(255*o)}},o=({r:t,g:r,b:n})=>{t/=255,r/=255,n/=255;const l=Math.max(t,r,n),e=Math.min(t,r,n);let o,s;const u=(l+e)/2;if(l==e)o=s=0;else{const a=l-e;switch(s=u>.5?a/(2-l-e):a/(l+e),l){case t:o=(r-n)/a+(r<n?6:0);break;case r:o=(n-t)/a+2;break;case n:o=(t-r)/a+4}o/=6}return{h:o,s:s,l:u}},s=(n,l,e,o,s)=>{const{l:u,...a}=n;let i="lighten"===e?1:u,c="lighten"===e?u:0,g=t({...a,l:c}),h=t({...a,l:i});const p=t(l);if(!o("lighten"===e?h:g,p,s))return null;let f=null,A=null;for(;g!==f||h!==A;){f=g,A=h;const r=(c+i)/2,n=t({...a,l:r});"lighten"===e&&(o(n,p,s)?(i=r,h=t({...a,l:r})):(c=r,g=t({...a,l:r}))),"darken"===e&&(o(n,p,s)?(c=r,g=t({...a,l:r})):(i=r,h=t({...a,l:r})))}return r("lighten"===e?h:g)},u=(n,l,e,o)=>{const u=r(n),a=r(l);if(!a||!u)return null;if(e(n,l,o))return n;const i=s(u,a,"darken",e,o),c=s(u,a,"lighten",e,o);if(null!==i&&null!==c){const r=Math.abs(u.l-i.l),n=Math.abs(u.l-c.l);return t(r<n?i:c)}return null===i&&null!==c?t(c):null===c&&null!==i?t(i):null},a=t=>{if(!t)return null;const r=l(t);if(!r)return null;const[n,e,o]=Object.values(r).map((t=>{const r=t/255;return r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4)}));return.2126*n+.7152*e+.0722*o},i=(t,r,n=3)=>{if(null===t||null===r)return null;const l=a(t),e=a(r);if(null===l||null===e)return null;const[o,s]=[l,e].sort(((t,r)=>r-t));return Math.round((o+.05)/(s+.05)*10**n)/10**n},c=(t,r,n)=>{const l=i(t,r);return l?l>=n:null},g=(t,r,n=!1)=>c(t,r,n?3:4.5),h=(t,r,n=!1)=>c(t,r,n?4.5:7),p=()=>`#${Math.floor(16777215*Math.random()).toString(16).padStart(6,"0")}`;exports.getContrast=i,exports.getLuminance=a,exports.getRandomAAAColor=(t,r=!1)=>{let n=p(),l=0;for(;!h(t,n,r);){if(l++>1e3)return null;n=p()}return n},exports.getRandomAAColor=(t,r=!1)=>{let n=p(),l=0;for(;!g(t,n,r);){if(l++>1e3)return null;n=p()}return n},exports.isAAAContrast=h,exports.isAAContrast=g,exports.isContrasting=c,exports.randomColor=p,exports.suggestAAAColorVariant=(t,r,n)=>u(t,r,h,n),exports.suggestAAColorVariant=(t,r,n)=>u(t,r,g,n); //# sourceMappingURL=index.js.map