UNPKG

accessible-colors

Version:

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

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