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 CHANGED
@@ -2,7 +2,7 @@
2
2
  > A metrics framework for evaluating web-accessible sequential color palettes.
3
3
 
4
4
 
5
- ![Web-accessible Palette Ranking](benchmarks/monochromatic/assets/web-accessible-palette-ranking.png)
5
+ ![Web-accessible Palette Ranking](paper/figures/web-accessible-palette-ranking.png)
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/chromametry.git)
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
- ![IBM Carbon Color Palette](benchmarks/monochromatic/assets/ibm-carbon-color-palette.png)
46
- *Figure 2. IBM Carbon Color Palette.*
45
+ ![Adobe Spectrum Color Palette](paper/figures/adobe-spectrum-color-palette.png)
46
+ *Figure 2. Adobe Spectrum Color Palette.*
47
47
 
48
- ![IBM Carbon Palette Metrics](benchmarks/monochromatic/assets/ibm-carbon-palette-metrics.png)
49
- *Figure 3. IBM Carbon Palette Metrics.*
48
+ ![IBM Carbon Palette Metrics](paper/figures/adobe-spectrum-palette-metrics.png)
49
+ *Figure 3. Adobe Spectrum Palette Metrics.*
50
50
 
51
-
52
- ![IBM Carbon Palette Charts](benchmarks/monochromatic/assets/ibm-carbon-palette-charts.png)
53
- *Figure 4. IBM Carbon Palette Charts.*
51
+ ![IBM Carbon Palette Charts](paper/figures/adobe-spectrum-palette-charts.png)
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 RGB to CIELAB (D50). */
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 RGB to CIELAB (D50). */
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. */
@@ -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 v=e=>{let[n,t,r]=e;return .2126*n+.7152*t+.0722*r},K=e=>{let n=t=>{let r=Math.max(0,Math.min(1,t)),s=r<=.0031308?12.92*r:1.055*Math.pow(r,1/2.4)-.055;return Math.max(0,Math.min(255,Math.round(s*255)))};return e.map(n)},J=e=>{let n=t=>t>.04045?Math.pow((t+.055)/1.055,2.4):t/12.92;return e.map(n)},ot=e=>{let[n,t,r]=K(e);return n=n.toString(16).padStart(2,"0"),t=t.toString(16).padStart(2,"0"),r=r.toString(16).padStart(2,"0"),`#${n}${t}${r}`},x=e=>{let n=parseInt(e.slice(1,3),16)/255,t=parseInt(e.slice(3,5),16)/255,r=parseInt(e.slice(5,7),16)/255;return J([n,t,r])},A=e=>{let[n,t,r]=e,s=Math.sqrt(t*t+r*r),c=(Math.atan2(r,t)*180/Math.PI+360)%360,i=.1644,b=.0603,o=.1307,u=.006,h=i*Math.abs(Math.sin((c-90)/2*(Math.PI/180)))+b,m=0;return(c<=90||c>=270)&&(m=o*Math.abs(Math.cos(c*(Math.PI/180)))+u),n+(h+m)*s},at=(e,n)=>{let[,t,r]=n,s=Math.sqrt(t*t+r*r),c=(Math.atan2(r,t)*180/Math.PI+360)%360,i=.1644,b=.0603,o=.1307,u=.006,h=i*Math.abs(Math.sin((c-90)/2*(Math.PI/180)))+b,m=0;return(c<=90||c>=270)&&(m=o*Math.abs(Math.cos(c*(Math.PI/180)))+u),Math.max(0,e-(h+m)*s)},st=e=>{let[n,t,r]=e,s=r*Math.PI/180;return[n,t*Math.cos(s),t*Math.sin(s)]},d=e=>{let[n,t,r]=e,s=[[1.0479298,.0229469,-.0501922],[.0296278,.9904345,-.0170738],[.0296278,.9904345,-.0170738]],a=.4124564*n+.3575761*t+.1804375*r,c=.2126729*n+.7151522*t+.072175*r,i=.0193339*n+.119192*t+.9503041*r,b=1.0479298*a+.0229469*c-.0501922*i,o=.0296278*a+.9904345*c-.0170738*i,u=-.009243*a+.0150552*c+.7518743*i,h=M=>M>.008856?Math.cbrt(M):7.787*M+16/116,m=h(b/.96422),l=h(o/1),p=h(u/.82521);return[116*l-16,500*(m-l),200*(l-p)]},R=e=>{let[n,t,r]=e,s=Math.sqrt(t*t+r*r);if(s<1e-4)return[n,0,0];let c=(Math.atan2(r,t)*180/Math.PI+360)%360;return c>=359.9999&&(c=0),[n,s,c]},ct=e=>{let[n,t,r]=e,s=(n+16)/116,a=t/500+s,c=s-r/200,i=p=>p>.2068965?p**3:(p-16/116)/7.787,b=i(a)*.96422,o=i(s)*1,u=i(c)*.82521,h=.9555766*b-.0230393*o+.0631636*u,m=-.0282895*b+1.0099416*o+.0210077*u,l=.0122982*b-.020483*o+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]},N=(e,n)=>{let[t,r,s]=e,[a,c,i]=n,b=(t+a)/2,o=Math.sqrt(r*r+s*s),u=Math.sqrt(c*c+i*i),h=(o+u)/2,m=.5*(1-Math.sqrt(Math.pow(h,7)/(Math.pow(h,7)+Math.pow(25,7)))),l=r*(1+m),p=c*(1+m),M=Math.sqrt(l*l+s*s),f=Math.sqrt(p*p+i*i),y=(M+f)/2,C=Math.atan2(s,l)*180/Math.PI+(Math.atan2(s,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,Y=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),_=a-t,P=f-M,D=2*Math.sqrt(M*f)*Math.sin(q/2*Math.PI/180),j=1+.015*Math.pow(b-50,2)/Math.sqrt(20+Math.pow(b-50,2)),T=1+.045*y,k=1+.015*y*Y,F=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*F*Math.PI/180);return Math.sqrt(Math.pow(_/j,2)+Math.pow(P/T,2)+Math.pow(D/k,2)+W*(P/T)*(D/k))},H=e=>{let n="",t=-1/0;for(let r of e){let s=d(x(r)),[,a]=R(s);a>t&&(t=a,n=r)}return n};function z(e){let n=[e[0]];for(let t=1;t<e.length;t++){let r=e[t]-e[t-1];r>180?r-=360:r<-180&&(r+=360),n.push(n[t-1]+r)}return n}function mt(e){let[n,t,r]=e;return[.152286*n+1.052583*t-.204868*r,.114503*n+.786281*t+.099216*r,-.003882*n-.048116*t+1.051998*r]}function ht(e){let[n,t,r]=e;return[.367322*n+.860646*t-.227968*r,.280085*n+.672501*t+.047413*r,-.01182*n+.04294*t+.968881*r]}var it=e=>{let n=e.match(/\d+(\.\d+)?/g);if(!n||n.length<3)throw new Error("Invalid CSS rgb()");let t=r=>{let s=r/255;return s<=.04045?s/12.92:Math.pow((s+.055)/1.055,2.4)};return[t(Number(n[0])),t(Number(n[1])),t(Number(n[2]))]};var I=(e,n)=>(Math.max(e,n)+.05)/(Math.min(e,n)+.05),L=(e,n)=>{let t=c=>c>5e-4?c:c+Math.pow(5e-4-c,.8),r=t(e),s=t(n),a=(Math.pow(r,.56)-Math.pow(s,.56))*100;return Math.abs(a)<.1?0:(a=a>0?a<1?0:a-.25:a>-1?0:a+.25,Math.round(a))};function B(e){let n=e.match(/^(wcag|apca)(\d+)$/);if(!n)throw new Error(`Invalid contrast: ${e}`);let t=n[1]==="wcag"?Number(n[2])/10:Number(n[2]);return{system:n[1],target:t}}var U=e=>{let n={},t=e.length,r=t-1;return $.forEach(s=>{let{system:a,target:c}=B(s),i=r,b=0;for(let o=1;o<t;o++){let u=1/0;for(let h=0;h<t-o;h++){let m=a==="wcag"?I(e[h].luminance,e[h+o].luminance):Math.max(Math.abs(L(e[h+o].luminance,e[h].luminance)),Math.abs(L(e[h].luminance,e[h+o].luminance)));m<u&&(u=m)}if(u>=c){i=o,b=u;break}o===r&&(b=u)}n[s]={system:a,efficiency:i/r,target:c,span:i,value:b,name:s}}),n},$=["wcag30","wcag45","wcag70","apca45","apca60","apca75"],G=e=>{let n={};return $.forEach(t=>{var o;let{target:r,system:s}=B(t),a=e.map(u=>u.contrasts[t]),c=((o=e[0])==null?void 0:o.shades.length)||0,i=Math.max(...a.map(u=>(u==null?void 0:u.span)||0)),b=a.reduce((u,h)=>u+((h==null?void 0:h.value)||0),0);n[t]={system:s,target:r,span:i,value:b/(e.length||1),name:t,efficiency:i/(c-1||1)}}),n};var O=e=>{let n=x(e),t=d(n),r=v(n),s=A(t),a=R(t);return{hex:e,rgb:n,lab:t,lch:a,lightness:s,chroma:a[1],hue:a[2],luminance:r,parameter:0,cumDeltaE00:0,cumProtDeltaE00:0,cumDeutDeltaE00:0,wcag:I(r,1),apca:L(r,1)}};var X=e=>{if(e.length<1)return o=>0;let n=[...e].sort((o,u)=>o[0]-u[0]),t=[];for(let o=0;o<n.length;o++)(o===0||n[o][0]!==n[o-1][0])&&t.push(n[o]);let r=t.length;if(r===1)return o=>t[0][1];let s=t.map(o=>o[0]),a=t.map(o=>o[1]),c=[],i=[];for(let o=0;o<r-1;o++)c[o]=s[o+1]-s[o],i[o]=(a[o+1]-a[o])/c[o];let b=new Array(r);b[0]=i[0],b[r-1]=i[r-2];for(let o=1;o<r-1;o++){let u=i[o-1],h=i[o];if(u*h<=0)b[o]=0;else{let m=(1+c[o]/(c[o-1]+c[o]))/3;b[o]=u*h/((1-m)*u+m*h)}}return o=>{if(o<=s[0])return a[0];if(o>=s[r-1])return a[r-1];let u=0,h=r-2,m=0;for(;u<=h;){let g=Math.floor((u+h)/2);if(o>=s[g]&&o<=s[g+1]){m=g;break}o<s[g]?h=g-1:u=g+1}let l=c[m],p=(o-s[m])/l,M=p*p,f=M*p,y=b[m]*l,C=b[m+1]*l;return(2*f-3*M+1)*a[m]+(f-2*M+p)*y+(-2*f+3*M)*a[m+1]+(f-M)*C}};function S(e){let n=e.length;if(n===0)return 0;let t=0;for(let r=0;r<n;r++)t+=e[r]*e[r];return Math.sqrt(t/n)}var gt=e=>{let n=e.length;if(n===0)return{min:0,max:0,avg:0};let t=e[0],r=e[0],s=0;for(let a=0;a<n;a++){let c=e[a];c<t&&(t=c),c>r&&(r=c),s+=c}return{min:t,max:r,avg:s/n}},E=e=>{let n=e.length;if(n===0)return 0;let t=1e-6,r=e.reduce((c,i)=>c*(i+t),1),s=Math.pow(r,1/n),a=Math.max(0,Math.min(1,s));return parseFloat((a*100).toFixed(2))};var Q=(e,n,t)=>{n||(n="brand"),t||(t=[...Array(e.length).keys()]);let r=d(x(e[0]))[0],s=d(x(e[e.length-1]))[0];r>s&&e.reverse();let a=e.map(m=>O(m));for(let m=1;m<a.length;m++){let l=N(a[m-1].lab,a[m].lab);a[m].cumDeltaE00=a[m-1].cumDeltaE00+l}let c=H(e.slice(2,-2))||e[Math.floor(e.length/2)],i=e.findIndex(m=>m.toLowerCase()===(c==null?void 0:c.toLowerCase())),b=z(a.map(m=>m.hue).slice(1,-1));for(let m=1;m<a.length-1;m++)a[m].hue=b[m-1];let o=Z(a.map(m=>m.hue).slice(1,-1),a[i].hue),u=U(a),h={lightnessLinearity:V(a.map(m=>m.lightness)),chromaSmoothness:tt(a.map(m=>m.chroma)),spacingUniformity:nt(a.map(m=>m.cumDeltaE00)),contrastEfficiency:rt(u.wcag45.span,t.length),hueStability:o};return{name:n,colors:e,baseIndex:i,baseColor:c,shades:a,contrasts:u,metrics:h,score:E(Object.values(h))}},Et=e=>{let{stepNames:n,name:t,colors:r}=e,s=Object.values(r)[0],a=d(x(s[0]))[0],c=d(x(s[s.length-1]))[0],i=a>c?"darken":"lighten",b=[],o={};for(let h in r){let m=Q(r[h],h,n);b.push(m),o[h]=m.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:t,baseColors:o,stepNames:n,direction:i,steps:n.length,colors:r,contrasts:G(b),scales:b,metrics:u,score:E(Object.values(u))}};function V(e){let n=e.length;if(n<2)return 1;let t=0,r=0,s=0,a=0;for(let m=0;m<n;m++)t+=m,r+=e[m],s+=m*e[m],a+=m*m;let c=n*a-t*t;if(Math.abs(c)<1e-10)return 1;let i=(n*s-t*r)/c,b=(r-i*t)/n;if(Math.abs(i*(n-1))<.001)return 1;let u=0,h=0;for(let m=0;m<n;m++){let l=i*m+b,p=e[m]-l;u+=p*p;let M=Math.max(l-Math.min(b,i*(n-1)+b),Math.max(b,i*(n-1)+b)-l);h+=M*M}return Math.max(0,Math.min(1,1-Math.sqrt(u/n)/Math.sqrt(h/n)))}function Z(e,n){let t=e.length;if(t<2)return 1;let r=0,s=0;for(let a=0;a<t;a++){let c=Math.abs(e[a]-n)%360;c>180&&(c=360-c),r+=c*c;let i=a/(t-1)*180;s+=i*i}return Math.max(0,Math.min(1,1-Math.sqrt(r/t)/(Math.sqrt(s/t)||1)))}var tt=e=>{let n=e.length;if(n<3)return 1;let t=e.map(o=>o*133.8),r=Math.min(...t),s=Math.max(...t),a=t.findIndex(o=>o===s),c=X([[0,t[0]],[a,s],[n-1,t[n-1]]]),i=0,b=0;for(let o=0;o<n;o++){let u=c(o),h=t[o]-u;i+=h*h,b+=Math.pow(Math.max(u-r,s-u),2)}return Math.max(0,Math.min(1,1-Math.sqrt(i/n)/Math.sqrt(b/n)))},nt=e=>{let n=e.length;if(n<2)return 1;let t=[];for(let c=1;c<n;c++){let i=e[c]-e[c-1];if(i<0)return 0;t.push(i)}let r=t.reduce((c,i)=>c+i,0)/t.length;if(r<=1e-6)return 0;let s=0;for(let c of t)s+=Math.pow(c-r,2);let a=Math.sqrt(s/t.length)/r;return Math.max(0,Math.min(1,1/(1+a)))},rt=(e,n)=>{if(n<=1)return 1;let t=.489,r=e/n,s=t*((n-1)/n);return r<=s?1:r>=1?0:(1-r)/(1-s)};export{Q as analyzeMonochromatic,Et as analyzeMonochromaticPalette,tt as calcChromaSmoothness,rt as calcContrastEfficiency,N as calcDeltaE2000,Z as calcHueStability,V as calcLightnessLinearity,E as calcScore,nt as calcSpacingUniformity,gt as calcStatistics,$ as contrastList,X as createMonotone,it as cssRgbToRgb,H as findMaxChromaHex,at as fromLightnessEAL,L as getApcaContrast,U as getMonochromaticContrasts,G as getPaletteContrasts,v as getRelativeLuminance,I as getWcagContrast,x as hexToRgb,R as labToLch,ct as labToRgb,st as lchToLab,K as lrgbToSrgb,ot as rgbToHex,d as rgbToLab,S as rootMeanSquare,ht as simulateDeuteranopia,mt as simulateProtanopia,J as srgbToLrgb,A as toLightnessEAL,z as unwrapHue};
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.1.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
- "sharp": "^0.34.5",
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
+ }