chromametry 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -9
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.global.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
> A metrics framework for evaluating web-accessible sequential color palettes.
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-

|
|
6
6
|
*Figure 1. Web-accessible Palette Ranking*
|
|
7
7
|
|
|
8
8
|
## Metric Definitions
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
3. **Chroma Smoothness:** Checks for artifacts and kinks in the saturation curve using Monotone Cubic Splines.
|
|
13
13
|
4. **Hue Stability:** Quantifies hue shift/drift across the lightness ramp.
|
|
14
14
|
5. **Spacing Uniformity:** Measures the consistency of color spacing (DeltaE 2000).
|
|
15
|
-
>[Read full Methodology](https://github.com/chromametry/
|
|
15
|
+
>[Read full Methodology](https://github.com/chromametry/paper/paper.pdf)
|
|
16
16
|
|
|
17
17
|
> All lightness, chroma, hue, and DeltaE2000 computations are performed in the CIELAB color space.
|
|
18
18
|
|
|
@@ -42,15 +42,14 @@ Comparison of popular design systems based on Chromametry metrics.
|
|
|
42
42
|
|
|
43
43
|
### Example: A Typical Report
|
|
44
44
|
|
|
45
|
-

|
|
46
|
+
*Figure 2. Adobe Spectrum Color Palette.*
|
|
47
47
|
|
|
48
|
-

|
|
49
|
+
*Figure 3. Adobe Spectrum Palette Metrics.*
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
*Figure 4. IBM Carbon Palette Charts.*
|
|
51
|
+

|
|
52
|
+
*Figure 4. Adobe Spectrum Palette Charts.*
|
|
54
53
|
|
|
55
54
|
## Benchmark result page
|
|
56
55
|
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var P=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var st=Object.prototype.hasOwnProperty;var ct=(r,t)=>{for(var n in t)P(r,n,{get:t[n],enumerable:!0})},mt=(r,t,n,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of at(t))!st.call(r,o)&&o!==n&&P(r,o,{get:()=>t[o],enumerable:!(e=ot(t,o))||e.enumerable});return r};var ht=r=>mt(P({},"__esModule",{value:!0}),r);var dt={};ct(dt,{analyzeMonochromatic:()=>F,analyzeMonochromaticPalette:()=>xt,calcChromaSmoothness:()=>J,calcContrastEfficiency:()=>V,calcDeltaE2000:()=>k,calcHueStability:()=>K,calcLightnessLinearity:()=>W,calcScore:()=>I,calcSpacingUniformity:()=>Q,calcStatistics:()=>ft,contrastList:()=>H,createMonotone:()=>B,cssRgbToRgb:()=>gt,findMaxChromaHex:()=>v,fromLightnessEAL:()=>ut,getApcaContrast:()=>L,getMonochromaticContrasts:()=>N,getPaletteContrasts:()=>z,getRelativeLuminance:()=>D,getWcagContrast:()=>R,hexToRgb:()=>f,labToLch:()=>q,labToRgb:()=>lt,lchToLab:()=>bt,lrgbToSrgb:()=>X,rgbToHex:()=>it,rgbToLab:()=>x,rootMeanSquare:()=>y,simulateDeuteranopia:()=>Mt,simulateProtanopia:()=>pt,srgbToLrgb:()=>Y,toLightnessEAL:()=>T,unwrapHue:()=>A});module.exports=ht(dt);var D=r=>{let[t,n,e]=r;return .2126*t+.7152*n+.0722*e},X=r=>{let t=n=>{let e=Math.max(0,Math.min(1,n)),o=e<=.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.055;return Math.max(0,Math.min(255,Math.round(o*255)))};return r.map(t)},Y=r=>{let t=n=>n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92;return r.map(t)},it=r=>{let[t,n,e]=X(r);return t=t.toString(16).padStart(2,"0"),n=n.toString(16).padStart(2,"0"),e=e.toString(16).padStart(2,"0"),`#${t}${n}${e}`},f=r=>{let t=parseInt(r.slice(1,3),16)/255,n=parseInt(r.slice(3,5),16)/255,e=parseInt(r.slice(5,7),16)/255;return Y([t,n,e])},T=r=>{let[t,n,e]=r,o=Math.sqrt(n*n+e*e),c=(Math.atan2(e,n)*180/Math.PI+360)%360,i=.1644,b=.0603,a=.1307,u=.006,h=i*Math.abs(Math.sin((c-90)/2*(Math.PI/180)))+b,m=0;return(c<=90||c>=270)&&(m=a*Math.abs(Math.cos(c*(Math.PI/180)))+u),t+(h+m)*o},ut=(r,t)=>{let[,n,e]=t,o=Math.sqrt(n*n+e*e),c=(Math.atan2(e,n)*180/Math.PI+360)%360,i=.1644,b=.0603,a=.1307,u=.006,h=i*Math.abs(Math.sin((c-90)/2*(Math.PI/180)))+b,m=0;return(c<=90||c>=270)&&(m=a*Math.abs(Math.cos(c*(Math.PI/180)))+u),Math.max(0,r-(h+m)*o)},bt=r=>{let[t,n,e]=r,o=e*Math.PI/180;return[t,n*Math.cos(o),n*Math.sin(o)]},x=r=>{let[t,n,e]=r,o=[[1.0479298,.0229469,-.0501922],[.0296278,.9904345,-.0170738],[.0296278,.9904345,-.0170738]],s=.4124564*t+.3575761*n+.1804375*e,c=.2126729*t+.7151522*n+.072175*e,i=.0193339*t+.119192*n+.9503041*e,b=1.0479298*s+.0229469*c-.0501922*i,a=.0296278*s+.9904345*c-.0170738*i,u=-.009243*s+.0150552*c+.7518743*i,h=M=>M>.008856?Math.cbrt(M):7.787*M+16/116,m=h(b/.96422),l=h(a/1),p=h(u/.82521);return[116*l-16,500*(m-l),200*(l-p)]},q=r=>{let[t,n,e]=r,o=Math.sqrt(n*n+e*e);if(o<1e-4)return[t,0,0];let c=(Math.atan2(e,n)*180/Math.PI+360)%360;return c>=359.9999&&(c=0),[t,o,c]},lt=r=>{let[t,n,e]=r,o=(t+16)/116,s=n/500+o,c=o-e/200,i=p=>p>.2068965?p**3:(p-16/116)/7.787,b=i(s)*.96422,a=i(o)*1,u=i(c)*.82521,h=.9555766*b-.0230393*a+.0631636*u,m=-.0282895*b+1.0099416*a+.0210077*u,l=.0122982*b-.020483*a+1.3299098*u;return[3.2404542*h-1.5371385*m-.4985314*l,-.969266*h+1.8760108*m+.041556*l,.0556434*h-.2040259*m+1.0572252*l]},k=(r,t)=>{let[n,e,o]=r,[s,c,i]=t,b=(n+s)/2,a=Math.sqrt(e*e+o*o),u=Math.sqrt(c*c+i*i),h=(a+u)/2,m=.5*(1-Math.sqrt(Math.pow(h,7)/(Math.pow(h,7)+Math.pow(25,7)))),l=e*(1+m),p=c*(1+m),M=Math.sqrt(l*l+o*o),d=Math.sqrt(p*p+i*i),S=(M+d)/2,C=Math.atan2(o,l)*180/Math.PI+(Math.atan2(o,l)<0?360:0),g=Math.atan2(i,p)*180/Math.PI+(Math.atan2(i,p)<0?360:0),E=g-C;Math.abs(E)>180&&(E+=g<=C?360:-360);let w=Math.abs(C-g)>180?(C+g+360)/2:(C+g)/2,Z=1-.17*Math.cos((w-30)*Math.PI/180)+.24*Math.cos(2*w*Math.PI/180)+.32*Math.cos((3*w+6)*Math.PI/180)-.2*Math.cos((4*w-63)*Math.PI/180),tt=s-n,U=d-M,$=2*Math.sqrt(M*d)*Math.sin(E/2*Math.PI/180),nt=1+.015*Math.pow(b-50,2)/Math.sqrt(20+Math.pow(b-50,2)),G=1+.045*S,O=1+.015*S*Z,rt=30*Math.exp(-Math.pow((w-275)/25,2)),et=-(2*Math.sqrt(Math.pow(S,7)/(Math.pow(S,7)+Math.pow(25,7))))*Math.sin(2*rt*Math.PI/180);return Math.sqrt(Math.pow(tt/nt,2)+Math.pow(U/G,2)+Math.pow($/O,2)+et*(U/G)*($/O))},v=r=>{let t="",n=-1/0;for(let e of r){let o=x(f(e)),[,s]=q(o);s>n&&(n=s,t=e)}return t};function A(r){let t=[r[0]];for(let n=1;n<r.length;n++){let e=r[n]-r[n-1];e>180?e-=360:e<-180&&(e+=360),t.push(t[n-1]+e)}return t}function pt(r){let[t,n,e]=r;return[.152286*t+1.052583*n-.204868*e,.114503*t+.786281*n+.099216*e,-.003882*t-.048116*n+1.051998*e]}function Mt(r){let[t,n,e]=r;return[.367322*t+.860646*n-.227968*e,.280085*t+.672501*n+.047413*e,-.01182*t+.04294*n+.968881*e]}var gt=r=>{let t=r.match(/\d+(\.\d+)?/g);if(!t||t.length<3)throw new Error("Invalid CSS rgb()");let n=e=>{let o=e/255;return o<=.04045?o/12.92:Math.pow((o+.055)/1.055,2.4)};return[n(Number(t[0])),n(Number(t[1])),n(Number(t[2]))]};var R=(r,t)=>(Math.max(r,t)+.05)/(Math.min(r,t)+.05),L=(r,t)=>{let n=c=>c>5e-4?c:c+Math.pow(5e-4-c,.8),e=n(r),o=n(t),s=(Math.pow(e,.56)-Math.pow(o,.56))*100;return Math.abs(s)<.1?0:(s=s>0?s<1?0:s-.25:s>-1?0:s+.25,Math.round(s))};function _(r){let t=r.match(/^(wcag|apca)(\d+)$/);if(!t)throw new Error(`Invalid contrast: ${r}`);let n=t[1]==="wcag"?Number(t[2])/10:Number(t[2]);return{system:t[1],target:n}}var N=r=>{let t={},n=r.length,e=n-1;return H.forEach(o=>{let{system:s,target:c}=_(o),i=e,b=0;for(let a=1;a<n;a++){let u=1/0;for(let h=0;h<n-a;h++){let m=s==="wcag"?R(r[h].luminance,r[h+a].luminance):Math.max(Math.abs(L(r[h+a].luminance,r[h].luminance)),Math.abs(L(r[h].luminance,r[h+a].luminance)));m<u&&(u=m)}if(u>=c){i=a,b=u;break}a===e&&(b=u)}t[o]={system:s,efficiency:i/e,target:c,span:i,value:b,name:o}}),t},H=["wcag30","wcag45","wcag70","apca45","apca60","apca75"],z=r=>{let t={};return H.forEach(n=>{var a;let{target:e,system:o}=_(n),s=r.map(u=>u.contrasts[n]),c=((a=r[0])==null?void 0:a.shades.length)||0,i=Math.max(...s.map(u=>(u==null?void 0:u.span)||0)),b=s.reduce((u,h)=>u+((h==null?void 0:h.value)||0),0);t[n]={system:o,target:e,span:i,value:b/(r.length||1),name:n,efficiency:i/(c-1||1)}}),t};var j=r=>{let t=f(r),n=x(t),e=D(t),o=T(n),s=q(n);return{hex:r,rgb:t,lab:n,lch:s,lightness:o,chroma:s[1],hue:s[2],luminance:e,parameter:0,cumDeltaE00:0,cumProtDeltaE00:0,cumDeutDeltaE00:0,wcag:R(e,1),apca:L(e,1)}};var B=r=>{if(r.length<1)return a=>0;let t=[...r].sort((a,u)=>a[0]-u[0]),n=[];for(let a=0;a<t.length;a++)(a===0||t[a][0]!==t[a-1][0])&&n.push(t[a]);let e=n.length;if(e===1)return a=>n[0][1];let o=n.map(a=>a[0]),s=n.map(a=>a[1]),c=[],i=[];for(let a=0;a<e-1;a++)c[a]=o[a+1]-o[a],i[a]=(s[a+1]-s[a])/c[a];let b=new Array(e);b[0]=i[0],b[e-1]=i[e-2];for(let a=1;a<e-1;a++){let u=i[a-1],h=i[a];if(u*h<=0)b[a]=0;else{let m=(1+c[a]/(c[a-1]+c[a]))/3;b[a]=u*h/((1-m)*u+m*h)}}return a=>{if(a<=o[0])return s[0];if(a>=o[e-1])return s[e-1];let u=0,h=e-2,m=0;for(;u<=h;){let g=Math.floor((u+h)/2);if(a>=o[g]&&a<=o[g+1]){m=g;break}a<o[g]?h=g-1:u=g+1}let l=c[m],p=(a-o[m])/l,M=p*p,d=M*p,S=b[m]*l,C=b[m+1]*l;return(2*d-3*M+1)*s[m]+(d-2*M+p)*S+(-2*d+3*M)*s[m+1]+(d-M)*C}};function y(r){let t=r.length;if(t===0)return 0;let n=0;for(let e=0;e<t;e++)n+=r[e]*r[e];return Math.sqrt(n/t)}var ft=r=>{let t=r.length;if(t===0)return{min:0,max:0,avg:0};let n=r[0],e=r[0],o=0;for(let s=0;s<t;s++){let c=r[s];c<n&&(n=c),c>e&&(e=c),o+=c}return{min:n,max:e,avg:o/t}},I=r=>{let t=r.length;if(t===0)return 0;let n=1e-6,e=r.reduce((c,i)=>c*(i+n),1),o=Math.pow(e,1/t),s=Math.max(0,Math.min(1,o));return parseFloat((s*100).toFixed(2))};var F=(r,t,n)=>{t||(t="brand"),n||(n=[...Array(r.length).keys()]);let e=x(f(r[0]))[0],o=x(f(r[r.length-1]))[0];e>o&&r.reverse();let s=r.map(m=>j(m));for(let m=1;m<s.length;m++){let l=k(s[m-1].lab,s[m].lab);s[m].cumDeltaE00=s[m-1].cumDeltaE00+l}let c=v(r.slice(2,-2))||r[Math.floor(r.length/2)],i=r.findIndex(m=>m.toLowerCase()===(c==null?void 0:c.toLowerCase())),b=A(s.map(m=>m.hue).slice(1,-1));for(let m=1;m<s.length-1;m++)s[m].hue=b[m-1];let a=K(s.map(m=>m.hue).slice(1,-1),s[i].hue),u=N(s),h={lightnessLinearity:W(s.map(m=>m.lightness)),chromaSmoothness:J(s.map(m=>m.chroma)),spacingUniformity:Q(s.map(m=>m.cumDeltaE00)),contrastEfficiency:V(u.wcag45.span,n.length),hueStability:a};return{name:t,colors:r,baseIndex:i,baseColor:c,shades:s,contrasts:u,metrics:h,score:I(Object.values(h))}},xt=r=>{let{stepNames:t,name:n,colors:e}=r,o=Object.values(e)[0],s=x(f(o[0]))[0],c=x(f(o[o.length-1]))[0],i=s>c?"darken":"lighten",b=[],a={};for(let h in e){let m=F(e[h],h,t);b.push(m),a[h]=m.baseColor}let u={contrastEfficiency:y(b.map(h=>h.metrics.contrastEfficiency)),lightnessLinearity:y(b.map(h=>h.metrics.lightnessLinearity)),chromaSmoothness:y(b.map(h=>h.metrics.chromaSmoothness)),hueStability:y(b.map(h=>h.metrics.hueStability)),spacingUniformity:y(b.map(h=>h.metrics.spacingUniformity))};return{name:n,baseColors:a,stepNames:t,direction:i,steps:t.length,colors:e,contrasts:z(b),scales:b,metrics:u,score:I(Object.values(u))}};function W(r){let t=r.length;if(t<2)return 1;let n=0,e=0,o=0,s=0;for(let m=0;m<t;m++)n+=m,e+=r[m],o+=m*r[m],s+=m*m;let c=t*s-n*n;if(Math.abs(c)<1e-10)return 1;let i=(t*o-n*e)/c,b=(e-i*n)/t;if(Math.abs(i*(t-1))<.001)return 1;let u=0,h=0;for(let m=0;m<t;m++){let l=i*m+b,p=r[m]-l;u+=p*p;let M=Math.max(l-Math.min(b,i*(t-1)+b),Math.max(b,i*(t-1)+b)-l);h+=M*M}return Math.max(0,Math.min(1,1-Math.sqrt(u/t)/Math.sqrt(h/t)))}function K(r,t){let n=r.length;if(n<2)return 1;let e=0,o=0;for(let s=0;s<n;s++){let c=Math.abs(r[s]-t)%360;c>180&&(c=360-c),e+=c*c;let i=s/(n-1)*180;o+=i*i}return Math.max(0,Math.min(1,1-Math.sqrt(e/n)/(Math.sqrt(o/n)||1)))}var J=r=>{let t=r.length;if(t<3)return 1;let n=r.map(a=>a*133.8),e=Math.min(...n),o=Math.max(...n),s=n.findIndex(a=>a===o),c=B([[0,n[0]],[s,o],[t-1,n[t-1]]]),i=0,b=0;for(let a=0;a<t;a++){let u=c(a),h=n[a]-u;i+=h*h,b+=Math.pow(Math.max(u-e,o-u),2)}return Math.max(0,Math.min(1,1-Math.sqrt(i/t)/Math.sqrt(b/t)))},Q=r=>{let t=r.length;if(t<2)return 1;let n=[];for(let c=1;c<t;c++){let i=r[c]-r[c-1];if(i<0)return 0;n.push(i)}let e=n.reduce((c,i)=>c+i,0)/n.length;if(e<=1e-6)return 0;let o=0;for(let c of n)o+=Math.pow(c-e,2);let s=Math.sqrt(o/n.length)/e;return Math.max(0,Math.min(1,1/(1+s)))},V=(r,t)=>{if(t<=1)return 1;let n=.489,e=r/t,o=n*((t-1)/t);return e<=o?1:e>=1?0:(1-e)/(1-o)};0&&(module.exports={analyzeMonochromatic,analyzeMonochromaticPalette,calcChromaSmoothness,calcContrastEfficiency,calcDeltaE2000,calcHueStability,calcLightnessLinearity,calcScore,calcSpacingUniformity,calcStatistics,contrastList,createMonotone,cssRgbToRgb,findMaxChromaHex,fromLightnessEAL,getApcaContrast,getMonochromaticContrasts,getPaletteContrasts,getRelativeLuminance,getWcagContrast,hexToRgb,labToLch,labToRgb,lchToLab,lrgbToSrgb,rgbToHex,rgbToLab,rootMeanSquare,simulateDeuteranopia,simulateProtanopia,srgbToLrgb,toLightnessEAL,unwrapHue});
|
|
1
|
+
"use strict";var P=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var st=Object.prototype.hasOwnProperty;var ct=(r,t)=>{for(var n in t)P(r,n,{get:t[n],enumerable:!0})},mt=(r,t,n,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of at(t))!st.call(r,o)&&o!==n&&P(r,o,{get:()=>t[o],enumerable:!(e=ot(t,o))||e.enumerable});return r};var ht=r=>mt(P({},"__esModule",{value:!0}),r);var dt={};ct(dt,{analyzeMonochromatic:()=>O,analyzeMonochromaticPalette:()=>xt,calcChromaSmoothness:()=>K,calcContrastEfficiency:()=>Q,calcDeltaE2000:()=>A,calcHueStability:()=>Z,calcLightnessLinearity:()=>W,calcScore:()=>I,calcSpacingUniformity:()=>J,calcStatistics:()=>ft,contrastList:()=>H,createMonotone:()=>z,cssRgbToRgb:()=>gt,findMaxChromaHex:()=>k,fromLightnessEAL:()=>ut,getApcaContrast:()=>L,getMonochromaticContrasts:()=>N,getPaletteContrasts:()=>X,getRelativeLuminance:()=>D,getWcagContrast:()=>R,hexToRgb:()=>f,labToLch:()=>q,labToRgb:()=>lt,lchToLab:()=>bt,lrgbToSrgb:()=>G,rgbToHex:()=>it,rgbToLab:()=>x,rootMeanSquare:()=>y,simulateDeuteranopia:()=>Mt,simulateProtanopia:()=>pt,srgbToLrgb:()=>_,toLightnessEAL:()=>T,unwrapHue:()=>v});module.exports=ht(dt);var D=r=>{let[t,n,e]=r;return .2126*t+.7152*n+.0722*e},G=r=>{let t=n=>{let e=Math.max(0,Math.min(1,n)),o=e<=.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.055;return Math.max(0,Math.min(255,Math.round(o*255)))};return r.map(t)},_=r=>{let t=n=>n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92;return r.map(t)},it=r=>{let[t,n,e]=G(r);return t=t.toString(16).padStart(2,"0"),n=n.toString(16).padStart(2,"0"),e=e.toString(16).padStart(2,"0"),`#${t}${n}${e}`},f=r=>{let t=parseInt(r.slice(1,3),16)/255,n=parseInt(r.slice(3,5),16)/255,e=parseInt(r.slice(5,7),16)/255;return _([t,n,e])},T=r=>{let[t,n,e]=r,o=Math.sqrt(n*n+e*e),s=(Math.atan2(e,n)*180/Math.PI+360)%360,i=.1644,b=.0603,m=.1307,u=.006,h=i*Math.abs(Math.sin((s-90)/2*(Math.PI/180)))+b,a=0;return(s<=90||s>=270)&&(a=m*Math.abs(Math.cos(s*(Math.PI/180)))+u),t+(h+a)*o},ut=(r,t)=>{let[,n,e]=t,o=Math.sqrt(n*n+e*e),s=(Math.atan2(e,n)*180/Math.PI+360)%360,i=.1644,b=.0603,m=.1307,u=.006,h=i*Math.abs(Math.sin((s-90)/2*(Math.PI/180)))+b,a=0;return(s<=90||s>=270)&&(a=m*Math.abs(Math.cos(s*(Math.PI/180)))+u),Math.max(0,r-(h+a)*o)},bt=r=>{let[t,n,e]=r,o=e*Math.PI/180;return[t,n*Math.cos(o),n*Math.sin(o)]},x=r=>{let[t,n,e]=r,o=.4124564*t+.3575761*n+.1804375*e,c=.2126729*t+.7151522*n+.072175*e,s=.0193339*t+.119192*n+.9503041*e,i=.95047,b=1,m=1.08883,u=p=>p>.008856?Math.cbrt(p):7.787*p+16/116,h=u(o/i),a=u(c/b),l=u(s/m);return[116*a-16,500*(h-a),200*(a-l)]},lt=r=>{let[t,n,e]=r,o=(t+16)/116,c=n/500+o,s=o-e/200,i=p=>p**3>.008856?p**3:(p-16/116)/7.787,b=.95047,m=1,u=1.08883,h=i(c)*b,a=i(o)*m,l=i(s)*u;return[3.2404542*h-1.5371385*a-.4985314*l,-.969266*h+1.8760108*a+.041556*l,.0556434*h-.2040259*a+1.0572252*l]},q=r=>{let[t,n,e]=r,o=Math.sqrt(n*n+e*e);if(o<1e-4)return[t,0,0];let s=(Math.atan2(e,n)*180/Math.PI+360)%360;return s>=359.9999&&(s=0),[t,o,s]},A=(r,t)=>{let[n,e,o]=r,[c,s,i]=t,b=(n+c)/2,m=Math.sqrt(e*e+o*o),u=Math.sqrt(s*s+i*i),h=(m+u)/2,a=.5*(1-Math.sqrt(Math.pow(h,7)/(Math.pow(h,7)+Math.pow(25,7)))),l=e*(1+a),p=s*(1+a),M=Math.sqrt(l*l+o*o),d=Math.sqrt(p*p+i*i),S=(M+d)/2,C=Math.atan2(o,l)*180/Math.PI+(Math.atan2(o,l)<0?360:0),g=Math.atan2(i,p)*180/Math.PI+(Math.atan2(i,p)<0?360:0),E=g-C;Math.abs(E)>180&&(E+=g<=C?360:-360);let w=Math.abs(C-g)>180?(C+g+360)/2:(C+g)/2,V=1-.17*Math.cos((w-30)*Math.PI/180)+.24*Math.cos(2*w*Math.PI/180)+.32*Math.cos((3*w+6)*Math.PI/180)-.2*Math.cos((4*w-63)*Math.PI/180),tt=c-n,Y=d-M,B=2*Math.sqrt(M*d)*Math.sin(E/2*Math.PI/180),nt=1+.015*Math.pow(b-50,2)/Math.sqrt(20+Math.pow(b-50,2)),U=1+.045*S,$=1+.015*S*V,rt=30*Math.exp(-Math.pow((w-275)/25,2)),et=-(2*Math.sqrt(Math.pow(S,7)/(Math.pow(S,7)+Math.pow(25,7))))*Math.sin(2*rt*Math.PI/180);return Math.sqrt(Math.pow(tt/nt,2)+Math.pow(Y/U,2)+Math.pow(B/$,2)+et*(Y/U)*(B/$))},k=r=>{let t="",n=-1/0;for(let e of r){let o=x(f(e)),[,c]=q(o);c>n&&(n=c,t=e)}return t};function v(r){let t=[r[0]];for(let n=1;n<r.length;n++){let e=r[n]-r[n-1];e>180?e-=360:e<-180&&(e+=360),t.push(t[n-1]+e)}return t}function pt(r){let[t,n,e]=r;return[.152286*t+1.052583*n-.204868*e,.114503*t+.786281*n+.099216*e,-.003882*t-.048116*n+1.051998*e]}function Mt(r){let[t,n,e]=r;return[.367322*t+.860646*n-.227968*e,.280085*t+.672501*n+.047413*e,-.01182*t+.04294*n+.968881*e]}var gt=r=>{let t=r.match(/\d+(\.\d+)?/g);if(!t||t.length<3)throw new Error("Invalid CSS rgb()");let n=e=>{let o=e/255;return o<=.04045?o/12.92:Math.pow((o+.055)/1.055,2.4)};return[n(Number(t[0])),n(Number(t[1])),n(Number(t[2]))]};var R=(r,t)=>(Math.max(r,t)+.05)/(Math.min(r,t)+.05),L=(r,t)=>{let n=s=>s>5e-4?s:s+Math.pow(5e-4-s,.8),e=n(r),o=n(t),c=(Math.pow(e,.56)-Math.pow(o,.56))*100;return Math.abs(c)<.1?0:(c=c>0?c<1?0:c-.25:c>-1?0:c+.25,Math.round(c))};function j(r){let t=r.match(/^(wcag|apca)(\d+)$/);if(!t)throw new Error(`Invalid contrast: ${r}`);let n=t[1]==="wcag"?Number(t[2])/10:Number(t[2]);return{system:t[1],target:n}}var N=r=>{let t={},n=r.length,e=n-1;return H.forEach(o=>{let{system:c,target:s}=j(o),i=e,b=0;for(let m=1;m<n;m++){let u=1/0;for(let h=0;h<n-m;h++){let a=c==="wcag"?R(r[h].luminance,r[h+m].luminance):Math.max(Math.abs(L(r[h+m].luminance,r[h].luminance)),Math.abs(L(r[h].luminance,r[h+m].luminance)));a<u&&(u=a)}if(u>=s){i=m,b=u;break}m===e&&(b=u)}t[o]={system:c,efficiency:i/e,target:s,span:i,value:b,name:o}}),t},H=["wcag30","wcag45","wcag70","apca45","apca60","apca75"],X=r=>{let t={};return H.forEach(n=>{var m;let{target:e,system:o}=j(n),c=r.map(u=>u.contrasts[n]),s=((m=r[0])==null?void 0:m.shades.length)||0,i=Math.max(...c.map(u=>(u==null?void 0:u.span)||0)),b=c.reduce((u,h)=>u+((h==null?void 0:h.value)||0),0);t[n]={system:o,target:e,span:i,value:b/(r.length||1),name:n,efficiency:i/(s-1||1)}}),t};var F=r=>{let t=f(r),n=x(t),e=D(t),o=T(n),c=q(n);return{hex:r,rgb:t,lab:n,lch:c,lightness:o,chroma:c[1],hue:c[2],luminance:e,parameter:0,cumDeltaE00:0,cumProtDeltaE00:0,cumDeutDeltaE00:0,wcag:R(e,1),apca:L(e,1)}};var z=r=>{if(r.length<1)return m=>0;let t=[...r].sort((m,u)=>m[0]-u[0]),n=[];for(let m=0;m<t.length;m++)(m===0||t[m][0]!==t[m-1][0])&&n.push(t[m]);let e=n.length;if(e===1)return m=>n[0][1];let o=n.map(m=>m[0]),c=n.map(m=>m[1]),s=[],i=[];for(let m=0;m<e-1;m++)s[m]=o[m+1]-o[m],i[m]=(c[m+1]-c[m])/s[m];let b=new Array(e);b[0]=i[0],b[e-1]=i[e-2];for(let m=1;m<e-1;m++){let u=i[m-1],h=i[m];if(u*h<=0)b[m]=0;else{let a=(1+s[m]/(s[m-1]+s[m]))/3;b[m]=u*h/((1-a)*u+a*h)}}return m=>{if(m<=o[0])return c[0];if(m>=o[e-1])return c[e-1];let u=0,h=e-2,a=0;for(;u<=h;){let g=Math.floor((u+h)/2);if(m>=o[g]&&m<=o[g+1]){a=g;break}m<o[g]?h=g-1:u=g+1}let l=s[a],p=(m-o[a])/l,M=p*p,d=M*p,S=b[a]*l,C=b[a+1]*l;return(2*d-3*M+1)*c[a]+(d-2*M+p)*S+(-2*d+3*M)*c[a+1]+(d-M)*C}};function y(r){let t=r.length;if(t===0)return 0;let n=0;for(let e=0;e<t;e++)n+=r[e]*r[e];return Math.sqrt(n/t)}var ft=r=>{let t=r.length;if(t===0)return{min:0,max:0,avg:0};let n=r[0],e=r[0],o=0;for(let c=0;c<t;c++){let s=r[c];s<n&&(n=s),s>e&&(e=s),o+=s}return{min:n,max:e,avg:o/t}},I=r=>{let t=r.length;if(t===0)return 0;let n=1e-6,e=r.reduce((s,i)=>s*(i+n),1),o=Math.pow(e,1/t),c=Math.max(0,Math.min(1,o));return parseFloat((c*100).toFixed(2))};var O=(r,t,n)=>{t||(t="brand"),n||(n=[...Array(r.length).keys()]);let e=x(f(r[0]))[0],o=x(f(r[r.length-1]))[0];e>o&&r.reverse();let c=r.map(a=>F(a));for(let a=1;a<c.length;a++){let l=A(c[a-1].lab,c[a].lab);c[a].cumDeltaE00=c[a-1].cumDeltaE00+l}let s=k(r.slice(2,-2))||r[Math.floor(r.length/2)],i=r.findIndex(a=>a.toLowerCase()===(s==null?void 0:s.toLowerCase())),b=v(c.map(a=>a.hue).slice(1,-1));for(let a=1;a<c.length-1;a++)c[a].hue=b[a-1];let m=Z(c.map(a=>a.hue).slice(1,-1),c[i].hue),u=N(c),h={lightnessLinearity:W(c.map(a=>a.lightness)),chromaSmoothness:K(c.map(a=>a.chroma)),spacingUniformity:J(c.map(a=>a.cumDeltaE00)),contrastEfficiency:Q(u.wcag45.span,n.length),hueStability:m};return{name:t,colors:r,baseIndex:i,baseColor:s,shades:c,contrasts:u,metrics:h,score:I(Object.values(h))}},xt=r=>{let{stepNames:t,name:n,colors:e}=r,o=Object.values(e)[0],c=x(f(o[0]))[0],s=x(f(o[o.length-1]))[0],i=c>s?"darken":"lighten",b=[],m={};for(let h in e){let a=O(e[h],h,t);b.push(a),m[h]=a.baseColor}let u={contrastEfficiency:y(b.map(h=>h.metrics.contrastEfficiency)),lightnessLinearity:y(b.map(h=>h.metrics.lightnessLinearity)),chromaSmoothness:y(b.map(h=>h.metrics.chromaSmoothness)),hueStability:y(b.map(h=>h.metrics.hueStability)),spacingUniformity:y(b.map(h=>h.metrics.spacingUniformity))};return{name:n,baseColors:m,stepNames:t,direction:i,steps:t.length,colors:e,contrasts:X(b),scales:b,metrics:u,score:I(Object.values(u))}};function W(r){let t=r.length;if(t<2)return 1;let n=0,e=0,o=0,c=0;for(let a=0;a<t;a++)n+=a,e+=r[a],o+=a*r[a],c+=a*a;let s=t*c-n*n;if(Math.abs(s)<1e-10)return 1;let i=(t*o-n*e)/s,b=(e-i*n)/t;if(Math.abs(i*(t-1))<.001)return 1;let u=0,h=0;for(let a=0;a<t;a++){let l=i*a+b,p=r[a]-l;u+=p*p;let M=Math.max(l-Math.min(b,i*(t-1)+b),Math.max(b,i*(t-1)+b)-l);h+=M*M}return Math.max(0,Math.min(1,1-Math.sqrt(u/t)/Math.sqrt(h/t)))}function Z(r,t){let n=r.length;if(n<2)return 1;let e=0,o=0;for(let c=0;c<n;c++){let s=Math.abs(r[c]-t)%360;s>180&&(s=360-s),e+=s*s;let i=c/(n-1)*180;o+=i*i}return Math.max(0,Math.min(1,1-Math.sqrt(e/n)/(Math.sqrt(o/n)||1)))}var K=r=>{let t=r.length;if(t<3)return 1;let n=133.8,e=Math.max(...r);if(e<=.01)return 1;let o=r.map(h=>h/e*n),c=Math.min(...o),s=Math.max(...o),i=o.findIndex(h=>h===s),b=z([[0,o[0]],[i,s],[t-1,o[t-1]]]),m=0,u=0;for(let h=0;h<t;h++){let a=b(h),l=o[h]-a;m+=l*l,u+=Math.pow(Math.max(a-c,s-a),2)}return Math.max(0,Math.min(1,1-Math.sqrt(m/t)/Math.sqrt(u/t)))},J=r=>{let t=r.length;if(t<2)return 1;let n=[];for(let s=1;s<t;s++){let i=r[s]-r[s-1];if(i<0)return 0;n.push(i)}let e=n.reduce((s,i)=>s+i,0)/n.length;if(e<=1e-6)return 0;let o=0;for(let s of n)o+=Math.pow(s-e,2);let c=Math.sqrt(o/n.length)/e;return Math.max(0,Math.min(1,1/(1+c)))},Q=(r,t)=>{if(t<=1)return 1;let n=.5,e=r/t,o=n*((t-1)/t);return e<=o?1:e>=1?0:(1-e)/(1-o)};0&&(module.exports={analyzeMonochromatic,analyzeMonochromaticPalette,calcChromaSmoothness,calcContrastEfficiency,calcDeltaE2000,calcHueStability,calcLightnessLinearity,calcScore,calcSpacingUniformity,calcStatistics,contrastList,createMonotone,cssRgbToRgb,findMaxChromaHex,fromLightnessEAL,getApcaContrast,getMonochromaticContrasts,getPaletteContrasts,getRelativeLuminance,getWcagContrast,hexToRgb,labToLch,labToRgb,lchToLab,lrgbToSrgb,rgbToHex,rgbToLab,rootMeanSquare,simulateDeuteranopia,simulateProtanopia,srgbToLrgb,toLightnessEAL,unwrapHue});
|
package/dist/index.d.cts
CHANGED
|
@@ -12,12 +12,12 @@ declare const toLightnessEAL: (lab: number[]) => number;
|
|
|
12
12
|
declare const fromLightnessEAL: (brightness: number, lab: number[]) => number;
|
|
13
13
|
/** Convert LCH to CIELAB coordinates. */
|
|
14
14
|
declare const lchToLab: (lch: number[]) => number[];
|
|
15
|
-
/** Convert linear
|
|
15
|
+
/** Convert linear sRGB to CIELAB (D65) */
|
|
16
16
|
declare const rgbToLab: (rgb: number[]) => number[];
|
|
17
|
+
/** Convert CIELAB (D65) to linear sRGB */
|
|
18
|
+
declare const labToRgb: (lab: number[]) => number[];
|
|
17
19
|
/** Convert CIELAB to LCH coordinates. */
|
|
18
20
|
declare const labToLch: (lab: number[]) => number[];
|
|
19
|
-
/** Convert CIELAB (D50) to linear RGB. */
|
|
20
|
-
declare const labToRgb: (lab: number[]) => number[];
|
|
21
21
|
/** Calculate color difference using CIEDE2000 formula. */
|
|
22
22
|
declare const calcDeltaE2000: (lab1: number[], lab2: number[]) => number;
|
|
23
23
|
/** Find the Hex color with the highest Chroma in a list. */
|
package/dist/index.d.ts
CHANGED
|
@@ -12,12 +12,12 @@ declare const toLightnessEAL: (lab: number[]) => number;
|
|
|
12
12
|
declare const fromLightnessEAL: (brightness: number, lab: number[]) => number;
|
|
13
13
|
/** Convert LCH to CIELAB coordinates. */
|
|
14
14
|
declare const lchToLab: (lch: number[]) => number[];
|
|
15
|
-
/** Convert linear
|
|
15
|
+
/** Convert linear sRGB to CIELAB (D65) */
|
|
16
16
|
declare const rgbToLab: (rgb: number[]) => number[];
|
|
17
|
+
/** Convert CIELAB (D65) to linear sRGB */
|
|
18
|
+
declare const labToRgb: (lab: number[]) => number[];
|
|
17
19
|
/** Convert CIELAB to LCH coordinates. */
|
|
18
20
|
declare const labToLch: (lab: number[]) => number[];
|
|
19
|
-
/** Convert CIELAB (D50) to linear RGB. */
|
|
20
|
-
declare const labToRgb: (lab: number[]) => number[];
|
|
21
21
|
/** Calculate color difference using CIEDE2000 formula. */
|
|
22
22
|
declare const calcDeltaE2000: (lab1: number[], lab2: number[]) => number;
|
|
23
23
|
/** Find the Hex color with the highest Chroma in a list. */
|
package/dist/index.global.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var Chromametry=(()=>{var P=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var st=Object.prototype.hasOwnProperty;var ct=(r,t)=>{for(var n in t)P(r,n,{get:t[n],enumerable:!0})},mt=(r,t,n,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of at(t))!st.call(r,o)&&o!==n&&P(r,o,{get:()=>t[o],enumerable:!(e=ot(t,o))||e.enumerable});return r};var ht=r=>mt(P({},"__esModule",{value:!0}),r);var dt={};ct(dt,{analyzeMonochromatic:()=>F,analyzeMonochromaticPalette:()=>xt,calcChromaSmoothness:()=>J,calcContrastEfficiency:()=>V,calcDeltaE2000:()=>k,calcHueStability:()=>K,calcLightnessLinearity:()=>W,calcScore:()=>I,calcSpacingUniformity:()=>Q,calcStatistics:()=>ft,contrastList:()=>H,createMonotone:()=>B,cssRgbToRgb:()=>gt,findMaxChromaHex:()=>v,fromLightnessEAL:()=>ut,getApcaContrast:()=>L,getMonochromaticContrasts:()=>N,getPaletteContrasts:()=>z,getRelativeLuminance:()=>D,getWcagContrast:()=>R,hexToRgb:()=>f,labToLch:()=>q,labToRgb:()=>lt,lchToLab:()=>bt,lrgbToSrgb:()=>X,rgbToHex:()=>it,rgbToLab:()=>x,rootMeanSquare:()=>y,simulateDeuteranopia:()=>Mt,simulateProtanopia:()=>pt,srgbToLrgb:()=>Y,toLightnessEAL:()=>T,unwrapHue:()=>A});var D=r=>{let[t,n,e]=r;return .2126*t+.7152*n+.0722*e},X=r=>{let t=n=>{let e=Math.max(0,Math.min(1,n)),o=e<=.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.055;return Math.max(0,Math.min(255,Math.round(o*255)))};return r.map(t)},Y=r=>{let t=n=>n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92;return r.map(t)},it=r=>{let[t,n,e]=X(r);return t=t.toString(16).padStart(2,"0"),n=n.toString(16).padStart(2,"0"),e=e.toString(16).padStart(2,"0"),`#${t}${n}${e}`},f=r=>{let t=parseInt(r.slice(1,3),16)/255,n=parseInt(r.slice(3,5),16)/255,e=parseInt(r.slice(5,7),16)/255;return Y([t,n,e])},T=r=>{let[t,n,e]=r,o=Math.sqrt(n*n+e*e),c=(Math.atan2(e,n)*180/Math.PI+360)%360,i=.1644,b=.0603,a=.1307,u=.006,h=i*Math.abs(Math.sin((c-90)/2*(Math.PI/180)))+b,m=0;return(c<=90||c>=270)&&(m=a*Math.abs(Math.cos(c*(Math.PI/180)))+u),t+(h+m)*o},ut=(r,t)=>{let[,n,e]=t,o=Math.sqrt(n*n+e*e),c=(Math.atan2(e,n)*180/Math.PI+360)%360,i=.1644,b=.0603,a=.1307,u=.006,h=i*Math.abs(Math.sin((c-90)/2*(Math.PI/180)))+b,m=0;return(c<=90||c>=270)&&(m=a*Math.abs(Math.cos(c*(Math.PI/180)))+u),Math.max(0,r-(h+m)*o)},bt=r=>{let[t,n,e]=r,o=e*Math.PI/180;return[t,n*Math.cos(o),n*Math.sin(o)]},x=r=>{let[t,n,e]=r,o=[[1.0479298,.0229469,-.0501922],[.0296278,.9904345,-.0170738],[.0296278,.9904345,-.0170738]],s=.4124564*t+.3575761*n+.1804375*e,c=.2126729*t+.7151522*n+.072175*e,i=.0193339*t+.119192*n+.9503041*e,b=1.0479298*s+.0229469*c-.0501922*i,a=.0296278*s+.9904345*c-.0170738*i,u=-.009243*s+.0150552*c+.7518743*i,h=M=>M>.008856?Math.cbrt(M):7.787*M+16/116,m=h(b/.96422),l=h(a/1),p=h(u/.82521);return[116*l-16,500*(m-l),200*(l-p)]},q=r=>{let[t,n,e]=r,o=Math.sqrt(n*n+e*e);if(o<1e-4)return[t,0,0];let c=(Math.atan2(e,n)*180/Math.PI+360)%360;return c>=359.9999&&(c=0),[t,o,c]},lt=r=>{let[t,n,e]=r,o=(t+16)/116,s=n/500+o,c=o-e/200,i=p=>p>.2068965?p**3:(p-16/116)/7.787,b=i(s)*.96422,a=i(o)*1,u=i(c)*.82521,h=.9555766*b-.0230393*a+.0631636*u,m=-.0282895*b+1.0099416*a+.0210077*u,l=.0122982*b-.020483*a+1.3299098*u;return[3.2404542*h-1.5371385*m-.4985314*l,-.969266*h+1.8760108*m+.041556*l,.0556434*h-.2040259*m+1.0572252*l]},k=(r,t)=>{let[n,e,o]=r,[s,c,i]=t,b=(n+s)/2,a=Math.sqrt(e*e+o*o),u=Math.sqrt(c*c+i*i),h=(a+u)/2,m=.5*(1-Math.sqrt(Math.pow(h,7)/(Math.pow(h,7)+Math.pow(25,7)))),l=e*(1+m),p=c*(1+m),M=Math.sqrt(l*l+o*o),d=Math.sqrt(p*p+i*i),S=(M+d)/2,C=Math.atan2(o,l)*180/Math.PI+(Math.atan2(o,l)<0?360:0),g=Math.atan2(i,p)*180/Math.PI+(Math.atan2(i,p)<0?360:0),E=g-C;Math.abs(E)>180&&(E+=g<=C?360:-360);let w=Math.abs(C-g)>180?(C+g+360)/2:(C+g)/2,Z=1-.17*Math.cos((w-30)*Math.PI/180)+.24*Math.cos(2*w*Math.PI/180)+.32*Math.cos((3*w+6)*Math.PI/180)-.2*Math.cos((4*w-63)*Math.PI/180),tt=s-n,U=d-M,$=2*Math.sqrt(M*d)*Math.sin(E/2*Math.PI/180),nt=1+.015*Math.pow(b-50,2)/Math.sqrt(20+Math.pow(b-50,2)),G=1+.045*S,O=1+.015*S*Z,rt=30*Math.exp(-Math.pow((w-275)/25,2)),et=-(2*Math.sqrt(Math.pow(S,7)/(Math.pow(S,7)+Math.pow(25,7))))*Math.sin(2*rt*Math.PI/180);return Math.sqrt(Math.pow(tt/nt,2)+Math.pow(U/G,2)+Math.pow($/O,2)+et*(U/G)*($/O))},v=r=>{let t="",n=-1/0;for(let e of r){let o=x(f(e)),[,s]=q(o);s>n&&(n=s,t=e)}return t};function A(r){let t=[r[0]];for(let n=1;n<r.length;n++){let e=r[n]-r[n-1];e>180?e-=360:e<-180&&(e+=360),t.push(t[n-1]+e)}return t}function pt(r){let[t,n,e]=r;return[.152286*t+1.052583*n-.204868*e,.114503*t+.786281*n+.099216*e,-.003882*t-.048116*n+1.051998*e]}function Mt(r){let[t,n,e]=r;return[.367322*t+.860646*n-.227968*e,.280085*t+.672501*n+.047413*e,-.01182*t+.04294*n+.968881*e]}var gt=r=>{let t=r.match(/\d+(\.\d+)?/g);if(!t||t.length<3)throw new Error("Invalid CSS rgb()");let n=e=>{let o=e/255;return o<=.04045?o/12.92:Math.pow((o+.055)/1.055,2.4)};return[n(Number(t[0])),n(Number(t[1])),n(Number(t[2]))]};var R=(r,t)=>(Math.max(r,t)+.05)/(Math.min(r,t)+.05),L=(r,t)=>{let n=c=>c>5e-4?c:c+Math.pow(5e-4-c,.8),e=n(r),o=n(t),s=(Math.pow(e,.56)-Math.pow(o,.56))*100;return Math.abs(s)<.1?0:(s=s>0?s<1?0:s-.25:s>-1?0:s+.25,Math.round(s))};function _(r){let t=r.match(/^(wcag|apca)(\d+)$/);if(!t)throw new Error(`Invalid contrast: ${r}`);let n=t[1]==="wcag"?Number(t[2])/10:Number(t[2]);return{system:t[1],target:n}}var N=r=>{let t={},n=r.length,e=n-1;return H.forEach(o=>{let{system:s,target:c}=_(o),i=e,b=0;for(let a=1;a<n;a++){let u=1/0;for(let h=0;h<n-a;h++){let m=s==="wcag"?R(r[h].luminance,r[h+a].luminance):Math.max(Math.abs(L(r[h+a].luminance,r[h].luminance)),Math.abs(L(r[h].luminance,r[h+a].luminance)));m<u&&(u=m)}if(u>=c){i=a,b=u;break}a===e&&(b=u)}t[o]={system:s,efficiency:i/e,target:c,span:i,value:b,name:o}}),t},H=["wcag30","wcag45","wcag70","apca45","apca60","apca75"],z=r=>{let t={};return H.forEach(n=>{var a;let{target:e,system:o}=_(n),s=r.map(u=>u.contrasts[n]),c=((a=r[0])==null?void 0:a.shades.length)||0,i=Math.max(...s.map(u=>(u==null?void 0:u.span)||0)),b=s.reduce((u,h)=>u+((h==null?void 0:h.value)||0),0);t[n]={system:o,target:e,span:i,value:b/(r.length||1),name:n,efficiency:i/(c-1||1)}}),t};var j=r=>{let t=f(r),n=x(t),e=D(t),o=T(n),s=q(n);return{hex:r,rgb:t,lab:n,lch:s,lightness:o,chroma:s[1],hue:s[2],luminance:e,parameter:0,cumDeltaE00:0,cumProtDeltaE00:0,cumDeutDeltaE00:0,wcag:R(e,1),apca:L(e,1)}};var B=r=>{if(r.length<1)return a=>0;let t=[...r].sort((a,u)=>a[0]-u[0]),n=[];for(let a=0;a<t.length;a++)(a===0||t[a][0]!==t[a-1][0])&&n.push(t[a]);let e=n.length;if(e===1)return a=>n[0][1];let o=n.map(a=>a[0]),s=n.map(a=>a[1]),c=[],i=[];for(let a=0;a<e-1;a++)c[a]=o[a+1]-o[a],i[a]=(s[a+1]-s[a])/c[a];let b=new Array(e);b[0]=i[0],b[e-1]=i[e-2];for(let a=1;a<e-1;a++){let u=i[a-1],h=i[a];if(u*h<=0)b[a]=0;else{let m=(1+c[a]/(c[a-1]+c[a]))/3;b[a]=u*h/((1-m)*u+m*h)}}return a=>{if(a<=o[0])return s[0];if(a>=o[e-1])return s[e-1];let u=0,h=e-2,m=0;for(;u<=h;){let g=Math.floor((u+h)/2);if(a>=o[g]&&a<=o[g+1]){m=g;break}a<o[g]?h=g-1:u=g+1}let l=c[m],p=(a-o[m])/l,M=p*p,d=M*p,S=b[m]*l,C=b[m+1]*l;return(2*d-3*M+1)*s[m]+(d-2*M+p)*S+(-2*d+3*M)*s[m+1]+(d-M)*C}};function y(r){let t=r.length;if(t===0)return 0;let n=0;for(let e=0;e<t;e++)n+=r[e]*r[e];return Math.sqrt(n/t)}var ft=r=>{let t=r.length;if(t===0)return{min:0,max:0,avg:0};let n=r[0],e=r[0],o=0;for(let s=0;s<t;s++){let c=r[s];c<n&&(n=c),c>e&&(e=c),o+=c}return{min:n,max:e,avg:o/t}},I=r=>{let t=r.length;if(t===0)return 0;let n=1e-6,e=r.reduce((c,i)=>c*(i+n),1),o=Math.pow(e,1/t),s=Math.max(0,Math.min(1,o));return parseFloat((s*100).toFixed(2))};var F=(r,t,n)=>{t||(t="brand"),n||(n=[...Array(r.length).keys()]);let e=x(f(r[0]))[0],o=x(f(r[r.length-1]))[0];e>o&&r.reverse();let s=r.map(m=>j(m));for(let m=1;m<s.length;m++){let l=k(s[m-1].lab,s[m].lab);s[m].cumDeltaE00=s[m-1].cumDeltaE00+l}let c=v(r.slice(2,-2))||r[Math.floor(r.length/2)],i=r.findIndex(m=>m.toLowerCase()===(c==null?void 0:c.toLowerCase())),b=A(s.map(m=>m.hue).slice(1,-1));for(let m=1;m<s.length-1;m++)s[m].hue=b[m-1];let a=K(s.map(m=>m.hue).slice(1,-1),s[i].hue),u=N(s),h={lightnessLinearity:W(s.map(m=>m.lightness)),chromaSmoothness:J(s.map(m=>m.chroma)),spacingUniformity:Q(s.map(m=>m.cumDeltaE00)),contrastEfficiency:V(u.wcag45.span,n.length),hueStability:a};return{name:t,colors:r,baseIndex:i,baseColor:c,shades:s,contrasts:u,metrics:h,score:I(Object.values(h))}},xt=r=>{let{stepNames:t,name:n,colors:e}=r,o=Object.values(e)[0],s=x(f(o[0]))[0],c=x(f(o[o.length-1]))[0],i=s>c?"darken":"lighten",b=[],a={};for(let h in e){let m=F(e[h],h,t);b.push(m),a[h]=m.baseColor}let u={contrastEfficiency:y(b.map(h=>h.metrics.contrastEfficiency)),lightnessLinearity:y(b.map(h=>h.metrics.lightnessLinearity)),chromaSmoothness:y(b.map(h=>h.metrics.chromaSmoothness)),hueStability:y(b.map(h=>h.metrics.hueStability)),spacingUniformity:y(b.map(h=>h.metrics.spacingUniformity))};return{name:n,baseColors:a,stepNames:t,direction:i,steps:t.length,colors:e,contrasts:z(b),scales:b,metrics:u,score:I(Object.values(u))}};function W(r){let t=r.length;if(t<2)return 1;let n=0,e=0,o=0,s=0;for(let m=0;m<t;m++)n+=m,e+=r[m],o+=m*r[m],s+=m*m;let c=t*s-n*n;if(Math.abs(c)<1e-10)return 1;let i=(t*o-n*e)/c,b=(e-i*n)/t;if(Math.abs(i*(t-1))<.001)return 1;let u=0,h=0;for(let m=0;m<t;m++){let l=i*m+b,p=r[m]-l;u+=p*p;let M=Math.max(l-Math.min(b,i*(t-1)+b),Math.max(b,i*(t-1)+b)-l);h+=M*M}return Math.max(0,Math.min(1,1-Math.sqrt(u/t)/Math.sqrt(h/t)))}function K(r,t){let n=r.length;if(n<2)return 1;let e=0,o=0;for(let s=0;s<n;s++){let c=Math.abs(r[s]-t)%360;c>180&&(c=360-c),e+=c*c;let i=s/(n-1)*180;o+=i*i}return Math.max(0,Math.min(1,1-Math.sqrt(e/n)/(Math.sqrt(o/n)||1)))}var J=r=>{let t=r.length;if(t<3)return 1;let n=r.map(a=>a*133.8),e=Math.min(...n),o=Math.max(...n),s=n.findIndex(a=>a===o),c=B([[0,n[0]],[s,o],[t-1,n[t-1]]]),i=0,b=0;for(let a=0;a<t;a++){let u=c(a),h=n[a]-u;i+=h*h,b+=Math.pow(Math.max(u-e,o-u),2)}return Math.max(0,Math.min(1,1-Math.sqrt(i/t)/Math.sqrt(b/t)))},Q=r=>{let t=r.length;if(t<2)return 1;let n=[];for(let c=1;c<t;c++){let i=r[c]-r[c-1];if(i<0)return 0;n.push(i)}let e=n.reduce((c,i)=>c+i,0)/n.length;if(e<=1e-6)return 0;let o=0;for(let c of n)o+=Math.pow(c-e,2);let s=Math.sqrt(o/n.length)/e;return Math.max(0,Math.min(1,1/(1+s)))},V=(r,t)=>{if(t<=1)return 1;let n=.489,e=r/t,o=n*((t-1)/t);return e<=o?1:e>=1?0:(1-e)/(1-o)};return ht(dt);})();
|
|
1
|
+
"use strict";var Chromametry=(()=>{var P=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var st=Object.prototype.hasOwnProperty;var ct=(r,t)=>{for(var n in t)P(r,n,{get:t[n],enumerable:!0})},mt=(r,t,n,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of at(t))!st.call(r,o)&&o!==n&&P(r,o,{get:()=>t[o],enumerable:!(e=ot(t,o))||e.enumerable});return r};var ht=r=>mt(P({},"__esModule",{value:!0}),r);var dt={};ct(dt,{analyzeMonochromatic:()=>O,analyzeMonochromaticPalette:()=>xt,calcChromaSmoothness:()=>K,calcContrastEfficiency:()=>Q,calcDeltaE2000:()=>A,calcHueStability:()=>Z,calcLightnessLinearity:()=>W,calcScore:()=>I,calcSpacingUniformity:()=>J,calcStatistics:()=>ft,contrastList:()=>H,createMonotone:()=>z,cssRgbToRgb:()=>gt,findMaxChromaHex:()=>k,fromLightnessEAL:()=>ut,getApcaContrast:()=>L,getMonochromaticContrasts:()=>N,getPaletteContrasts:()=>X,getRelativeLuminance:()=>D,getWcagContrast:()=>R,hexToRgb:()=>f,labToLch:()=>q,labToRgb:()=>lt,lchToLab:()=>bt,lrgbToSrgb:()=>G,rgbToHex:()=>it,rgbToLab:()=>x,rootMeanSquare:()=>y,simulateDeuteranopia:()=>Mt,simulateProtanopia:()=>pt,srgbToLrgb:()=>_,toLightnessEAL:()=>T,unwrapHue:()=>v});var D=r=>{let[t,n,e]=r;return .2126*t+.7152*n+.0722*e},G=r=>{let t=n=>{let e=Math.max(0,Math.min(1,n)),o=e<=.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.055;return Math.max(0,Math.min(255,Math.round(o*255)))};return r.map(t)},_=r=>{let t=n=>n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92;return r.map(t)},it=r=>{let[t,n,e]=G(r);return t=t.toString(16).padStart(2,"0"),n=n.toString(16).padStart(2,"0"),e=e.toString(16).padStart(2,"0"),`#${t}${n}${e}`},f=r=>{let t=parseInt(r.slice(1,3),16)/255,n=parseInt(r.slice(3,5),16)/255,e=parseInt(r.slice(5,7),16)/255;return _([t,n,e])},T=r=>{let[t,n,e]=r,o=Math.sqrt(n*n+e*e),s=(Math.atan2(e,n)*180/Math.PI+360)%360,i=.1644,b=.0603,m=.1307,u=.006,h=i*Math.abs(Math.sin((s-90)/2*(Math.PI/180)))+b,a=0;return(s<=90||s>=270)&&(a=m*Math.abs(Math.cos(s*(Math.PI/180)))+u),t+(h+a)*o},ut=(r,t)=>{let[,n,e]=t,o=Math.sqrt(n*n+e*e),s=(Math.atan2(e,n)*180/Math.PI+360)%360,i=.1644,b=.0603,m=.1307,u=.006,h=i*Math.abs(Math.sin((s-90)/2*(Math.PI/180)))+b,a=0;return(s<=90||s>=270)&&(a=m*Math.abs(Math.cos(s*(Math.PI/180)))+u),Math.max(0,r-(h+a)*o)},bt=r=>{let[t,n,e]=r,o=e*Math.PI/180;return[t,n*Math.cos(o),n*Math.sin(o)]},x=r=>{let[t,n,e]=r,o=.4124564*t+.3575761*n+.1804375*e,c=.2126729*t+.7151522*n+.072175*e,s=.0193339*t+.119192*n+.9503041*e,i=.95047,b=1,m=1.08883,u=p=>p>.008856?Math.cbrt(p):7.787*p+16/116,h=u(o/i),a=u(c/b),l=u(s/m);return[116*a-16,500*(h-a),200*(a-l)]},lt=r=>{let[t,n,e]=r,o=(t+16)/116,c=n/500+o,s=o-e/200,i=p=>p**3>.008856?p**3:(p-16/116)/7.787,b=.95047,m=1,u=1.08883,h=i(c)*b,a=i(o)*m,l=i(s)*u;return[3.2404542*h-1.5371385*a-.4985314*l,-.969266*h+1.8760108*a+.041556*l,.0556434*h-.2040259*a+1.0572252*l]},q=r=>{let[t,n,e]=r,o=Math.sqrt(n*n+e*e);if(o<1e-4)return[t,0,0];let s=(Math.atan2(e,n)*180/Math.PI+360)%360;return s>=359.9999&&(s=0),[t,o,s]},A=(r,t)=>{let[n,e,o]=r,[c,s,i]=t,b=(n+c)/2,m=Math.sqrt(e*e+o*o),u=Math.sqrt(s*s+i*i),h=(m+u)/2,a=.5*(1-Math.sqrt(Math.pow(h,7)/(Math.pow(h,7)+Math.pow(25,7)))),l=e*(1+a),p=s*(1+a),M=Math.sqrt(l*l+o*o),d=Math.sqrt(p*p+i*i),S=(M+d)/2,C=Math.atan2(o,l)*180/Math.PI+(Math.atan2(o,l)<0?360:0),g=Math.atan2(i,p)*180/Math.PI+(Math.atan2(i,p)<0?360:0),E=g-C;Math.abs(E)>180&&(E+=g<=C?360:-360);let w=Math.abs(C-g)>180?(C+g+360)/2:(C+g)/2,V=1-.17*Math.cos((w-30)*Math.PI/180)+.24*Math.cos(2*w*Math.PI/180)+.32*Math.cos((3*w+6)*Math.PI/180)-.2*Math.cos((4*w-63)*Math.PI/180),tt=c-n,Y=d-M,B=2*Math.sqrt(M*d)*Math.sin(E/2*Math.PI/180),nt=1+.015*Math.pow(b-50,2)/Math.sqrt(20+Math.pow(b-50,2)),U=1+.045*S,$=1+.015*S*V,rt=30*Math.exp(-Math.pow((w-275)/25,2)),et=-(2*Math.sqrt(Math.pow(S,7)/(Math.pow(S,7)+Math.pow(25,7))))*Math.sin(2*rt*Math.PI/180);return Math.sqrt(Math.pow(tt/nt,2)+Math.pow(Y/U,2)+Math.pow(B/$,2)+et*(Y/U)*(B/$))},k=r=>{let t="",n=-1/0;for(let e of r){let o=x(f(e)),[,c]=q(o);c>n&&(n=c,t=e)}return t};function v(r){let t=[r[0]];for(let n=1;n<r.length;n++){let e=r[n]-r[n-1];e>180?e-=360:e<-180&&(e+=360),t.push(t[n-1]+e)}return t}function pt(r){let[t,n,e]=r;return[.152286*t+1.052583*n-.204868*e,.114503*t+.786281*n+.099216*e,-.003882*t-.048116*n+1.051998*e]}function Mt(r){let[t,n,e]=r;return[.367322*t+.860646*n-.227968*e,.280085*t+.672501*n+.047413*e,-.01182*t+.04294*n+.968881*e]}var gt=r=>{let t=r.match(/\d+(\.\d+)?/g);if(!t||t.length<3)throw new Error("Invalid CSS rgb()");let n=e=>{let o=e/255;return o<=.04045?o/12.92:Math.pow((o+.055)/1.055,2.4)};return[n(Number(t[0])),n(Number(t[1])),n(Number(t[2]))]};var R=(r,t)=>(Math.max(r,t)+.05)/(Math.min(r,t)+.05),L=(r,t)=>{let n=s=>s>5e-4?s:s+Math.pow(5e-4-s,.8),e=n(r),o=n(t),c=(Math.pow(e,.56)-Math.pow(o,.56))*100;return Math.abs(c)<.1?0:(c=c>0?c<1?0:c-.25:c>-1?0:c+.25,Math.round(c))};function j(r){let t=r.match(/^(wcag|apca)(\d+)$/);if(!t)throw new Error(`Invalid contrast: ${r}`);let n=t[1]==="wcag"?Number(t[2])/10:Number(t[2]);return{system:t[1],target:n}}var N=r=>{let t={},n=r.length,e=n-1;return H.forEach(o=>{let{system:c,target:s}=j(o),i=e,b=0;for(let m=1;m<n;m++){let u=1/0;for(let h=0;h<n-m;h++){let a=c==="wcag"?R(r[h].luminance,r[h+m].luminance):Math.max(Math.abs(L(r[h+m].luminance,r[h].luminance)),Math.abs(L(r[h].luminance,r[h+m].luminance)));a<u&&(u=a)}if(u>=s){i=m,b=u;break}m===e&&(b=u)}t[o]={system:c,efficiency:i/e,target:s,span:i,value:b,name:o}}),t},H=["wcag30","wcag45","wcag70","apca45","apca60","apca75"],X=r=>{let t={};return H.forEach(n=>{var m;let{target:e,system:o}=j(n),c=r.map(u=>u.contrasts[n]),s=((m=r[0])==null?void 0:m.shades.length)||0,i=Math.max(...c.map(u=>(u==null?void 0:u.span)||0)),b=c.reduce((u,h)=>u+((h==null?void 0:h.value)||0),0);t[n]={system:o,target:e,span:i,value:b/(r.length||1),name:n,efficiency:i/(s-1||1)}}),t};var F=r=>{let t=f(r),n=x(t),e=D(t),o=T(n),c=q(n);return{hex:r,rgb:t,lab:n,lch:c,lightness:o,chroma:c[1],hue:c[2],luminance:e,parameter:0,cumDeltaE00:0,cumProtDeltaE00:0,cumDeutDeltaE00:0,wcag:R(e,1),apca:L(e,1)}};var z=r=>{if(r.length<1)return m=>0;let t=[...r].sort((m,u)=>m[0]-u[0]),n=[];for(let m=0;m<t.length;m++)(m===0||t[m][0]!==t[m-1][0])&&n.push(t[m]);let e=n.length;if(e===1)return m=>n[0][1];let o=n.map(m=>m[0]),c=n.map(m=>m[1]),s=[],i=[];for(let m=0;m<e-1;m++)s[m]=o[m+1]-o[m],i[m]=(c[m+1]-c[m])/s[m];let b=new Array(e);b[0]=i[0],b[e-1]=i[e-2];for(let m=1;m<e-1;m++){let u=i[m-1],h=i[m];if(u*h<=0)b[m]=0;else{let a=(1+s[m]/(s[m-1]+s[m]))/3;b[m]=u*h/((1-a)*u+a*h)}}return m=>{if(m<=o[0])return c[0];if(m>=o[e-1])return c[e-1];let u=0,h=e-2,a=0;for(;u<=h;){let g=Math.floor((u+h)/2);if(m>=o[g]&&m<=o[g+1]){a=g;break}m<o[g]?h=g-1:u=g+1}let l=s[a],p=(m-o[a])/l,M=p*p,d=M*p,S=b[a]*l,C=b[a+1]*l;return(2*d-3*M+1)*c[a]+(d-2*M+p)*S+(-2*d+3*M)*c[a+1]+(d-M)*C}};function y(r){let t=r.length;if(t===0)return 0;let n=0;for(let e=0;e<t;e++)n+=r[e]*r[e];return Math.sqrt(n/t)}var ft=r=>{let t=r.length;if(t===0)return{min:0,max:0,avg:0};let n=r[0],e=r[0],o=0;for(let c=0;c<t;c++){let s=r[c];s<n&&(n=s),s>e&&(e=s),o+=s}return{min:n,max:e,avg:o/t}},I=r=>{let t=r.length;if(t===0)return 0;let n=1e-6,e=r.reduce((s,i)=>s*(i+n),1),o=Math.pow(e,1/t),c=Math.max(0,Math.min(1,o));return parseFloat((c*100).toFixed(2))};var O=(r,t,n)=>{t||(t="brand"),n||(n=[...Array(r.length).keys()]);let e=x(f(r[0]))[0],o=x(f(r[r.length-1]))[0];e>o&&r.reverse();let c=r.map(a=>F(a));for(let a=1;a<c.length;a++){let l=A(c[a-1].lab,c[a].lab);c[a].cumDeltaE00=c[a-1].cumDeltaE00+l}let s=k(r.slice(2,-2))||r[Math.floor(r.length/2)],i=r.findIndex(a=>a.toLowerCase()===(s==null?void 0:s.toLowerCase())),b=v(c.map(a=>a.hue).slice(1,-1));for(let a=1;a<c.length-1;a++)c[a].hue=b[a-1];let m=Z(c.map(a=>a.hue).slice(1,-1),c[i].hue),u=N(c),h={lightnessLinearity:W(c.map(a=>a.lightness)),chromaSmoothness:K(c.map(a=>a.chroma)),spacingUniformity:J(c.map(a=>a.cumDeltaE00)),contrastEfficiency:Q(u.wcag45.span,n.length),hueStability:m};return{name:t,colors:r,baseIndex:i,baseColor:s,shades:c,contrasts:u,metrics:h,score:I(Object.values(h))}},xt=r=>{let{stepNames:t,name:n,colors:e}=r,o=Object.values(e)[0],c=x(f(o[0]))[0],s=x(f(o[o.length-1]))[0],i=c>s?"darken":"lighten",b=[],m={};for(let h in e){let a=O(e[h],h,t);b.push(a),m[h]=a.baseColor}let u={contrastEfficiency:y(b.map(h=>h.metrics.contrastEfficiency)),lightnessLinearity:y(b.map(h=>h.metrics.lightnessLinearity)),chromaSmoothness:y(b.map(h=>h.metrics.chromaSmoothness)),hueStability:y(b.map(h=>h.metrics.hueStability)),spacingUniformity:y(b.map(h=>h.metrics.spacingUniformity))};return{name:n,baseColors:m,stepNames:t,direction:i,steps:t.length,colors:e,contrasts:X(b),scales:b,metrics:u,score:I(Object.values(u))}};function W(r){let t=r.length;if(t<2)return 1;let n=0,e=0,o=0,c=0;for(let a=0;a<t;a++)n+=a,e+=r[a],o+=a*r[a],c+=a*a;let s=t*c-n*n;if(Math.abs(s)<1e-10)return 1;let i=(t*o-n*e)/s,b=(e-i*n)/t;if(Math.abs(i*(t-1))<.001)return 1;let u=0,h=0;for(let a=0;a<t;a++){let l=i*a+b,p=r[a]-l;u+=p*p;let M=Math.max(l-Math.min(b,i*(t-1)+b),Math.max(b,i*(t-1)+b)-l);h+=M*M}return Math.max(0,Math.min(1,1-Math.sqrt(u/t)/Math.sqrt(h/t)))}function Z(r,t){let n=r.length;if(n<2)return 1;let e=0,o=0;for(let c=0;c<n;c++){let s=Math.abs(r[c]-t)%360;s>180&&(s=360-s),e+=s*s;let i=c/(n-1)*180;o+=i*i}return Math.max(0,Math.min(1,1-Math.sqrt(e/n)/(Math.sqrt(o/n)||1)))}var K=r=>{let t=r.length;if(t<3)return 1;let n=133.8,e=Math.max(...r);if(e<=.01)return 1;let o=r.map(h=>h/e*n),c=Math.min(...o),s=Math.max(...o),i=o.findIndex(h=>h===s),b=z([[0,o[0]],[i,s],[t-1,o[t-1]]]),m=0,u=0;for(let h=0;h<t;h++){let a=b(h),l=o[h]-a;m+=l*l,u+=Math.pow(Math.max(a-c,s-a),2)}return Math.max(0,Math.min(1,1-Math.sqrt(m/t)/Math.sqrt(u/t)))},J=r=>{let t=r.length;if(t<2)return 1;let n=[];for(let s=1;s<t;s++){let i=r[s]-r[s-1];if(i<0)return 0;n.push(i)}let e=n.reduce((s,i)=>s+i,0)/n.length;if(e<=1e-6)return 0;let o=0;for(let s of n)o+=Math.pow(s-e,2);let c=Math.sqrt(o/n.length)/e;return Math.max(0,Math.min(1,1/(1+c)))},Q=(r,t)=>{if(t<=1)return 1;let n=.5,e=r/t,o=n*((t-1)/t);return e<=o?1:e>=1?0:(1-e)/(1-o)};return ht(dt);})();
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var k=e=>{let[t,n,r]=e;return .2126*t+.7152*n+.0722*r},Z=e=>{let t=n=>{let r=Math.max(0,Math.min(1,n)),o=r<=.0031308?12.92*r:1.055*Math.pow(r,1/2.4)-.055;return Math.max(0,Math.min(255,Math.round(o*255)))};return e.map(t)},K=e=>{let t=n=>n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92;return e.map(t)},ot=e=>{let[t,n,r]=Z(e);return t=t.toString(16).padStart(2,"0"),n=n.toString(16).padStart(2,"0"),r=r.toString(16).padStart(2,"0"),`#${t}${n}${r}`},x=e=>{let t=parseInt(e.slice(1,3),16)/255,n=parseInt(e.slice(3,5),16)/255,r=parseInt(e.slice(5,7),16)/255;return K([t,n,r])},v=e=>{let[t,n,r]=e,o=Math.sqrt(n*n+r*r),s=(Math.atan2(r,n)*180/Math.PI+360)%360,i=.1644,b=.0603,m=.1307,u=.006,h=i*Math.abs(Math.sin((s-90)/2*(Math.PI/180)))+b,a=0;return(s<=90||s>=270)&&(a=m*Math.abs(Math.cos(s*(Math.PI/180)))+u),t+(h+a)*o},at=(e,t)=>{let[,n,r]=t,o=Math.sqrt(n*n+r*r),s=(Math.atan2(r,n)*180/Math.PI+360)%360,i=.1644,b=.0603,m=.1307,u=.006,h=i*Math.abs(Math.sin((s-90)/2*(Math.PI/180)))+b,a=0;return(s<=90||s>=270)&&(a=m*Math.abs(Math.cos(s*(Math.PI/180)))+u),Math.max(0,e-(h+a)*o)},st=e=>{let[t,n,r]=e,o=r*Math.PI/180;return[t,n*Math.cos(o),n*Math.sin(o)]},d=e=>{let[t,n,r]=e,o=.4124564*t+.3575761*n+.1804375*r,c=.2126729*t+.7151522*n+.072175*r,s=.0193339*t+.119192*n+.9503041*r,i=.95047,b=1,m=1.08883,u=p=>p>.008856?Math.cbrt(p):7.787*p+16/116,h=u(o/i),a=u(c/b),l=u(s/m);return[116*a-16,500*(h-a),200*(a-l)]},ct=e=>{let[t,n,r]=e,o=(t+16)/116,c=n/500+o,s=o-r/200,i=p=>p**3>.008856?p**3:(p-16/116)/7.787,b=.95047,m=1,u=1.08883,h=i(c)*b,a=i(o)*m,l=i(s)*u;return[3.2404542*h-1.5371385*a-.4985314*l,-.969266*h+1.8760108*a+.041556*l,.0556434*h-.2040259*a+1.0572252*l]},R=e=>{let[t,n,r]=e,o=Math.sqrt(n*n+r*r);if(o<1e-4)return[t,0,0];let s=(Math.atan2(r,n)*180/Math.PI+360)%360;return s>=359.9999&&(s=0),[t,o,s]},N=(e,t)=>{let[n,r,o]=e,[c,s,i]=t,b=(n+c)/2,m=Math.sqrt(r*r+o*o),u=Math.sqrt(s*s+i*i),h=(m+u)/2,a=.5*(1-Math.sqrt(Math.pow(h,7)/(Math.pow(h,7)+Math.pow(25,7)))),l=r*(1+a),p=s*(1+a),M=Math.sqrt(l*l+o*o),f=Math.sqrt(p*p+i*i),y=(M+f)/2,C=Math.atan2(o,l)*180/Math.PI+(Math.atan2(o,l)<0?360:0),g=Math.atan2(i,p)*180/Math.PI+(Math.atan2(i,p)<0?360:0),q=g-C;Math.abs(q)>180&&(q+=g<=C?360:-360);let w=Math.abs(C-g)>180?(C+g+360)/2:(C+g)/2,_=1-.17*Math.cos((w-30)*Math.PI/180)+.24*Math.cos(2*w*Math.PI/180)+.32*Math.cos((3*w+6)*Math.PI/180)-.2*Math.cos((4*w-63)*Math.PI/180),j=c-n,P=f-M,D=2*Math.sqrt(M*f)*Math.sin(q/2*Math.PI/180),F=1+.015*Math.pow(b-50,2)/Math.sqrt(20+Math.pow(b-50,2)),T=1+.045*y,A=1+.015*y*_,O=30*Math.exp(-Math.pow((w-275)/25,2)),W=-(2*Math.sqrt(Math.pow(y,7)/(Math.pow(y,7)+Math.pow(25,7))))*Math.sin(2*O*Math.PI/180);return Math.sqrt(Math.pow(j/F,2)+Math.pow(P/T,2)+Math.pow(D/A,2)+W*(P/T)*(D/A))},H=e=>{let t="",n=-1/0;for(let r of e){let o=d(x(r)),[,c]=R(o);c>n&&(n=c,t=r)}return t};function X(e){let t=[e[0]];for(let n=1;n<e.length;n++){let r=e[n]-e[n-1];r>180?r-=360:r<-180&&(r+=360),t.push(t[n-1]+r)}return t}function mt(e){let[t,n,r]=e;return[.152286*t+1.052583*n-.204868*r,.114503*t+.786281*n+.099216*r,-.003882*t-.048116*n+1.051998*r]}function ht(e){let[t,n,r]=e;return[.367322*t+.860646*n-.227968*r,.280085*t+.672501*n+.047413*r,-.01182*t+.04294*n+.968881*r]}var it=e=>{let t=e.match(/\d+(\.\d+)?/g);if(!t||t.length<3)throw new Error("Invalid CSS rgb()");let n=r=>{let o=r/255;return o<=.04045?o/12.92:Math.pow((o+.055)/1.055,2.4)};return[n(Number(t[0])),n(Number(t[1])),n(Number(t[2]))]};var I=(e,t)=>(Math.max(e,t)+.05)/(Math.min(e,t)+.05),L=(e,t)=>{let n=s=>s>5e-4?s:s+Math.pow(5e-4-s,.8),r=n(e),o=n(t),c=(Math.pow(r,.56)-Math.pow(o,.56))*100;return Math.abs(c)<.1?0:(c=c>0?c<1?0:c-.25:c>-1?0:c+.25,Math.round(c))};function z(e){let t=e.match(/^(wcag|apca)(\d+)$/);if(!t)throw new Error(`Invalid contrast: ${e}`);let n=t[1]==="wcag"?Number(t[2])/10:Number(t[2]);return{system:t[1],target:n}}var Y=e=>{let t={},n=e.length,r=n-1;return B.forEach(o=>{let{system:c,target:s}=z(o),i=r,b=0;for(let m=1;m<n;m++){let u=1/0;for(let h=0;h<n-m;h++){let a=c==="wcag"?I(e[h].luminance,e[h+m].luminance):Math.max(Math.abs(L(e[h+m].luminance,e[h].luminance)),Math.abs(L(e[h].luminance,e[h+m].luminance)));a<u&&(u=a)}if(u>=s){i=m,b=u;break}m===r&&(b=u)}t[o]={system:c,efficiency:i/r,target:s,span:i,value:b,name:o}}),t},B=["wcag30","wcag45","wcag70","apca45","apca60","apca75"],U=e=>{let t={};return B.forEach(n=>{var m;let{target:r,system:o}=z(n),c=e.map(u=>u.contrasts[n]),s=((m=e[0])==null?void 0:m.shades.length)||0,i=Math.max(...c.map(u=>(u==null?void 0:u.span)||0)),b=c.reduce((u,h)=>u+((h==null?void 0:h.value)||0),0);t[n]={system:o,target:r,span:i,value:b/(e.length||1),name:n,efficiency:i/(s-1||1)}}),t};var $=e=>{let t=x(e),n=d(t),r=k(t),o=v(n),c=R(n);return{hex:e,rgb:t,lab:n,lch:c,lightness:o,chroma:c[1],hue:c[2],luminance:r,parameter:0,cumDeltaE00:0,cumProtDeltaE00:0,cumDeutDeltaE00:0,wcag:I(r,1),apca:L(r,1)}};var G=e=>{if(e.length<1)return m=>0;let t=[...e].sort((m,u)=>m[0]-u[0]),n=[];for(let m=0;m<t.length;m++)(m===0||t[m][0]!==t[m-1][0])&&n.push(t[m]);let r=n.length;if(r===1)return m=>n[0][1];let o=n.map(m=>m[0]),c=n.map(m=>m[1]),s=[],i=[];for(let m=0;m<r-1;m++)s[m]=o[m+1]-o[m],i[m]=(c[m+1]-c[m])/s[m];let b=new Array(r);b[0]=i[0],b[r-1]=i[r-2];for(let m=1;m<r-1;m++){let u=i[m-1],h=i[m];if(u*h<=0)b[m]=0;else{let a=(1+s[m]/(s[m-1]+s[m]))/3;b[m]=u*h/((1-a)*u+a*h)}}return m=>{if(m<=o[0])return c[0];if(m>=o[r-1])return c[r-1];let u=0,h=r-2,a=0;for(;u<=h;){let g=Math.floor((u+h)/2);if(m>=o[g]&&m<=o[g+1]){a=g;break}m<o[g]?h=g-1:u=g+1}let l=s[a],p=(m-o[a])/l,M=p*p,f=M*p,y=b[a]*l,C=b[a+1]*l;return(2*f-3*M+1)*c[a]+(f-2*M+p)*y+(-2*f+3*M)*c[a+1]+(f-M)*C}};function S(e){let t=e.length;if(t===0)return 0;let n=0;for(let r=0;r<t;r++)n+=e[r]*e[r];return Math.sqrt(n/t)}var gt=e=>{let t=e.length;if(t===0)return{min:0,max:0,avg:0};let n=e[0],r=e[0],o=0;for(let c=0;c<t;c++){let s=e[c];s<n&&(n=s),s>r&&(r=s),o+=s}return{min:n,max:r,avg:o/t}},E=e=>{let t=e.length;if(t===0)return 0;let n=1e-6,r=e.reduce((s,i)=>s*(i+n),1),o=Math.pow(r,1/t),c=Math.max(0,Math.min(1,o));return parseFloat((c*100).toFixed(2))};var J=(e,t,n)=>{t||(t="brand"),n||(n=[...Array(e.length).keys()]);let r=d(x(e[0]))[0],o=d(x(e[e.length-1]))[0];r>o&&e.reverse();let c=e.map(a=>$(a));for(let a=1;a<c.length;a++){let l=N(c[a-1].lab,c[a].lab);c[a].cumDeltaE00=c[a-1].cumDeltaE00+l}let s=H(e.slice(2,-2))||e[Math.floor(e.length/2)],i=e.findIndex(a=>a.toLowerCase()===(s==null?void 0:s.toLowerCase())),b=X(c.map(a=>a.hue).slice(1,-1));for(let a=1;a<c.length-1;a++)c[a].hue=b[a-1];let m=V(c.map(a=>a.hue).slice(1,-1),c[i].hue),u=Y(c),h={lightnessLinearity:Q(c.map(a=>a.lightness)),chromaSmoothness:tt(c.map(a=>a.chroma)),spacingUniformity:nt(c.map(a=>a.cumDeltaE00)),contrastEfficiency:rt(u.wcag45.span,n.length),hueStability:m};return{name:t,colors:e,baseIndex:i,baseColor:s,shades:c,contrasts:u,metrics:h,score:E(Object.values(h))}},Et=e=>{let{stepNames:t,name:n,colors:r}=e,o=Object.values(r)[0],c=d(x(o[0]))[0],s=d(x(o[o.length-1]))[0],i=c>s?"darken":"lighten",b=[],m={};for(let h in r){let a=J(r[h],h,t);b.push(a),m[h]=a.baseColor}let u={contrastEfficiency:S(b.map(h=>h.metrics.contrastEfficiency)),lightnessLinearity:S(b.map(h=>h.metrics.lightnessLinearity)),chromaSmoothness:S(b.map(h=>h.metrics.chromaSmoothness)),hueStability:S(b.map(h=>h.metrics.hueStability)),spacingUniformity:S(b.map(h=>h.metrics.spacingUniformity))};return{name:n,baseColors:m,stepNames:t,direction:i,steps:t.length,colors:r,contrasts:U(b),scales:b,metrics:u,score:E(Object.values(u))}};function Q(e){let t=e.length;if(t<2)return 1;let n=0,r=0,o=0,c=0;for(let a=0;a<t;a++)n+=a,r+=e[a],o+=a*e[a],c+=a*a;let s=t*c-n*n;if(Math.abs(s)<1e-10)return 1;let i=(t*o-n*r)/s,b=(r-i*n)/t;if(Math.abs(i*(t-1))<.001)return 1;let u=0,h=0;for(let a=0;a<t;a++){let l=i*a+b,p=e[a]-l;u+=p*p;let M=Math.max(l-Math.min(b,i*(t-1)+b),Math.max(b,i*(t-1)+b)-l);h+=M*M}return Math.max(0,Math.min(1,1-Math.sqrt(u/t)/Math.sqrt(h/t)))}function V(e,t){let n=e.length;if(n<2)return 1;let r=0,o=0;for(let c=0;c<n;c++){let s=Math.abs(e[c]-t)%360;s>180&&(s=360-s),r+=s*s;let i=c/(n-1)*180;o+=i*i}return Math.max(0,Math.min(1,1-Math.sqrt(r/n)/(Math.sqrt(o/n)||1)))}var tt=e=>{let t=e.length;if(t<3)return 1;let n=133.8,r=Math.max(...e);if(r<=.01)return 1;let o=e.map(h=>h/r*n),c=Math.min(...o),s=Math.max(...o),i=o.findIndex(h=>h===s),b=G([[0,o[0]],[i,s],[t-1,o[t-1]]]),m=0,u=0;for(let h=0;h<t;h++){let a=b(h),l=o[h]-a;m+=l*l,u+=Math.pow(Math.max(a-c,s-a),2)}return Math.max(0,Math.min(1,1-Math.sqrt(m/t)/Math.sqrt(u/t)))},nt=e=>{let t=e.length;if(t<2)return 1;let n=[];for(let s=1;s<t;s++){let i=e[s]-e[s-1];if(i<0)return 0;n.push(i)}let r=n.reduce((s,i)=>s+i,0)/n.length;if(r<=1e-6)return 0;let o=0;for(let s of n)o+=Math.pow(s-r,2);let c=Math.sqrt(o/n.length)/r;return Math.max(0,Math.min(1,1/(1+c)))},rt=(e,t)=>{if(t<=1)return 1;let n=.5,r=e/t,o=n*((t-1)/t);return r<=o?1:r>=1?0:(1-r)/(1-o)};export{J as analyzeMonochromatic,Et as analyzeMonochromaticPalette,tt as calcChromaSmoothness,rt as calcContrastEfficiency,N as calcDeltaE2000,V as calcHueStability,Q as calcLightnessLinearity,E as calcScore,nt as calcSpacingUniformity,gt as calcStatistics,B as contrastList,G as createMonotone,it as cssRgbToRgb,H as findMaxChromaHex,at as fromLightnessEAL,L as getApcaContrast,Y as getMonochromaticContrasts,U as getPaletteContrasts,k as getRelativeLuminance,I as getWcagContrast,x as hexToRgb,R as labToLch,ct as labToRgb,st as lchToLab,Z as lrgbToSrgb,ot as rgbToHex,d as rgbToLab,S as rootMeanSquare,ht as simulateDeuteranopia,mt as simulateProtanopia,K as srgbToLrgb,v as toLightnessEAL,X as unwrapHue};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chromametry",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Web-accessible Color Palette Metrics",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"@atlaskit/tokens": "^10.0.1",
|
|
30
30
|
"@material/material-color-utilities": "^0.3.0",
|
|
31
31
|
"@types/node": "^25.2.0",
|
|
32
|
-
"
|
|
32
|
+
"chartjs-node-canvas": "^5.0.0",
|
|
33
33
|
"tsup": "^8.5.0",
|
|
34
34
|
"tsx": "^4.21.0",
|
|
35
35
|
"typescript": "^5.8.3",
|
|
@@ -41,4 +41,4 @@
|
|
|
41
41
|
"dist",
|
|
42
42
|
"README.md"
|
|
43
43
|
]
|
|
44
|
-
}
|
|
44
|
+
}
|