chromametry 0.3.2 → 0.3.3
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 +153 -127
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +18 -1
- package/dist/index.d.ts +18 -1
- package/dist/index.global.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +9 -1
package/README.md
CHANGED
|
@@ -23,17 +23,17 @@
|
|
|
23
23
|
Comparison of popular design systems based on Chromametry metrics.
|
|
24
24
|
| Design System | Steps | Span (K) | Contrast Efficiency | Lightness Linearity | Chroma Smoothness | Hue Stability | Spacing Uniformity | **SCORE** |
|
|
25
25
|
| :--------------------- | :---: | :------: | :-----------------: | :-----------------: | :---------------: | :-----------: | :----------------: | :-------: |
|
|
26
|
-
| Adobe Spectrum | 18 | 9 | 0.
|
|
27
|
-
| IBM Carbon | 12 | 6 | 0.
|
|
28
|
-
| U.S. Web Design System | 12 | 6 | 0.
|
|
29
|
-
| Salesforce Lightning 2 | 14 | 7 | 0.
|
|
30
|
-
| GitHub Primer Brand | 12 | 6 | 0.
|
|
31
|
-
| Atlassian | 14 | 8 | 0.
|
|
32
|
-
| Tailwind CSS | 13 | 8 | 0.
|
|
33
|
-
| Ant Design | 12 | 9 | 0.
|
|
34
|
-
| Material UI | 12 | 11 | 0.
|
|
35
|
-
| Radix UI | 13 | 10 | 0.
|
|
36
|
-
| Shopify Polaris | 17 | 15 | 0.
|
|
26
|
+
| Adobe Spectrum | 18 | 9 | 0.9431 | 0.9333 | 0.8786 | 0.9138 | 0.7722 | **88.59** |
|
|
27
|
+
| IBM Carbon | 12 | 6 | 0.9109 | 0.9303 | 0.8688 | 0.9288 | 0.7919 | **88.46** |
|
|
28
|
+
| U.S. Web Design System | 12 | 6 | 0.9109 | 0.9359 | 0.8096 | 0.9380 | 0.7997 | **87.67** |
|
|
29
|
+
| Salesforce Lightning 2 | 14 | 7 | 0.9249 | 0.9187 | 0.8464 | 0.9372 | 0.7107 | **86.31** |
|
|
30
|
+
| GitHub Primer Brand | 12 | 6 | 0.9109 | 0.9243 | 0.8405 | 0.9408 | 0.6841 | **85.45** |
|
|
31
|
+
| Atlassian | 14 | 8 | 0.7708 | 0.8964 | 0.9094 | 0.9465 | 0.7129 | **84.23** |
|
|
32
|
+
| Tailwind CSS | 13 | 8 | 0.7561 | 0.8705 | 0.8565 | 0.9147 | 0.6780 | **81.04** |
|
|
33
|
+
| Ant Design | 12 | 9 | 0.6652 | 0.8586 | 0.8734 | 0.9276 | 0.6550 | **78.76** |
|
|
34
|
+
| Material UI | 12 | 11 | 0.5067 | 0.7967 | 0.7861 | 0.9239 | 0.5500 | **69.43** |
|
|
35
|
+
| Radix UI | 13 | 10 | 0.4742 | 0.7979 | 0.7679 | 0.9468 | 0.5207 | **67.80** |
|
|
36
|
+
| Shopify Polaris | 17 | 15 | 0.2824 | 0.7281 | 0.6892 | 0.9223 | 0.4667 | **57.16** |
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
|
|
@@ -42,7 +42,7 @@ Comparison of popular design systems based on Chromametry metrics.
|
|
|
42
42
|
|
|
43
43
|
> **Note:** Design systems like Bootstrap,Google Material 3, Apple Human Interface or Fluent UI are excluded as they define discrete semantic tokens rather than algorithmic sequential ramps.
|
|
44
44
|
|
|
45
|
-
> **Overall Score** is computed as the
|
|
45
|
+
> **Overall Score** is computed as the geometric mean of the five normalized metrics.
|
|
46
46
|
|
|
47
47
|
### Example: A Typical Report
|
|
48
48
|
|
|
@@ -57,134 +57,160 @@ Comparison of popular design systems based on Chromametry metrics.
|
|
|
57
57
|
|
|
58
58
|
## Benchmark result page
|
|
59
59
|
|
|
60
|
-
- Online Report : [Benchmark page](https://chromametry.github.io/chromametry/benchmark/)
|
|
61
|
-
- Local `/benchmark/index.html` (double click)
|
|
62
|
-
|
|
63
|
-
## API
|
|
64
|
-
### Installation
|
|
65
|
-
```bash
|
|
66
|
-
npm install chromametry
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### Usage
|
|
70
|
-
```ts
|
|
71
|
-
import { Ramp, Swatch } from "chromametry";
|
|
72
|
-
|
|
73
|
-
const blue = new Ramp([
|
|
74
|
-
"#ffffff",
|
|
75
|
-
"#eff6fb",
|
|
76
|
-
"#d9e8f6",
|
|
77
|
-
"#aacdec",
|
|
78
|
-
"#73b3e7",
|
|
79
|
-
"#4f97d1",
|
|
80
|
-
"#2378c3",
|
|
81
|
-
"#2c608a",
|
|
82
|
-
"#274863",
|
|
83
|
-
"#1f303e",
|
|
84
|
-
"#11181d",
|
|
85
|
-
"#000000",
|
|
86
|
-
], "blue");
|
|
87
|
-
|
|
88
|
-
console.log(blue.baseColor);
|
|
89
|
-
console.log(blue.wcag[45].span);
|
|
90
|
-
console.log(blue.metrics);
|
|
91
|
-
console.log(blue.score);
|
|
92
|
-
console.log(blue.direction);
|
|
93
|
-
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
const ramp = new
|
|
115
|
-
console.log(ramp.score);
|
|
116
|
-
</script>
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
|
131
|
-
|
|
|
132
|
-
| `
|
|
133
|
-
| `
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
|
137
|
-
|
|
|
138
|
-
| `
|
|
139
|
-
| `
|
|
140
|
-
| `
|
|
141
|
-
| `
|
|
142
|
-
| `
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
|
146
|
-
|
|
|
147
|
-
| `
|
|
148
|
-
| `
|
|
149
|
-
| `
|
|
150
|
-
| `
|
|
151
|
-
| `
|
|
152
|
-
| `
|
|
153
|
-
| `
|
|
154
|
-
| `
|
|
155
|
-
| `
|
|
156
|
-
| `
|
|
157
|
-
| `
|
|
158
|
-
| `
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
60
|
+
- Online Report : [Benchmark page](https://chromametry.github.io/chromametry/benchmark/)
|
|
61
|
+
- Local `/benchmark/index.html` (double click)
|
|
62
|
+
|
|
63
|
+
## API
|
|
64
|
+
### Installation
|
|
65
|
+
```bash
|
|
66
|
+
npm install chromametry
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Usage
|
|
70
|
+
```ts
|
|
71
|
+
import { Palette, Ramp, Swatch } from "chromametry";
|
|
72
|
+
|
|
73
|
+
const blue = new Ramp([
|
|
74
|
+
"#ffffff",
|
|
75
|
+
"#eff6fb",
|
|
76
|
+
"#d9e8f6",
|
|
77
|
+
"#aacdec",
|
|
78
|
+
"#73b3e7",
|
|
79
|
+
"#4f97d1",
|
|
80
|
+
"#2378c3",
|
|
81
|
+
"#2c608a",
|
|
82
|
+
"#274863",
|
|
83
|
+
"#1f303e",
|
|
84
|
+
"#11181d",
|
|
85
|
+
"#000000",
|
|
86
|
+
], "blue");
|
|
87
|
+
|
|
88
|
+
console.log(blue.baseColor);
|
|
89
|
+
console.log(blue.wcag[45].span);
|
|
90
|
+
console.log(blue.metrics);
|
|
91
|
+
console.log(blue.score);
|
|
92
|
+
console.log(blue.direction);
|
|
93
|
+
|
|
94
|
+
const palette = new Palette({
|
|
95
|
+
blue: blue.colors,
|
|
96
|
+
gray: ["#ffffff", "#dfe1e2", "#71767a", "#000000"],
|
|
97
|
+
}, "example");
|
|
98
|
+
|
|
99
|
+
console.log(palette.contrastEfficiency);
|
|
100
|
+
console.log(palette.lightnessLinearity);
|
|
101
|
+
console.log(palette.score);
|
|
102
|
+
|
|
103
|
+
const swatch = new Swatch("#2378c3");
|
|
104
|
+
console.log(swatch.lab);
|
|
105
|
+
console.log(swatch.chroma);
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Browser
|
|
109
|
+
**ESM**
|
|
110
|
+
```html
|
|
111
|
+
<script type="module">
|
|
112
|
+
import { Ramp } from "https://esm.sh/chromametry";
|
|
113
|
+
|
|
114
|
+
const ramp = new Ramp(["#ffffff", "#2378c3", "#000000"], "blue");
|
|
115
|
+
console.log(ramp.score);
|
|
116
|
+
</script>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**Global**
|
|
120
|
+
```html
|
|
121
|
+
<script src="https://unpkg.com/chromametry/dist/index.global.js"></script>
|
|
122
|
+
<script>
|
|
123
|
+
const ramp = new Chromametry.Ramp(["#ffffff", "#2378c3", "#000000"], "blue");
|
|
124
|
+
console.log(ramp.score);
|
|
125
|
+
</script>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Class Reference
|
|
129
|
+
#### Swatch
|
|
130
|
+
| Property | Description |
|
|
131
|
+
| :--- | :--- |
|
|
132
|
+
| `constructor(hex)` | Create a swatch from a hex color string. |
|
|
133
|
+
| `hex` | Original hex color. |
|
|
134
|
+
| `rgb` | Linear RGB values. |
|
|
135
|
+
| `lab` | CIELAB coordinates. |
|
|
136
|
+
| `lch` | LCH coordinates derived from LAB. |
|
|
137
|
+
| `lightness` | Perceptual lightness with Helmholtz-Kohlrausch correction. |
|
|
138
|
+
| `chroma` | Chroma of the swatch. |
|
|
139
|
+
| `hue` | Hue angle in degrees. |
|
|
140
|
+
| `luminance` | Relative luminance used for contrast. |
|
|
141
|
+
| `wcag` | WCAG contrast ratio against white. |
|
|
142
|
+
| `apca` | APCA contrast value against white. |
|
|
143
|
+
|
|
144
|
+
#### Ramp
|
|
145
|
+
| Property | Description |
|
|
146
|
+
| :--- | :--- |
|
|
147
|
+
| `constructor(colors, name?)` | Create a sequential ramp from hex colors. |
|
|
148
|
+
| `name` | Ramp name. |
|
|
149
|
+
| `swatches` | `Swatch[]` built from the input colors. |
|
|
150
|
+
| `colors` | Original ramp colors as hex strings. |
|
|
151
|
+
| `steps` | Number of steps in the ramp. |
|
|
152
|
+
| `direction` | Whether the ramp trends from light to dark or dark to light. |
|
|
153
|
+
| `peakChroma` | Hex color with the highest chroma in the inner ramp. |
|
|
154
|
+
| `baseColor` | Base color used as the ramp anchor. |
|
|
155
|
+
| `baseIndex` | Index of the base color. |
|
|
156
|
+
| `wcag` | WCAG contrast spans for levels `30`, `45`, and `70`. |
|
|
157
|
+
| `apca` | APCA contrast spans for levels `45`, `60`, and `75`. |
|
|
158
|
+
| `contrasts` | Combined contrast object with `wcag` and `apca`. |
|
|
159
|
+
| `deltaECurve` | Cumulative DeltaE curve across ramp steps. |
|
|
160
|
+
| `unwrapHues` | Hue sequence with wrap-around discontinuities removed. |
|
|
161
|
+
| `lightnessLinearity` | Linearity score of the lightness curve. |
|
|
162
|
+
| `chromaSmoothness` | Smoothness score of the chroma curve. |
|
|
163
|
+
| `spacingUniformity` | Uniformity score of DeltaE spacing. |
|
|
164
|
+
| `hueStability` | Stability score of hue drift across the ramp. |
|
|
165
|
+
| `contrastEfficiency` | Efficiency score of using contrast span for WCAG 4.5. |
|
|
166
|
+
| `metrics` | Object containing the five ramp metrics. |
|
|
167
|
+
| `score` | Composite ramp score. |
|
|
168
|
+
|
|
169
|
+
#### Palette
|
|
170
|
+
| Property | Description |
|
|
171
|
+
| :--- | :--- |
|
|
172
|
+
| `constructor(colors, name?)` | Create a named palette from multiple ramps. |
|
|
173
|
+
| `name` | Palette name. |
|
|
174
|
+
| `ramps` | `Ramp[]` built from the input color map. |
|
|
175
|
+
| `colors` | Original colors as `Record<string, string[]>`. |
|
|
176
|
+
| `steps` | Number of steps in each ramp. |
|
|
177
|
+
| `wcag` | Aggregated WCAG contrast spans across ramps. |
|
|
178
|
+
| `apca` | Aggregated APCA contrast spans across ramps. |
|
|
179
|
+
| `contrastEfficiency` | RMS aggregate of ramp contrast-efficiency scores. |
|
|
180
|
+
| `lightnessLinearity` | RMS aggregate of ramp lightness-linearity scores. |
|
|
181
|
+
| `chromaSmoothness` | RMS aggregate of ramp chroma-smoothness scores. |
|
|
182
|
+
| `hueStability` | RMS aggregate of ramp hue-stability scores. |
|
|
183
|
+
| `spacingUniformity` | RMS aggregate of ramp spacing-uniformity scores. |
|
|
184
|
+
| `score` | Composite palette score. |
|
|
185
|
+
|
|
186
|
+
## Reproducing Benchmarks
|
|
187
|
+
To run the benchmark generator locally:
|
|
188
|
+
```bash
|
|
189
|
+
git clone https://github.com/chromametry/chromametry.git
|
|
164
190
|
cd chromametry
|
|
165
191
|
npm install
|
|
166
192
|
npm run generate
|
|
167
193
|
```
|
|
168
194
|
|
|
169
195
|
## Adding Custom Palettes to Benchmark
|
|
170
|
-
Create a new .ts file in benchmark/input/ (e.g., my-palette.ts).
|
|
196
|
+
Create a new .ts file in benchmark/input/ (e.g., my-palette.ts).
|
|
197
|
+
|
|
198
|
+
```ts
|
|
199
|
+
import { red, volcano, gold } from '@ant-design/colors';
|
|
171
200
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
// Define colors (imported or inline object)
|
|
176
|
-
let colors: Record<string, string[]> = { red, volcano, gold };
|
|
201
|
+
// Define colors (imported or inline object)
|
|
202
|
+
let colors: Record<string, string[]> = { red, volcano, gold };
|
|
177
203
|
|
|
178
204
|
// Ensure white/black anchors exist if your ramp misses them
|
|
179
205
|
for (let name in colors) {
|
|
180
206
|
if (colors[name][0] !== "#ffffff") colors[name].unshift("#ffffff");
|
|
181
207
|
if (colors[name][colors[name].length - 1] !== "#000000") colors[name].push("#000000");
|
|
182
208
|
}
|
|
183
|
-
export default {
|
|
184
|
-
name: "Ant Design",
|
|
185
|
-
colors,
|
|
186
|
-
};
|
|
187
|
-
```
|
|
209
|
+
export default {
|
|
210
|
+
name: "Ant Design",
|
|
211
|
+
colors,
|
|
212
|
+
};
|
|
213
|
+
```
|
|
188
214
|
Then regenerate the report:
|
|
189
215
|
```bash
|
|
190
216
|
npm run generate
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var L=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var U=Object.prototype.hasOwnProperty;var V=(u,n)=>{for(var t in n)L(u,t,{get:n[t],enumerable:!0})},W=(u,n,t,s)=>{if(n&&typeof n=="object"||typeof n=="function")for(let e of N(n))!U.call(u,e)&&e!==t&&L(u,e,{get:()=>n[e],enumerable:!(s=G(n,e))||s.enumerable});return u};var $=u=>W(L({},"__esModule",{value:!0}),u);var st={};V(st,{Ramp:()=>y,Swatch:()=>I,calcDeltaE2000:()=>v,calcScore:()=>P,calcStatistics:()=>nt,createMonotone:()=>k,cssRgbToRgb:()=>Q,fromLightnessEAL:()=>j,hexToRgb:()=>w,labToLch:()=>R,labToRgb:()=>J,lchToLab:()=>O,rgbToHex:()=>Z,rgbToLab:()=>C,rootMeanSquare:()=>tt,toLightnessEAL:()=>_});module.exports=$(st);var F=u=>{let n=t=>{let s=Math.max(0,Math.min(1,t)),e=s<=.0031308?12.92*s:1.055*Math.pow(s,1/2.4)-.055;return Math.max(0,Math.min(255,Math.round(e*255)))};return u.map(n)},K=u=>{let n=t=>t>.04045?Math.pow((t+.055)/1.055,2.4):t/12.92;return u.map(n)},Z=u=>{let[n,t,s]=F(u);return n=n.toString(16).padStart(2,"0"),t=t.toString(16).padStart(2,"0"),s=s.toString(16).padStart(2,"0"),`#${n}${t}${s}`},w=u=>{let n=parseInt(u.slice(1,3),16)/255,t=parseInt(u.slice(3,5),16)/255,s=parseInt(u.slice(5,7),16)/255;return K([n,t,s])},_=u=>{let[n,t,s]=u,e=Math.sqrt(t*t+s*s),a=(Math.atan2(s,t)*180/Math.PI+360)%360,c=.1644,m=.0603,r=.1307,i=.006,l=c*Math.abs(Math.sin((a-90)/2*(Math.PI/180)))+m,o=0;return(a<=90||a>=270)&&(o=r*Math.abs(Math.cos(a*(Math.PI/180)))+i),n+(l+o)*e},j=(u,n)=>{let[,t,s]=n,e=Math.sqrt(t*t+s*s),a=(Math.atan2(s,t)*180/Math.PI+360)%360,c=.1644,m=.0603,r=.1307,i=.006,l=c*Math.abs(Math.sin((a-90)/2*(Math.PI/180)))+m,o=0;return(a<=90||a>=270)&&(o=r*Math.abs(Math.cos(a*(Math.PI/180)))+i),Math.max(0,u-(l+o)*e)},O=u=>{let[n,t,s]=u,e=s*Math.PI/180;return[n,t*Math.cos(e),t*Math.sin(e)]},C=u=>{let[n,t,s]=u,e=.4124564*n+.3575761*t+.1804375*s,h=.2126729*n+.7151522*t+.072175*s,a=.0193339*n+.119192*t+.9503041*s,c=.95047,m=1,r=1.08883,i=b=>b>.008856?Math.cbrt(b):7.787*b+16/116,l=i(e/c),o=i(h/m),M=i(a/r);return[116*o-16,500*(l-o),200*(o-M)]},J=u=>{let[n,t,s]=u,e=(n+16)/116,h=t/500+e,a=e-s/200,c=b=>b**3>.008856?b**3:(b-16/116)/7.787,m=.95047,r=1,i=1.08883,l=c(h)*m,o=c(e)*r,M=c(a)*i;return[3.2404542*l-1.5371385*o-.4985314*M,-.969266*l+1.8760108*o+.041556*M,.0556434*l-.2040259*o+1.0572252*M]},R=u=>{let[n,t,s]=u,e=Math.sqrt(t*t+s*s);if(e<1e-4)return[n,0,0];let a=(Math.atan2(s,t)*180/Math.PI+360)%360;return a>=359.9999&&(a=0),[n,e,a]},v=(u,n)=>{let[t,s,e]=u,[h,a,c]=n,m=(t+h)/2,r=Math.sqrt(s*s+e*e),i=Math.sqrt(a*a+c*c),l=(r+i)/2,o=.5*(1-Math.sqrt(Math.pow(l,7)/(Math.pow(l,7)+Math.pow(25,7)))),M=s*(1+o),b=a*(1+o),f=Math.sqrt(M*M+e*e),p=Math.sqrt(b*b+c*c),d=(f+p)/2,x=Math.atan2(e,M)*180/Math.PI+(Math.atan2(e,M)<0?360:0),g=Math.atan2(c,b)*180/Math.PI+(Math.atan2(c,b)<0?360:0),q=g-x;Math.abs(q)>180&&(q+=g<=x?360:-360);let S=Math.abs(x-g)>180?(x+g+360)/2:(x+g)/2,H=1-.17*Math.cos((S-30)*Math.PI/180)+.24*Math.cos(2*S*Math.PI/180)+.32*Math.cos((3*S+6)*Math.PI/180)-.2*Math.cos((4*S-63)*Math.PI/180),Y=h-t,E=p-f,T=2*Math.sqrt(f*p)*Math.sin(q/2*Math.PI/180),A=1+.015*Math.pow(m-50,2)/Math.sqrt(20+Math.pow(m-50,2)),B=1+.045*d,D=1+.015*d*H,X=30*Math.exp(-Math.pow((S-275)/25,2)),z=-(2*Math.sqrt(Math.pow(d,7)/(Math.pow(d,7)+Math.pow(25,7))))*Math.sin(2*X*Math.PI/180);return Math.sqrt(Math.pow(Y/A,2)+Math.pow(E/B,2)+Math.pow(T/D,2)+z*(E/B)*(T/D))},Q=u=>{let n=u.match(/\d+(\.\d+)?/g);if(!n||n.length<3)throw new Error("Invalid CSS rgb()");let t=s=>{let e=s/255;return e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)};return[t(Number(n[0])),t(Number(n[1])),t(Number(n[2]))]},k=u=>{if(u.length<1)return r=>0;let n=[...u].sort((r,i)=>r[0]-i[0]),t=[];for(let r=0;r<n.length;r++)(r===0||n[r][0]!==n[r-1][0])&&t.push(n[r]);let s=t.length;if(s===1)return r=>t[0][1];let e=t.map(r=>r[0]),h=t.map(r=>r[1]),a=[],c=[];for(let r=0;r<s-1;r++)a[r]=e[r+1]-e[r],c[r]=(h[r+1]-h[r])/a[r];let m=new Array(s);m[0]=c[0],m[s-1]=c[s-2];for(let r=1;r<s-1;r++){let i=c[r-1],l=c[r];if(i*l<=0)m[r]=0;else{let o=(1+a[r]/(a[r-1]+a[r]))/3;m[r]=i*l/((1-o)*i+o*l)}}return r=>{if(r<=e[0])return h[0];if(r>=e[s-1])return h[s-1];let i=0,l=s-2,o=0;for(;i<=l;){let g=Math.floor((i+l)/2);if(r>=e[g]&&r<=e[g+1]){o=g;break}r<e[g]?l=g-1:i=g+1}let M=a[o],b=(r-e[o])/M,f=b*b,p=f*b,d=m[o]*M,x=m[o+1]*M;return(2*p-3*f+1)*h[o]+(p-2*f+b)*d+(-2*p+3*f)*h[o+1]+(p-f)*x}};function tt(u){let n=u.length;if(n===0)return 0;let t=0;for(let s=0;s<n;s++)t+=u[s]*u[s];return Math.sqrt(t/n)}var nt=u=>{let n=u.length;if(n===0)return{min:0,max:0,avg:0};let t=u[0],s=u[0],e=0;for(let h=0;h<n;h++){let a=u[h];a<t&&(t=a),a>s&&(s=a),e+=a}return{min:t,max:s,avg:e/n}},P=u=>{let n=u.length;if(n===0)return 0;let t=1e-6,s=u.reduce((a,c)=>a*(c+t),1),e=Math.pow(s,1/n),h=Math.max(0,Math.min(1,e));return parseFloat((h*100).toFixed(2))};var I=class{constructor(n){this.hex=n}get rgb(){return w(this.hex)}get lab(){return C(this.rgb)}get lch(){return R(this.lab)}get lightness(){let[n,t,s]=this.lab,e=Math.sqrt(t*t+s*s),a=(Math.atan2(s,t)*180/Math.PI+360)%360,c=.1644,m=.0603,r=.1307,i=.006,l=c*Math.abs(Math.sin((a-90)/2*(Math.PI/180)))+m,o=0;return(a<=90||a>=270)&&(o=r*Math.abs(Math.cos(a*(Math.PI/180)))+i),n+(l+o)*e}get chroma(){return this.lch[1]}get hue(){return this.lch[2]}get luminance(){let[n,t,s]=this.rgb;return .2126*n+.7152*t+.0722*s}get wcag(){return(Math.max(this.luminance,1)+.05)/(Math.min(this.luminance,1)+.05)}get apca(){let n=h=>h>5e-4?h:h+Math.pow(5e-4-h,.8),t=n(this.luminance),s=n(1),e=(Math.pow(t,.56)-Math.pow(s,.56))*100;return Math.abs(e)<.1?0:(e=e>0?e<1?0:e-.25:e>-1?0:e+.25,Math.round(e))}};var y=class{constructor(n=[],t="brand"){this.swatches=n.map(s=>new I(s)),this.name=t}get colors(){return this.swatches.map(n=>n.hex)}get peakChroma(){let n=this.colors.slice(2,-2),t="",s=-1/0;for(let e of n){let h=new I(e);h.chroma>s&&(s=h.chroma,t=e)}return s<6?this.colors[Math.ceil(this.steps/2)]:t}get steps(){return this.colors.length}get direction(){if(this.colors.length===0)return"lighten";let n=C(w(this.colors[0])),t=C(w(this.colors[this.colors.length-1]));return n[0]>t[0]?"darken":"lighten"}get baseColor(){return this.colors.length===0?"":this.peakChroma||this.colors[Math.floor(this.colors.length/2)]}get baseIndex(){return this.colors.length===0?-1:this.colors.findIndex(n=>n.toLowerCase()===this.baseColor.toLowerCase())}get wcag(){let n=this.swatches,t=n.length,s=t-1,e={};for(let h of[30,45,70]){let a=h/10,c=s,m=0;for(let r=1;r<t;r++){let i=1/0;for(let l=0;l<t-r;l++){let o=n[l].luminance,M=n[l+r].luminance,b=(Math.max(o,M)+.05)/(Math.min(o,M)+.05);b<i&&(i=b)}if(i>=a){c=r,m=i;break}r===s&&(m=i)}e[h]={efficiency:c/s,target:a,span:c,value:m}}return e}get apca(){let n=this.swatches,t=n.length,s=t-1,e={},h=(a,c)=>{let i=a<.022?a+Math.pow(.022-a,1.414):a,l=c<.022?c+Math.pow(.022-c,1.414):c,o=l>=i?(Math.pow(l,.56)-Math.pow(i,.57))*114:(Math.pow(l,.65)-Math.pow(i,.62))*114;return Math.abs(o)<10?0:(o=o>0?o-2.7:o+2.7,Math.round(o))};for(let a of[45,60,75]){let c=a,m=s,r=0;for(let i=1;i<t;i++){let l=1/0;for(let o=0;o<t-i;o++){let M=n[o].luminance>n[o+i].luminance?n[o].luminance:n[o+i].luminance,b=n[o].luminance>n[o+i].luminance?n[o+i].luminance:n[o].luminance,f=Math.abs(h(b,M));f<l&&(l=f)}if(l>=c){m=i,r=l;break}i===s&&(r=l)}e[a]={efficiency:m/s,target:c,span:m,value:r}}return e}get contrasts(){return{wcag:this.wcag,apca:this.apca}}get deltaECurve(){let n=[0];for(let t=1;t<this.swatches.length;t++){let s=v(this.swatches[t-1].lab,this.swatches[t].lab);n.push(n[t-1]+s)}return n}get unwrapHues(){let n=this.swatches.map(s=>s.hue).slice(1,-1);if(n.length===0)return[];let t=[n[0]];for(let s=1;s<n.length;s++){let e=n[s]-n[s-1];e>180?e-=360:e<-180&&(e+=360),t.push(t[s-1]+e)}return t}get lightnessLinearity(){let n=this.swatches.map(M=>M.lightness),t=n.length;if(t<2)return 1;let s=0,e=0,h=0,a=0;for(let M=0;M<t;M++)s+=M,e+=n[M],h+=M*n[M],a+=M*M;let c=t*a-s*s;if(Math.abs(c)<1e-10)return 1;let m=(t*h-s*e)/c,r=(e-m*s)/t;if(Math.abs(m*(t-1))<.001)return 1;let l=0,o=0;for(let M=0;M<t;M++){let b=m*M+r,f=n[M]-b;l+=f*f;let p=Math.max(b-Math.min(r,m*(t-1)+r),Math.max(r,m*(t-1)+r)-b);o+=p*p}return Math.max(0,Math.min(1,1-Math.sqrt(l/t)/Math.sqrt(o/t)))}get chromaSmoothness(){let n=this.swatches.map(o=>o.chroma),t=n.length;if(t<3)return 1;let s=133.8,e=Math.max(...n);if(e<=.01)return 1;let h=n.map(o=>o/e*s),a=Math.min(...h),c=Math.max(...h),m=h.findIndex(o=>o===c),r=k([[0,h[0]],[m,c],[t-1,h[t-1]]]),i=0,l=0;for(let o=0;o<t;o++){let M=r(o),b=h[o]-M;i+=b*b,l+=Math.pow(Math.max(M-a,c-M),2)}return Math.max(0,Math.min(1,1-Math.sqrt(i/t)/Math.sqrt(l/t)))}get spacingUniformity(){let n=this.deltaECurve,t=n.length;if(t<2)return 1;let s=[];for(let c=1;c<t;c++){let m=n[c]-n[c-1];if(m<0)return 0;s.push(m)}let e=s.reduce((c,m)=>c+m,0)/s.length;if(e<=1e-6)return 0;let h=0;for(let c of s)h+=Math.pow(c-e,2);let a=Math.sqrt(h/s.length)/e;return Math.max(0,Math.min(1,1/(1+a)))}get hueStability(){var a,c,m;let n=this.unwrapHues,t=n.length;if(t<2)return 1;let s=(m=(c=n[this.baseIndex-1])!=null?c:(a=this.swatches[this.baseIndex])==null?void 0:a.hue)!=null?m:0,e=0,h=0;for(let r=0;r<t;r++){let i=Math.abs(n[r]-s)%360;i>180&&(i=360-i),e+=i*i;let l=r/(t-1)*180;h+=l*l}return Math.max(0,Math.min(1,1-Math.sqrt(e/t)/(Math.sqrt(h/t)||1)))}get contrastEfficiency(){let n=this.wcag[45].span,t=this.steps;if(t<=1)return 1;let s=.5,e=n/t,h=s*((t-1)/t);return e<=h?1:e>=1?0:(1-e)/(1-h)}get metrics(){return{lightnessLinearity:this.lightnessLinearity,chromaSmoothness:this.chromaSmoothness,spacingUniformity:this.spacingUniformity,hueStability:this.hueStability,contrastEfficiency:this.contrastEfficiency}}get score(){return P(Object.values(this.metrics))}};0&&(module.exports={Ramp,Swatch,calcDeltaE2000,calcScore,calcStatistics,createMonotone,cssRgbToRgb,fromLightnessEAL,hexToRgb,labToLch,labToRgb,lchToLab,rgbToHex,rgbToLab,rootMeanSquare,toLightnessEAL});
|
|
1
|
+
"use strict";var v=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var O=(l,t)=>{for(var s in t)v(l,s,{get:t[s],enumerable:!0})},V=(l,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of j(t))!N.call(l,e)&&e!==s&&v(l,e,{get:()=>t[e],enumerable:!(n=G(t,e))||n.enumerable});return l};var $=l=>V(v({},"__esModule",{value:!0}),l);var et={};O(et,{Palette:()=>T,Ramp:()=>q,Swatch:()=>y,calcDeltaE2000:()=>k,calcScore:()=>L,calcStatistics:()=>nt,createMonotone:()=>E,cssRgbToRgb:()=>st,fromLightnessEAL:()=>J,hexToRgb:()=>C,labToLch:()=>P,labToRgb:()=>tt,lchToLab:()=>Q,rgbToHex:()=>Z,rgbToLab:()=>S,rootMeanSquare:()=>d,toLightnessEAL:()=>_});module.exports=$(et);var F=l=>{let t=s=>{let n=Math.max(0,Math.min(1,s)),e=n<=.0031308?12.92*n:1.055*Math.pow(n,1/2.4)-.055;return Math.max(0,Math.min(255,Math.round(e*255)))};return l.map(t)},K=l=>{let t=s=>s>.04045?Math.pow((s+.055)/1.055,2.4):s/12.92;return l.map(t)},Z=l=>{let[t,s,n]=F(l);return t=t.toString(16).padStart(2,"0"),s=s.toString(16).padStart(2,"0"),n=n.toString(16).padStart(2,"0"),`#${t}${s}${n}`},C=l=>{let t=parseInt(l.slice(1,3),16)/255,s=parseInt(l.slice(3,5),16)/255,n=parseInt(l.slice(5,7),16)/255;return K([t,s,n])},_=l=>{let[t,s,n]=l,e=Math.sqrt(s*s+n*n),o=(Math.atan2(n,s)*180/Math.PI+360)%360,a=.1644,u=.0603,r=.1307,i=.006,m=a*Math.abs(Math.sin((o-90)/2*(Math.PI/180)))+u,c=0;return(o<=90||o>=270)&&(c=r*Math.abs(Math.cos(o*(Math.PI/180)))+i),t+(m+c)*e},J=(l,t)=>{let[,s,n]=t,e=Math.sqrt(s*s+n*n),o=(Math.atan2(n,s)*180/Math.PI+360)%360,a=.1644,u=.0603,r=.1307,i=.006,m=a*Math.abs(Math.sin((o-90)/2*(Math.PI/180)))+u,c=0;return(o<=90||o>=270)&&(c=r*Math.abs(Math.cos(o*(Math.PI/180)))+i),Math.max(0,l-(m+c)*e)},Q=l=>{let[t,s,n]=l,e=n*Math.PI/180;return[t,s*Math.cos(e),s*Math.sin(e)]},S=l=>{let[t,s,n]=l,e=.4124564*t+.3575761*s+.1804375*n,h=.2126729*t+.7151522*s+.072175*n,o=.0193339*t+.119192*s+.9503041*n,a=.95047,u=1,r=1.08883,i=g=>g>.008856?Math.cbrt(g):7.787*g+16/116,m=i(e/a),c=i(h/u),p=i(o/r);return[116*c-16,500*(m-c),200*(c-p)]},tt=l=>{let[t,s,n]=l,e=(t+16)/116,h=s/500+e,o=e-n/200,a=g=>g**3>.008856?g**3:(g-16/116)/7.787,u=.95047,r=1,i=1.08883,m=a(h)*u,c=a(e)*r,p=a(o)*i;return[3.2404542*m-1.5371385*c-.4985314*p,-.969266*m+1.8760108*c+.041556*p,.0556434*m-.2040259*c+1.0572252*p]},P=l=>{let[t,s,n]=l,e=Math.sqrt(s*s+n*n);if(e<1e-4)return[t,0,0];let o=(Math.atan2(n,s)*180/Math.PI+360)%360;return o>=359.9999&&(o=0),[t,e,o]},k=(l,t)=>{let[s,n,e]=l,[h,o,a]=t,u=(s+h)/2,r=Math.sqrt(n*n+e*e),i=Math.sqrt(o*o+a*a),m=(r+i)/2,c=.5*(1-Math.sqrt(Math.pow(m,7)/(Math.pow(m,7)+Math.pow(25,7)))),p=n*(1+c),g=o*(1+c),M=Math.sqrt(p*p+e*e),b=Math.sqrt(g*g+a*a),w=(M+b)/2,x=Math.atan2(e,p)*180/Math.PI+(Math.atan2(e,p)<0?360:0),f=Math.atan2(a,g)*180/Math.PI+(Math.atan2(a,g)<0?360:0),R=f-x;Math.abs(R)>180&&(R+=f<=x?360:-360);let I=Math.abs(x-f)>180?(x+f+360)/2:(x+f)/2,Y=1-.17*Math.cos((I-30)*Math.PI/180)+.24*Math.cos(2*I*Math.PI/180)+.32*Math.cos((3*I+6)*Math.PI/180)-.2*Math.cos((4*I-63)*Math.PI/180),U=h-s,B=b-M,A=2*Math.sqrt(M*b)*Math.sin(R/2*Math.PI/180),W=1+.015*Math.pow(u-50,2)/Math.sqrt(20+Math.pow(u-50,2)),D=1+.045*w,H=1+.015*w*Y,X=30*Math.exp(-Math.pow((I-275)/25,2)),z=-(2*Math.sqrt(Math.pow(w,7)/(Math.pow(w,7)+Math.pow(25,7))))*Math.sin(2*X*Math.PI/180);return Math.sqrt(Math.pow(U/W,2)+Math.pow(B/D,2)+Math.pow(A/H,2)+z*(B/D)*(A/H))},st=l=>{let t=l.match(/\d+(\.\d+)?/g);if(!t||t.length<3)throw new Error("Invalid CSS rgb()");let s=n=>{let e=n/255;return e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)};return[s(Number(t[0])),s(Number(t[1])),s(Number(t[2]))]},E=l=>{if(l.length<1)return r=>0;let t=[...l].sort((r,i)=>r[0]-i[0]),s=[];for(let r=0;r<t.length;r++)(r===0||t[r][0]!==t[r-1][0])&&s.push(t[r]);let n=s.length;if(n===1)return r=>s[0][1];let e=s.map(r=>r[0]),h=s.map(r=>r[1]),o=[],a=[];for(let r=0;r<n-1;r++)o[r]=e[r+1]-e[r],a[r]=(h[r+1]-h[r])/o[r];let u=new Array(n);u[0]=a[0],u[n-1]=a[n-2];for(let r=1;r<n-1;r++){let i=a[r-1],m=a[r];if(i*m<=0)u[r]=0;else{let c=(1+o[r]/(o[r-1]+o[r]))/3;u[r]=i*m/((1-c)*i+c*m)}}return r=>{if(r<=e[0])return h[0];if(r>=e[n-1])return h[n-1];let i=0,m=n-2,c=0;for(;i<=m;){let f=Math.floor((i+m)/2);if(r>=e[f]&&r<=e[f+1]){c=f;break}r<e[f]?m=f-1:i=f+1}let p=o[c],g=(r-e[c])/p,M=g*g,b=M*g,w=u[c]*p,x=u[c+1]*p;return(2*b-3*M+1)*h[c]+(b-2*M+g)*w+(-2*b+3*M)*h[c+1]+(b-M)*x}};function d(l){let t=l.length;if(t===0)return 0;let s=0;for(let n=0;n<t;n++)s+=l[n]*l[n];return Math.sqrt(s/t)}var nt=l=>{let t=l.length;if(t===0)return{min:0,max:0,avg:0};let s=l[0],n=l[0],e=0;for(let h=0;h<t;h++){let o=l[h];o<s&&(s=o),o>n&&(n=o),e+=o}return{min:s,max:n,avg:e/t}},L=l=>{let t=l.length;if(t===0)return 0;let s=1e-6,n=l.reduce((o,a)=>o*(a+s),1),e=Math.pow(n,1/t),h=Math.max(0,Math.min(1,e));return parseFloat((h*100).toFixed(2))};var y=class{constructor(t){this.hex=t}get rgb(){return C(this.hex)}get lab(){return S(this.rgb)}get lch(){return P(this.lab)}get lightness(){let[t,s,n]=this.lab,e=Math.sqrt(s*s+n*n),o=(Math.atan2(n,s)*180/Math.PI+360)%360,a=.1644,u=.0603,r=.1307,i=.006,m=a*Math.abs(Math.sin((o-90)/2*(Math.PI/180)))+u,c=0;return(o<=90||o>=270)&&(c=r*Math.abs(Math.cos(o*(Math.PI/180)))+i),t+(m+c)*e}get chroma(){return this.lch[1]}get hue(){return this.lch[2]}get luminance(){let[t,s,n]=this.rgb;return .2126*t+.7152*s+.0722*n}get wcag(){return(Math.max(this.luminance,1)+.05)/(Math.min(this.luminance,1)+.05)}get apca(){let t=h=>h>5e-4?h:h+Math.pow(5e-4-h,.8),s=t(this.luminance),n=t(1),e=(Math.pow(s,.56)-Math.pow(n,.56))*100;return Math.abs(e)<.1?0:(e=e>0?e<1?0:e-.25:e>-1?0:e+.25,Math.round(e))}};var q=class{constructor(t=[],s="brand"){this.swatches=t.map(n=>new y(n)),this.name=s}get colors(){return this.swatches.map(t=>t.hex)}get peakChroma(){let t=this.colors.slice(2,-2),s="",n=-1/0;for(let e of t){let h=new y(e);h.chroma>n&&(n=h.chroma,s=e)}return n<6?this.colors[Math.ceil(this.steps/2)]:s}get steps(){return this.colors.length}get direction(){if(this.colors.length===0)return"lighten";let t=S(C(this.colors[0])),s=S(C(this.colors[this.colors.length-1]));return t[0]>s[0]?"darken":"lighten"}get baseColor(){return this.colors.length===0?"":this.peakChroma||this.colors[Math.floor(this.colors.length/2)]}get baseIndex(){return this.colors.length===0?-1:this.colors.findIndex(t=>t.toLowerCase()===this.baseColor.toLowerCase())}get wcag(){let t=this.swatches,s=t.length,n=s-1,e={};for(let h of[30,45,70]){let o=h/10,a=n,u=0;for(let r=1;r<s;r++){let i=1/0;for(let m=0;m<s-r;m++){let c=t[m].luminance,p=t[m+r].luminance,g=(Math.max(c,p)+.05)/(Math.min(c,p)+.05);g<i&&(i=g)}if(i>=o){a=r,u=i;break}r===n&&(u=i)}e[h]={efficiency:a/n,target:o,span:a,value:u}}return e}get apca(){let t=this.swatches,s=t.length,n=s-1,e={},h=(o,a)=>{let i=o<.022?o+Math.pow(.022-o,1.414):o,m=a<.022?a+Math.pow(.022-a,1.414):a,c=m>=i?(Math.pow(m,.56)-Math.pow(i,.57))*114:(Math.pow(m,.65)-Math.pow(i,.62))*114;return Math.abs(c)<10?0:(c=c>0?c-2.7:c+2.7,Math.round(c))};for(let o of[45,60,75]){let a=o,u=n,r=0;for(let i=1;i<s;i++){let m=1/0;for(let c=0;c<s-i;c++){let p=t[c].luminance>t[c+i].luminance?t[c].luminance:t[c+i].luminance,g=t[c].luminance>t[c+i].luminance?t[c+i].luminance:t[c].luminance,M=Math.abs(h(g,p));M<m&&(m=M)}if(m>=a){u=i,r=m;break}i===n&&(r=m)}e[o]={efficiency:u/n,target:a,span:u,value:r}}return e}get contrasts(){return{wcag:this.wcag,apca:this.apca}}get deltaECurve(){let t=[0];for(let s=1;s<this.swatches.length;s++){let n=k(this.swatches[s-1].lab,this.swatches[s].lab);t.push(t[s-1]+n)}return t}get unwrapHues(){let t=this.swatches.map(n=>n.hue).slice(1,-1);if(t.length===0)return[];let s=[t[0]];for(let n=1;n<t.length;n++){let e=t[n]-t[n-1];e>180?e-=360:e<-180&&(e+=360),s.push(s[n-1]+e)}return s}get lightnessLinearity(){let t=this.swatches.map(p=>p.lightness),s=t.length;if(s<2)return 1;let n=0,e=0,h=0,o=0;for(let p=0;p<s;p++)n+=p,e+=t[p],h+=p*t[p],o+=p*p;let a=s*o-n*n;if(Math.abs(a)<1e-10)return 1;let u=(s*h-n*e)/a,r=(e-u*n)/s;if(Math.abs(u*(s-1))<.001)return 1;let m=0,c=0;for(let p=0;p<s;p++){let g=u*p+r,M=t[p]-g;m+=M*M;let b=Math.max(g-Math.min(r,u*(s-1)+r),Math.max(r,u*(s-1)+r)-g);c+=b*b}return Math.max(0,Math.min(1,1-Math.sqrt(m/s)/Math.sqrt(c/s)))}get chromaSmoothness(){let t=this.swatches.map(c=>c.chroma),s=t.length;if(s<3)return 1;let n=133.8,e=Math.max(...t);if(e<=.01)return 1;let h=t.map(c=>c/e*n),o=Math.min(...h),a=Math.max(...h),u=h.findIndex(c=>c===a),r=E([[0,h[0]],[u,a],[s-1,h[s-1]]]),i=0,m=0;for(let c=0;c<s;c++){let p=r(c),g=h[c]-p;i+=g*g,m+=Math.pow(Math.max(p-o,a-p),2)}return Math.max(0,Math.min(1,1-Math.sqrt(i/s)/Math.sqrt(m/s)))}get spacingUniformity(){let t=this.deltaECurve,s=t.length;if(s<2)return 1;let n=[];for(let a=1;a<s;a++){let u=t[a]-t[a-1];if(u<0)return 0;n.push(u)}let e=n.reduce((a,u)=>a+u,0)/n.length;if(e<=1e-6)return 0;let h=0;for(let a of n)h+=Math.pow(a-e,2);let o=Math.sqrt(h/n.length)/e;return Math.max(0,Math.min(1,1/(1+o)))}get hueStability(){var o,a,u;let t=this.unwrapHues,s=t.length;if(s<2)return 1;let n=(u=(a=t[this.baseIndex-1])!=null?a:(o=this.swatches[this.baseIndex])==null?void 0:o.hue)!=null?u:0,e=0,h=0;for(let r=0;r<s;r++){let i=Math.abs(t[r]-n)%360;i>180&&(i=360-i),e+=i*i;let m=r/(s-1)*180;h+=m*m}return Math.max(0,Math.min(1,1-Math.sqrt(e/s)/(Math.sqrt(h/s)||1)))}get contrastEfficiency(){let t=this.wcag[45].span,s=this.steps;if(s<=1)return 1;let n=.501,e=t/(s-1);return e<=n?1:e>=1?0:1-(e-n)/(1-n)}get metrics(){return{lightnessLinearity:this.lightnessLinearity,chromaSmoothness:this.chromaSmoothness,spacingUniformity:this.spacingUniformity,hueStability:this.hueStability,contrastEfficiency:this.contrastEfficiency}}get score(){return L(Object.values(this.metrics))}};var T=class{constructor(t={},s="Collection 1"){this.ramps=Object.entries(t).map(([n,e])=>new q(e,n)),this.name=s}get colors(){return Object.fromEntries(this.ramps.map(t=>[t.name,t.colors]))}get steps(){var t;return((t=this.ramps[0])==null?void 0:t.steps)||0}get wcag(){let t={},s=this.steps;for(let n of[30,45,70]){let e=this.ramps.map(a=>a.wcag[n]),h=Math.max(0,...e.map(a=>(a==null?void 0:a.span)||0)),o=e.reduce((a,u)=>a+((u==null?void 0:u.value)||0),0);t[n]={target:n/10,span:h,value:o/(this.ramps.length||1),efficiency:s>1?h/(s-1):0}}return t}get apca(){let t={},s=this.steps;for(let n of[45,60,75]){let e=this.ramps.map(a=>a.apca[n]),h=Math.max(0,...e.map(a=>(a==null?void 0:a.span)||0)),o=e.reduce((a,u)=>a+((u==null?void 0:u.value)||0),0);t[n]={target:n,span:h,value:o/(this.ramps.length||1),efficiency:s>1?h/(s-1):0}}return t}get contrastEfficiency(){return d(this.ramps.map(t=>t.contrastEfficiency))}get lightnessLinearity(){return d(this.ramps.map(t=>t.lightnessLinearity))}get chromaSmoothness(){return d(this.ramps.map(t=>t.chromaSmoothness))}get hueStability(){return d(this.ramps.map(t=>t.hueStability))}get spacingUniformity(){return d(this.ramps.map(t=>t.spacingUniformity))}get score(){return L([this.contrastEfficiency,this.lightnessLinearity,this.chromaSmoothness,this.hueStability,this.spacingUniformity])}};0&&(module.exports={Palette,Ramp,Swatch,calcDeltaE2000,calcScore,calcStatistics,createMonotone,cssRgbToRgb,fromLightnessEAL,hexToRgb,labToLch,labToRgb,lchToLab,rgbToHex,rgbToLab,rootMeanSquare,toLightnessEAL});
|
package/dist/index.d.cts
CHANGED
|
@@ -90,4 +90,21 @@ declare class Ramp {
|
|
|
90
90
|
get score(): number;
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
|
|
93
|
+
type PaletteColors = Record<string, string[]>;
|
|
94
|
+
declare class Palette {
|
|
95
|
+
ramps: Ramp[];
|
|
96
|
+
name: string;
|
|
97
|
+
constructor(colors?: PaletteColors, name?: string);
|
|
98
|
+
get colors(): PaletteColors;
|
|
99
|
+
get steps(): number;
|
|
100
|
+
get wcag(): WcagContrasts;
|
|
101
|
+
get apca(): ApcaContrasts;
|
|
102
|
+
get contrastEfficiency(): number;
|
|
103
|
+
get lightnessLinearity(): number;
|
|
104
|
+
get chromaSmoothness(): number;
|
|
105
|
+
get hueStability(): number;
|
|
106
|
+
get spacingUniformity(): number;
|
|
107
|
+
get score(): number;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export { type ApcaContrasts, type ContrastValue, Palette, type PaletteColors, Ramp, Swatch, type WcagContrasts, calcDeltaE2000, calcScore, calcStatistics, createMonotone, cssRgbToRgb, fromLightnessEAL, hexToRgb, labToLch, labToRgb, lchToLab, rgbToHex, rgbToLab, rootMeanSquare, toLightnessEAL };
|
package/dist/index.d.ts
CHANGED
|
@@ -90,4 +90,21 @@ declare class Ramp {
|
|
|
90
90
|
get score(): number;
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
|
|
93
|
+
type PaletteColors = Record<string, string[]>;
|
|
94
|
+
declare class Palette {
|
|
95
|
+
ramps: Ramp[];
|
|
96
|
+
name: string;
|
|
97
|
+
constructor(colors?: PaletteColors, name?: string);
|
|
98
|
+
get colors(): PaletteColors;
|
|
99
|
+
get steps(): number;
|
|
100
|
+
get wcag(): WcagContrasts;
|
|
101
|
+
get apca(): ApcaContrasts;
|
|
102
|
+
get contrastEfficiency(): number;
|
|
103
|
+
get lightnessLinearity(): number;
|
|
104
|
+
get chromaSmoothness(): number;
|
|
105
|
+
get hueStability(): number;
|
|
106
|
+
get spacingUniformity(): number;
|
|
107
|
+
get score(): number;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export { type ApcaContrasts, type ContrastValue, Palette, type PaletteColors, Ramp, Swatch, type WcagContrasts, calcDeltaE2000, calcScore, calcStatistics, createMonotone, cssRgbToRgb, fromLightnessEAL, hexToRgb, labToLch, labToRgb, lchToLab, rgbToHex, rgbToLab, rootMeanSquare, toLightnessEAL };
|
package/dist/index.global.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var Chromametry=(()=>{var L=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var U=Object.prototype.hasOwnProperty;var V=(u,n)=>{for(var t in n)L(u,t,{get:n[t],enumerable:!0})},W=(u,n,t,s)=>{if(n&&typeof n=="object"||typeof n=="function")for(let e of N(n))!U.call(u,e)&&e!==t&&L(u,e,{get:()=>n[e],enumerable:!(s=G(n,e))||s.enumerable});return u};var $=u=>W(L({},"__esModule",{value:!0}),u);var st={};V(st,{Ramp:()=>y,Swatch:()=>I,calcDeltaE2000:()=>v,calcScore:()=>P,calcStatistics:()=>nt,createMonotone:()=>k,cssRgbToRgb:()=>Q,fromLightnessEAL:()=>j,hexToRgb:()=>w,labToLch:()=>R,labToRgb:()=>J,lchToLab:()=>O,rgbToHex:()=>Z,rgbToLab:()=>C,rootMeanSquare:()=>tt,toLightnessEAL:()=>_});var F=u=>{let n=t=>{let s=Math.max(0,Math.min(1,t)),e=s<=.0031308?12.92*s:1.055*Math.pow(s,1/2.4)-.055;return Math.max(0,Math.min(255,Math.round(e*255)))};return u.map(n)},K=u=>{let n=t=>t>.04045?Math.pow((t+.055)/1.055,2.4):t/12.92;return u.map(n)},Z=u=>{let[n,t,s]=F(u);return n=n.toString(16).padStart(2,"0"),t=t.toString(16).padStart(2,"0"),s=s.toString(16).padStart(2,"0"),`#${n}${t}${s}`},w=u=>{let n=parseInt(u.slice(1,3),16)/255,t=parseInt(u.slice(3,5),16)/255,s=parseInt(u.slice(5,7),16)/255;return K([n,t,s])},_=u=>{let[n,t,s]=u,e=Math.sqrt(t*t+s*s),a=(Math.atan2(s,t)*180/Math.PI+360)%360,c=.1644,m=.0603,r=.1307,i=.006,l=c*Math.abs(Math.sin((a-90)/2*(Math.PI/180)))+m,o=0;return(a<=90||a>=270)&&(o=r*Math.abs(Math.cos(a*(Math.PI/180)))+i),n+(l+o)*e},j=(u,n)=>{let[,t,s]=n,e=Math.sqrt(t*t+s*s),a=(Math.atan2(s,t)*180/Math.PI+360)%360,c=.1644,m=.0603,r=.1307,i=.006,l=c*Math.abs(Math.sin((a-90)/2*(Math.PI/180)))+m,o=0;return(a<=90||a>=270)&&(o=r*Math.abs(Math.cos(a*(Math.PI/180)))+i),Math.max(0,u-(l+o)*e)},O=u=>{let[n,t,s]=u,e=s*Math.PI/180;return[n,t*Math.cos(e),t*Math.sin(e)]},C=u=>{let[n,t,s]=u,e=.4124564*n+.3575761*t+.1804375*s,h=.2126729*n+.7151522*t+.072175*s,a=.0193339*n+.119192*t+.9503041*s,c=.95047,m=1,r=1.08883,i=b=>b>.008856?Math.cbrt(b):7.787*b+16/116,l=i(e/c),o=i(h/m),M=i(a/r);return[116*o-16,500*(l-o),200*(o-M)]},J=u=>{let[n,t,s]=u,e=(n+16)/116,h=t/500+e,a=e-s/200,c=b=>b**3>.008856?b**3:(b-16/116)/7.787,m=.95047,r=1,i=1.08883,l=c(h)*m,o=c(e)*r,M=c(a)*i;return[3.2404542*l-1.5371385*o-.4985314*M,-.969266*l+1.8760108*o+.041556*M,.0556434*l-.2040259*o+1.0572252*M]},R=u=>{let[n,t,s]=u,e=Math.sqrt(t*t+s*s);if(e<1e-4)return[n,0,0];let a=(Math.atan2(s,t)*180/Math.PI+360)%360;return a>=359.9999&&(a=0),[n,e,a]},v=(u,n)=>{let[t,s,e]=u,[h,a,c]=n,m=(t+h)/2,r=Math.sqrt(s*s+e*e),i=Math.sqrt(a*a+c*c),l=(r+i)/2,o=.5*(1-Math.sqrt(Math.pow(l,7)/(Math.pow(l,7)+Math.pow(25,7)))),M=s*(1+o),b=a*(1+o),f=Math.sqrt(M*M+e*e),p=Math.sqrt(b*b+c*c),d=(f+p)/2,x=Math.atan2(e,M)*180/Math.PI+(Math.atan2(e,M)<0?360:0),g=Math.atan2(c,b)*180/Math.PI+(Math.atan2(c,b)<0?360:0),q=g-x;Math.abs(q)>180&&(q+=g<=x?360:-360);let S=Math.abs(x-g)>180?(x+g+360)/2:(x+g)/2,H=1-.17*Math.cos((S-30)*Math.PI/180)+.24*Math.cos(2*S*Math.PI/180)+.32*Math.cos((3*S+6)*Math.PI/180)-.2*Math.cos((4*S-63)*Math.PI/180),Y=h-t,E=p-f,T=2*Math.sqrt(f*p)*Math.sin(q/2*Math.PI/180),A=1+.015*Math.pow(m-50,2)/Math.sqrt(20+Math.pow(m-50,2)),B=1+.045*d,D=1+.015*d*H,X=30*Math.exp(-Math.pow((S-275)/25,2)),z=-(2*Math.sqrt(Math.pow(d,7)/(Math.pow(d,7)+Math.pow(25,7))))*Math.sin(2*X*Math.PI/180);return Math.sqrt(Math.pow(Y/A,2)+Math.pow(E/B,2)+Math.pow(T/D,2)+z*(E/B)*(T/D))},Q=u=>{let n=u.match(/\d+(\.\d+)?/g);if(!n||n.length<3)throw new Error("Invalid CSS rgb()");let t=s=>{let e=s/255;return e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)};return[t(Number(n[0])),t(Number(n[1])),t(Number(n[2]))]},k=u=>{if(u.length<1)return r=>0;let n=[...u].sort((r,i)=>r[0]-i[0]),t=[];for(let r=0;r<n.length;r++)(r===0||n[r][0]!==n[r-1][0])&&t.push(n[r]);let s=t.length;if(s===1)return r=>t[0][1];let e=t.map(r=>r[0]),h=t.map(r=>r[1]),a=[],c=[];for(let r=0;r<s-1;r++)a[r]=e[r+1]-e[r],c[r]=(h[r+1]-h[r])/a[r];let m=new Array(s);m[0]=c[0],m[s-1]=c[s-2];for(let r=1;r<s-1;r++){let i=c[r-1],l=c[r];if(i*l<=0)m[r]=0;else{let o=(1+a[r]/(a[r-1]+a[r]))/3;m[r]=i*l/((1-o)*i+o*l)}}return r=>{if(r<=e[0])return h[0];if(r>=e[s-1])return h[s-1];let i=0,l=s-2,o=0;for(;i<=l;){let g=Math.floor((i+l)/2);if(r>=e[g]&&r<=e[g+1]){o=g;break}r<e[g]?l=g-1:i=g+1}let M=a[o],b=(r-e[o])/M,f=b*b,p=f*b,d=m[o]*M,x=m[o+1]*M;return(2*p-3*f+1)*h[o]+(p-2*f+b)*d+(-2*p+3*f)*h[o+1]+(p-f)*x}};function tt(u){let n=u.length;if(n===0)return 0;let t=0;for(let s=0;s<n;s++)t+=u[s]*u[s];return Math.sqrt(t/n)}var nt=u=>{let n=u.length;if(n===0)return{min:0,max:0,avg:0};let t=u[0],s=u[0],e=0;for(let h=0;h<n;h++){let a=u[h];a<t&&(t=a),a>s&&(s=a),e+=a}return{min:t,max:s,avg:e/n}},P=u=>{let n=u.length;if(n===0)return 0;let t=1e-6,s=u.reduce((a,c)=>a*(c+t),1),e=Math.pow(s,1/n),h=Math.max(0,Math.min(1,e));return parseFloat((h*100).toFixed(2))};var I=class{constructor(n){this.hex=n}get rgb(){return w(this.hex)}get lab(){return C(this.rgb)}get lch(){return R(this.lab)}get lightness(){let[n,t,s]=this.lab,e=Math.sqrt(t*t+s*s),a=(Math.atan2(s,t)*180/Math.PI+360)%360,c=.1644,m=.0603,r=.1307,i=.006,l=c*Math.abs(Math.sin((a-90)/2*(Math.PI/180)))+m,o=0;return(a<=90||a>=270)&&(o=r*Math.abs(Math.cos(a*(Math.PI/180)))+i),n+(l+o)*e}get chroma(){return this.lch[1]}get hue(){return this.lch[2]}get luminance(){let[n,t,s]=this.rgb;return .2126*n+.7152*t+.0722*s}get wcag(){return(Math.max(this.luminance,1)+.05)/(Math.min(this.luminance,1)+.05)}get apca(){let n=h=>h>5e-4?h:h+Math.pow(5e-4-h,.8),t=n(this.luminance),s=n(1),e=(Math.pow(t,.56)-Math.pow(s,.56))*100;return Math.abs(e)<.1?0:(e=e>0?e<1?0:e-.25:e>-1?0:e+.25,Math.round(e))}};var y=class{constructor(n=[],t="brand"){this.swatches=n.map(s=>new I(s)),this.name=t}get colors(){return this.swatches.map(n=>n.hex)}get peakChroma(){let n=this.colors.slice(2,-2),t="",s=-1/0;for(let e of n){let h=new I(e);h.chroma>s&&(s=h.chroma,t=e)}return s<6?this.colors[Math.ceil(this.steps/2)]:t}get steps(){return this.colors.length}get direction(){if(this.colors.length===0)return"lighten";let n=C(w(this.colors[0])),t=C(w(this.colors[this.colors.length-1]));return n[0]>t[0]?"darken":"lighten"}get baseColor(){return this.colors.length===0?"":this.peakChroma||this.colors[Math.floor(this.colors.length/2)]}get baseIndex(){return this.colors.length===0?-1:this.colors.findIndex(n=>n.toLowerCase()===this.baseColor.toLowerCase())}get wcag(){let n=this.swatches,t=n.length,s=t-1,e={};for(let h of[30,45,70]){let a=h/10,c=s,m=0;for(let r=1;r<t;r++){let i=1/0;for(let l=0;l<t-r;l++){let o=n[l].luminance,M=n[l+r].luminance,b=(Math.max(o,M)+.05)/(Math.min(o,M)+.05);b<i&&(i=b)}if(i>=a){c=r,m=i;break}r===s&&(m=i)}e[h]={efficiency:c/s,target:a,span:c,value:m}}return e}get apca(){let n=this.swatches,t=n.length,s=t-1,e={},h=(a,c)=>{let i=a<.022?a+Math.pow(.022-a,1.414):a,l=c<.022?c+Math.pow(.022-c,1.414):c,o=l>=i?(Math.pow(l,.56)-Math.pow(i,.57))*114:(Math.pow(l,.65)-Math.pow(i,.62))*114;return Math.abs(o)<10?0:(o=o>0?o-2.7:o+2.7,Math.round(o))};for(let a of[45,60,75]){let c=a,m=s,r=0;for(let i=1;i<t;i++){let l=1/0;for(let o=0;o<t-i;o++){let M=n[o].luminance>n[o+i].luminance?n[o].luminance:n[o+i].luminance,b=n[o].luminance>n[o+i].luminance?n[o+i].luminance:n[o].luminance,f=Math.abs(h(b,M));f<l&&(l=f)}if(l>=c){m=i,r=l;break}i===s&&(r=l)}e[a]={efficiency:m/s,target:c,span:m,value:r}}return e}get contrasts(){return{wcag:this.wcag,apca:this.apca}}get deltaECurve(){let n=[0];for(let t=1;t<this.swatches.length;t++){let s=v(this.swatches[t-1].lab,this.swatches[t].lab);n.push(n[t-1]+s)}return n}get unwrapHues(){let n=this.swatches.map(s=>s.hue).slice(1,-1);if(n.length===0)return[];let t=[n[0]];for(let s=1;s<n.length;s++){let e=n[s]-n[s-1];e>180?e-=360:e<-180&&(e+=360),t.push(t[s-1]+e)}return t}get lightnessLinearity(){let n=this.swatches.map(M=>M.lightness),t=n.length;if(t<2)return 1;let s=0,e=0,h=0,a=0;for(let M=0;M<t;M++)s+=M,e+=n[M],h+=M*n[M],a+=M*M;let c=t*a-s*s;if(Math.abs(c)<1e-10)return 1;let m=(t*h-s*e)/c,r=(e-m*s)/t;if(Math.abs(m*(t-1))<.001)return 1;let l=0,o=0;for(let M=0;M<t;M++){let b=m*M+r,f=n[M]-b;l+=f*f;let p=Math.max(b-Math.min(r,m*(t-1)+r),Math.max(r,m*(t-1)+r)-b);o+=p*p}return Math.max(0,Math.min(1,1-Math.sqrt(l/t)/Math.sqrt(o/t)))}get chromaSmoothness(){let n=this.swatches.map(o=>o.chroma),t=n.length;if(t<3)return 1;let s=133.8,e=Math.max(...n);if(e<=.01)return 1;let h=n.map(o=>o/e*s),a=Math.min(...h),c=Math.max(...h),m=h.findIndex(o=>o===c),r=k([[0,h[0]],[m,c],[t-1,h[t-1]]]),i=0,l=0;for(let o=0;o<t;o++){let M=r(o),b=h[o]-M;i+=b*b,l+=Math.pow(Math.max(M-a,c-M),2)}return Math.max(0,Math.min(1,1-Math.sqrt(i/t)/Math.sqrt(l/t)))}get spacingUniformity(){let n=this.deltaECurve,t=n.length;if(t<2)return 1;let s=[];for(let c=1;c<t;c++){let m=n[c]-n[c-1];if(m<0)return 0;s.push(m)}let e=s.reduce((c,m)=>c+m,0)/s.length;if(e<=1e-6)return 0;let h=0;for(let c of s)h+=Math.pow(c-e,2);let a=Math.sqrt(h/s.length)/e;return Math.max(0,Math.min(1,1/(1+a)))}get hueStability(){var a,c,m;let n=this.unwrapHues,t=n.length;if(t<2)return 1;let s=(m=(c=n[this.baseIndex-1])!=null?c:(a=this.swatches[this.baseIndex])==null?void 0:a.hue)!=null?m:0,e=0,h=0;for(let r=0;r<t;r++){let i=Math.abs(n[r]-s)%360;i>180&&(i=360-i),e+=i*i;let l=r/(t-1)*180;h+=l*l}return Math.max(0,Math.min(1,1-Math.sqrt(e/t)/(Math.sqrt(h/t)||1)))}get contrastEfficiency(){let n=this.wcag[45].span,t=this.steps;if(t<=1)return 1;let s=.5,e=n/t,h=s*((t-1)/t);return e<=h?1:e>=1?0:(1-e)/(1-h)}get metrics(){return{lightnessLinearity:this.lightnessLinearity,chromaSmoothness:this.chromaSmoothness,spacingUniformity:this.spacingUniformity,hueStability:this.hueStability,contrastEfficiency:this.contrastEfficiency}}get score(){return P(Object.values(this.metrics))}};return $(st);})();
|
|
1
|
+
"use strict";var Chromametry=(()=>{var v=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var O=(l,t)=>{for(var s in t)v(l,s,{get:t[s],enumerable:!0})},V=(l,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of j(t))!N.call(l,e)&&e!==s&&v(l,e,{get:()=>t[e],enumerable:!(n=G(t,e))||n.enumerable});return l};var $=l=>V(v({},"__esModule",{value:!0}),l);var et={};O(et,{Palette:()=>T,Ramp:()=>q,Swatch:()=>y,calcDeltaE2000:()=>k,calcScore:()=>L,calcStatistics:()=>nt,createMonotone:()=>E,cssRgbToRgb:()=>st,fromLightnessEAL:()=>J,hexToRgb:()=>C,labToLch:()=>P,labToRgb:()=>tt,lchToLab:()=>Q,rgbToHex:()=>Z,rgbToLab:()=>S,rootMeanSquare:()=>d,toLightnessEAL:()=>_});var F=l=>{let t=s=>{let n=Math.max(0,Math.min(1,s)),e=n<=.0031308?12.92*n:1.055*Math.pow(n,1/2.4)-.055;return Math.max(0,Math.min(255,Math.round(e*255)))};return l.map(t)},K=l=>{let t=s=>s>.04045?Math.pow((s+.055)/1.055,2.4):s/12.92;return l.map(t)},Z=l=>{let[t,s,n]=F(l);return t=t.toString(16).padStart(2,"0"),s=s.toString(16).padStart(2,"0"),n=n.toString(16).padStart(2,"0"),`#${t}${s}${n}`},C=l=>{let t=parseInt(l.slice(1,3),16)/255,s=parseInt(l.slice(3,5),16)/255,n=parseInt(l.slice(5,7),16)/255;return K([t,s,n])},_=l=>{let[t,s,n]=l,e=Math.sqrt(s*s+n*n),o=(Math.atan2(n,s)*180/Math.PI+360)%360,a=.1644,u=.0603,r=.1307,i=.006,m=a*Math.abs(Math.sin((o-90)/2*(Math.PI/180)))+u,c=0;return(o<=90||o>=270)&&(c=r*Math.abs(Math.cos(o*(Math.PI/180)))+i),t+(m+c)*e},J=(l,t)=>{let[,s,n]=t,e=Math.sqrt(s*s+n*n),o=(Math.atan2(n,s)*180/Math.PI+360)%360,a=.1644,u=.0603,r=.1307,i=.006,m=a*Math.abs(Math.sin((o-90)/2*(Math.PI/180)))+u,c=0;return(o<=90||o>=270)&&(c=r*Math.abs(Math.cos(o*(Math.PI/180)))+i),Math.max(0,l-(m+c)*e)},Q=l=>{let[t,s,n]=l,e=n*Math.PI/180;return[t,s*Math.cos(e),s*Math.sin(e)]},S=l=>{let[t,s,n]=l,e=.4124564*t+.3575761*s+.1804375*n,h=.2126729*t+.7151522*s+.072175*n,o=.0193339*t+.119192*s+.9503041*n,a=.95047,u=1,r=1.08883,i=g=>g>.008856?Math.cbrt(g):7.787*g+16/116,m=i(e/a),c=i(h/u),p=i(o/r);return[116*c-16,500*(m-c),200*(c-p)]},tt=l=>{let[t,s,n]=l,e=(t+16)/116,h=s/500+e,o=e-n/200,a=g=>g**3>.008856?g**3:(g-16/116)/7.787,u=.95047,r=1,i=1.08883,m=a(h)*u,c=a(e)*r,p=a(o)*i;return[3.2404542*m-1.5371385*c-.4985314*p,-.969266*m+1.8760108*c+.041556*p,.0556434*m-.2040259*c+1.0572252*p]},P=l=>{let[t,s,n]=l,e=Math.sqrt(s*s+n*n);if(e<1e-4)return[t,0,0];let o=(Math.atan2(n,s)*180/Math.PI+360)%360;return o>=359.9999&&(o=0),[t,e,o]},k=(l,t)=>{let[s,n,e]=l,[h,o,a]=t,u=(s+h)/2,r=Math.sqrt(n*n+e*e),i=Math.sqrt(o*o+a*a),m=(r+i)/2,c=.5*(1-Math.sqrt(Math.pow(m,7)/(Math.pow(m,7)+Math.pow(25,7)))),p=n*(1+c),g=o*(1+c),M=Math.sqrt(p*p+e*e),b=Math.sqrt(g*g+a*a),w=(M+b)/2,x=Math.atan2(e,p)*180/Math.PI+(Math.atan2(e,p)<0?360:0),f=Math.atan2(a,g)*180/Math.PI+(Math.atan2(a,g)<0?360:0),R=f-x;Math.abs(R)>180&&(R+=f<=x?360:-360);let I=Math.abs(x-f)>180?(x+f+360)/2:(x+f)/2,Y=1-.17*Math.cos((I-30)*Math.PI/180)+.24*Math.cos(2*I*Math.PI/180)+.32*Math.cos((3*I+6)*Math.PI/180)-.2*Math.cos((4*I-63)*Math.PI/180),U=h-s,B=b-M,A=2*Math.sqrt(M*b)*Math.sin(R/2*Math.PI/180),W=1+.015*Math.pow(u-50,2)/Math.sqrt(20+Math.pow(u-50,2)),D=1+.045*w,H=1+.015*w*Y,X=30*Math.exp(-Math.pow((I-275)/25,2)),z=-(2*Math.sqrt(Math.pow(w,7)/(Math.pow(w,7)+Math.pow(25,7))))*Math.sin(2*X*Math.PI/180);return Math.sqrt(Math.pow(U/W,2)+Math.pow(B/D,2)+Math.pow(A/H,2)+z*(B/D)*(A/H))},st=l=>{let t=l.match(/\d+(\.\d+)?/g);if(!t||t.length<3)throw new Error("Invalid CSS rgb()");let s=n=>{let e=n/255;return e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)};return[s(Number(t[0])),s(Number(t[1])),s(Number(t[2]))]},E=l=>{if(l.length<1)return r=>0;let t=[...l].sort((r,i)=>r[0]-i[0]),s=[];for(let r=0;r<t.length;r++)(r===0||t[r][0]!==t[r-1][0])&&s.push(t[r]);let n=s.length;if(n===1)return r=>s[0][1];let e=s.map(r=>r[0]),h=s.map(r=>r[1]),o=[],a=[];for(let r=0;r<n-1;r++)o[r]=e[r+1]-e[r],a[r]=(h[r+1]-h[r])/o[r];let u=new Array(n);u[0]=a[0],u[n-1]=a[n-2];for(let r=1;r<n-1;r++){let i=a[r-1],m=a[r];if(i*m<=0)u[r]=0;else{let c=(1+o[r]/(o[r-1]+o[r]))/3;u[r]=i*m/((1-c)*i+c*m)}}return r=>{if(r<=e[0])return h[0];if(r>=e[n-1])return h[n-1];let i=0,m=n-2,c=0;for(;i<=m;){let f=Math.floor((i+m)/2);if(r>=e[f]&&r<=e[f+1]){c=f;break}r<e[f]?m=f-1:i=f+1}let p=o[c],g=(r-e[c])/p,M=g*g,b=M*g,w=u[c]*p,x=u[c+1]*p;return(2*b-3*M+1)*h[c]+(b-2*M+g)*w+(-2*b+3*M)*h[c+1]+(b-M)*x}};function d(l){let t=l.length;if(t===0)return 0;let s=0;for(let n=0;n<t;n++)s+=l[n]*l[n];return Math.sqrt(s/t)}var nt=l=>{let t=l.length;if(t===0)return{min:0,max:0,avg:0};let s=l[0],n=l[0],e=0;for(let h=0;h<t;h++){let o=l[h];o<s&&(s=o),o>n&&(n=o),e+=o}return{min:s,max:n,avg:e/t}},L=l=>{let t=l.length;if(t===0)return 0;let s=1e-6,n=l.reduce((o,a)=>o*(a+s),1),e=Math.pow(n,1/t),h=Math.max(0,Math.min(1,e));return parseFloat((h*100).toFixed(2))};var y=class{constructor(t){this.hex=t}get rgb(){return C(this.hex)}get lab(){return S(this.rgb)}get lch(){return P(this.lab)}get lightness(){let[t,s,n]=this.lab,e=Math.sqrt(s*s+n*n),o=(Math.atan2(n,s)*180/Math.PI+360)%360,a=.1644,u=.0603,r=.1307,i=.006,m=a*Math.abs(Math.sin((o-90)/2*(Math.PI/180)))+u,c=0;return(o<=90||o>=270)&&(c=r*Math.abs(Math.cos(o*(Math.PI/180)))+i),t+(m+c)*e}get chroma(){return this.lch[1]}get hue(){return this.lch[2]}get luminance(){let[t,s,n]=this.rgb;return .2126*t+.7152*s+.0722*n}get wcag(){return(Math.max(this.luminance,1)+.05)/(Math.min(this.luminance,1)+.05)}get apca(){let t=h=>h>5e-4?h:h+Math.pow(5e-4-h,.8),s=t(this.luminance),n=t(1),e=(Math.pow(s,.56)-Math.pow(n,.56))*100;return Math.abs(e)<.1?0:(e=e>0?e<1?0:e-.25:e>-1?0:e+.25,Math.round(e))}};var q=class{constructor(t=[],s="brand"){this.swatches=t.map(n=>new y(n)),this.name=s}get colors(){return this.swatches.map(t=>t.hex)}get peakChroma(){let t=this.colors.slice(2,-2),s="",n=-1/0;for(let e of t){let h=new y(e);h.chroma>n&&(n=h.chroma,s=e)}return n<6?this.colors[Math.ceil(this.steps/2)]:s}get steps(){return this.colors.length}get direction(){if(this.colors.length===0)return"lighten";let t=S(C(this.colors[0])),s=S(C(this.colors[this.colors.length-1]));return t[0]>s[0]?"darken":"lighten"}get baseColor(){return this.colors.length===0?"":this.peakChroma||this.colors[Math.floor(this.colors.length/2)]}get baseIndex(){return this.colors.length===0?-1:this.colors.findIndex(t=>t.toLowerCase()===this.baseColor.toLowerCase())}get wcag(){let t=this.swatches,s=t.length,n=s-1,e={};for(let h of[30,45,70]){let o=h/10,a=n,u=0;for(let r=1;r<s;r++){let i=1/0;for(let m=0;m<s-r;m++){let c=t[m].luminance,p=t[m+r].luminance,g=(Math.max(c,p)+.05)/(Math.min(c,p)+.05);g<i&&(i=g)}if(i>=o){a=r,u=i;break}r===n&&(u=i)}e[h]={efficiency:a/n,target:o,span:a,value:u}}return e}get apca(){let t=this.swatches,s=t.length,n=s-1,e={},h=(o,a)=>{let i=o<.022?o+Math.pow(.022-o,1.414):o,m=a<.022?a+Math.pow(.022-a,1.414):a,c=m>=i?(Math.pow(m,.56)-Math.pow(i,.57))*114:(Math.pow(m,.65)-Math.pow(i,.62))*114;return Math.abs(c)<10?0:(c=c>0?c-2.7:c+2.7,Math.round(c))};for(let o of[45,60,75]){let a=o,u=n,r=0;for(let i=1;i<s;i++){let m=1/0;for(let c=0;c<s-i;c++){let p=t[c].luminance>t[c+i].luminance?t[c].luminance:t[c+i].luminance,g=t[c].luminance>t[c+i].luminance?t[c+i].luminance:t[c].luminance,M=Math.abs(h(g,p));M<m&&(m=M)}if(m>=a){u=i,r=m;break}i===n&&(r=m)}e[o]={efficiency:u/n,target:a,span:u,value:r}}return e}get contrasts(){return{wcag:this.wcag,apca:this.apca}}get deltaECurve(){let t=[0];for(let s=1;s<this.swatches.length;s++){let n=k(this.swatches[s-1].lab,this.swatches[s].lab);t.push(t[s-1]+n)}return t}get unwrapHues(){let t=this.swatches.map(n=>n.hue).slice(1,-1);if(t.length===0)return[];let s=[t[0]];for(let n=1;n<t.length;n++){let e=t[n]-t[n-1];e>180?e-=360:e<-180&&(e+=360),s.push(s[n-1]+e)}return s}get lightnessLinearity(){let t=this.swatches.map(p=>p.lightness),s=t.length;if(s<2)return 1;let n=0,e=0,h=0,o=0;for(let p=0;p<s;p++)n+=p,e+=t[p],h+=p*t[p],o+=p*p;let a=s*o-n*n;if(Math.abs(a)<1e-10)return 1;let u=(s*h-n*e)/a,r=(e-u*n)/s;if(Math.abs(u*(s-1))<.001)return 1;let m=0,c=0;for(let p=0;p<s;p++){let g=u*p+r,M=t[p]-g;m+=M*M;let b=Math.max(g-Math.min(r,u*(s-1)+r),Math.max(r,u*(s-1)+r)-g);c+=b*b}return Math.max(0,Math.min(1,1-Math.sqrt(m/s)/Math.sqrt(c/s)))}get chromaSmoothness(){let t=this.swatches.map(c=>c.chroma),s=t.length;if(s<3)return 1;let n=133.8,e=Math.max(...t);if(e<=.01)return 1;let h=t.map(c=>c/e*n),o=Math.min(...h),a=Math.max(...h),u=h.findIndex(c=>c===a),r=E([[0,h[0]],[u,a],[s-1,h[s-1]]]),i=0,m=0;for(let c=0;c<s;c++){let p=r(c),g=h[c]-p;i+=g*g,m+=Math.pow(Math.max(p-o,a-p),2)}return Math.max(0,Math.min(1,1-Math.sqrt(i/s)/Math.sqrt(m/s)))}get spacingUniformity(){let t=this.deltaECurve,s=t.length;if(s<2)return 1;let n=[];for(let a=1;a<s;a++){let u=t[a]-t[a-1];if(u<0)return 0;n.push(u)}let e=n.reduce((a,u)=>a+u,0)/n.length;if(e<=1e-6)return 0;let h=0;for(let a of n)h+=Math.pow(a-e,2);let o=Math.sqrt(h/n.length)/e;return Math.max(0,Math.min(1,1/(1+o)))}get hueStability(){var o,a,u;let t=this.unwrapHues,s=t.length;if(s<2)return 1;let n=(u=(a=t[this.baseIndex-1])!=null?a:(o=this.swatches[this.baseIndex])==null?void 0:o.hue)!=null?u:0,e=0,h=0;for(let r=0;r<s;r++){let i=Math.abs(t[r]-n)%360;i>180&&(i=360-i),e+=i*i;let m=r/(s-1)*180;h+=m*m}return Math.max(0,Math.min(1,1-Math.sqrt(e/s)/(Math.sqrt(h/s)||1)))}get contrastEfficiency(){let t=this.wcag[45].span,s=this.steps;if(s<=1)return 1;let n=.501,e=t/(s-1);return e<=n?1:e>=1?0:1-(e-n)/(1-n)}get metrics(){return{lightnessLinearity:this.lightnessLinearity,chromaSmoothness:this.chromaSmoothness,spacingUniformity:this.spacingUniformity,hueStability:this.hueStability,contrastEfficiency:this.contrastEfficiency}}get score(){return L(Object.values(this.metrics))}};var T=class{constructor(t={},s="Collection 1"){this.ramps=Object.entries(t).map(([n,e])=>new q(e,n)),this.name=s}get colors(){return Object.fromEntries(this.ramps.map(t=>[t.name,t.colors]))}get steps(){var t;return((t=this.ramps[0])==null?void 0:t.steps)||0}get wcag(){let t={},s=this.steps;for(let n of[30,45,70]){let e=this.ramps.map(a=>a.wcag[n]),h=Math.max(0,...e.map(a=>(a==null?void 0:a.span)||0)),o=e.reduce((a,u)=>a+((u==null?void 0:u.value)||0),0);t[n]={target:n/10,span:h,value:o/(this.ramps.length||1),efficiency:s>1?h/(s-1):0}}return t}get apca(){let t={},s=this.steps;for(let n of[45,60,75]){let e=this.ramps.map(a=>a.apca[n]),h=Math.max(0,...e.map(a=>(a==null?void 0:a.span)||0)),o=e.reduce((a,u)=>a+((u==null?void 0:u.value)||0),0);t[n]={target:n,span:h,value:o/(this.ramps.length||1),efficiency:s>1?h/(s-1):0}}return t}get contrastEfficiency(){return d(this.ramps.map(t=>t.contrastEfficiency))}get lightnessLinearity(){return d(this.ramps.map(t=>t.lightnessLinearity))}get chromaSmoothness(){return d(this.ramps.map(t=>t.chromaSmoothness))}get hueStability(){return d(this.ramps.map(t=>t.hueStability))}get spacingUniformity(){return d(this.ramps.map(t=>t.spacingUniformity))}get score(){return L([this.contrastEfficiency,this.lightnessLinearity,this.chromaSmoothness,this.hueStability,this.spacingUniformity])}};return $(et);})();
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var z=m=>{let n=t=>{let s=Math.max(0,Math.min(1,t)),e=s<=.0031308?12.92*s:1.055*Math.pow(s,1/2.4)-.055;return Math.max(0,Math.min(255,Math.round(e*255)))};return m.map(n)},G=m=>{let n=t=>t>.04045?Math.pow((t+.055)/1.055,2.4):t/12.92;return m.map(n)},U=m=>{let[n,t,s]=z(m);return n=n.toString(16).padStart(2,"0"),t=t.toString(16).padStart(2,"0"),s=s.toString(16).padStart(2,"0"),`#${n}${t}${s}`},C=m=>{let n=parseInt(m.slice(1,3),16)/255,t=parseInt(m.slice(3,5),16)/255,s=parseInt(m.slice(5,7),16)/255;return G([n,t,s])},V=m=>{let[n,t,s]=m,e=Math.sqrt(t*t+s*s),a=(Math.atan2(s,t)*180/Math.PI+360)%360,c=.1644,l=.0603,r=.1307,i=.006,u=c*Math.abs(Math.sin((a-90)/2*(Math.PI/180)))+l,o=0;return(a<=90||a>=270)&&(o=r*Math.abs(Math.cos(a*(Math.PI/180)))+i),n+(u+o)*e},W=(m,n)=>{let[,t,s]=n,e=Math.sqrt(t*t+s*s),a=(Math.atan2(s,t)*180/Math.PI+360)%360,c=.1644,l=.0603,r=.1307,i=.006,u=c*Math.abs(Math.sin((a-90)/2*(Math.PI/180)))+l,o=0;return(a<=90||a>=270)&&(o=r*Math.abs(Math.cos(a*(Math.PI/180)))+i),Math.max(0,m-(u+o)*e)},$=m=>{let[n,t,s]=m,e=s*Math.PI/180;return[n,t*Math.cos(e),t*Math.sin(e)]},I=m=>{let[n,t,s]=m,e=.4124564*n+.3575761*t+.1804375*s,h=.2126729*n+.7151522*t+.072175*s,a=.0193339*n+.119192*t+.9503041*s,c=.95047,l=1,r=1.08883,i=b=>b>.008856?Math.cbrt(b):7.787*b+16/116,u=i(e/c),o=i(h/l),M=i(a/r);return[116*o-16,500*(u-o),200*(o-M)]},F=m=>{let[n,t,s]=m,e=(n+16)/116,h=t/500+e,a=e-s/200,c=b=>b**3>.008856?b**3:(b-16/116)/7.787,l=.95047,r=1,i=1.08883,u=c(h)*l,o=c(e)*r,M=c(a)*i;return[3.2404542*u-1.5371385*o-.4985314*M,-.969266*u+1.8760108*o+.041556*M,.0556434*u-.2040259*o+1.0572252*M]},P=m=>{let[n,t,s]=m,e=Math.sqrt(t*t+s*s);if(e<1e-4)return[n,0,0];let a=(Math.atan2(s,t)*180/Math.PI+360)%360;return a>=359.9999&&(a=0),[n,e,a]},y=(m,n)=>{let[t,s,e]=m,[h,a,c]=n,l=(t+h)/2,r=Math.sqrt(s*s+e*e),i=Math.sqrt(a*a+c*c),u=(r+i)/2,o=.5*(1-Math.sqrt(Math.pow(u,7)/(Math.pow(u,7)+Math.pow(25,7)))),M=s*(1+o),b=a*(1+o),f=Math.sqrt(M*M+e*e),p=Math.sqrt(b*b+c*c),d=(f+p)/2,x=Math.atan2(e,M)*180/Math.PI+(Math.atan2(e,M)<0?360:0),g=Math.atan2(c,b)*180/Math.PI+(Math.atan2(c,b)<0?360:0),q=g-x;Math.abs(q)>180&&(q+=g<=x?360:-360);let w=Math.abs(x-g)>180?(x+g+360)/2:(x+g)/2,D=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),H=h-t,L=p-f,R=2*Math.sqrt(f*p)*Math.sin(q/2*Math.PI/180),Y=1+.015*Math.pow(l-50,2)/Math.sqrt(20+Math.pow(l-50,2)),v=1+.045*d,k=1+.015*d*D,A=30*Math.exp(-Math.pow((w-275)/25,2)),X=-(2*Math.sqrt(Math.pow(d,7)/(Math.pow(d,7)+Math.pow(25,7))))*Math.sin(2*A*Math.PI/180);return Math.sqrt(Math.pow(H/Y,2)+Math.pow(L/v,2)+Math.pow(R/k,2)+X*(L/v)*(R/k))},K=m=>{let n=m.match(/\d+(\.\d+)?/g);if(!n||n.length<3)throw new Error("Invalid CSS rgb()");let t=s=>{let e=s/255;return e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)};return[t(Number(n[0])),t(Number(n[1])),t(Number(n[2]))]},E=m=>{if(m.length<1)return r=>0;let n=[...m].sort((r,i)=>r[0]-i[0]),t=[];for(let r=0;r<n.length;r++)(r===0||n[r][0]!==n[r-1][0])&&t.push(n[r]);let s=t.length;if(s===1)return r=>t[0][1];let e=t.map(r=>r[0]),h=t.map(r=>r[1]),a=[],c=[];for(let r=0;r<s-1;r++)a[r]=e[r+1]-e[r],c[r]=(h[r+1]-h[r])/a[r];let l=new Array(s);l[0]=c[0],l[s-1]=c[s-2];for(let r=1;r<s-1;r++){let i=c[r-1],u=c[r];if(i*u<=0)l[r]=0;else{let o=(1+a[r]/(a[r-1]+a[r]))/3;l[r]=i*u/((1-o)*i+o*u)}}return r=>{if(r<=e[0])return h[0];if(r>=e[s-1])return h[s-1];let i=0,u=s-2,o=0;for(;i<=u;){let g=Math.floor((i+u)/2);if(r>=e[g]&&r<=e[g+1]){o=g;break}r<e[g]?u=g-1:i=g+1}let M=a[o],b=(r-e[o])/M,f=b*b,p=f*b,d=l[o]*M,x=l[o+1]*M;return(2*p-3*f+1)*h[o]+(p-2*f+b)*d+(-2*p+3*f)*h[o+1]+(p-f)*x}};function Z(m){let n=m.length;if(n===0)return 0;let t=0;for(let s=0;s<n;s++)t+=m[s]*m[s];return Math.sqrt(t/n)}var _=m=>{let n=m.length;if(n===0)return{min:0,max:0,avg:0};let t=m[0],s=m[0],e=0;for(let h=0;h<n;h++){let a=m[h];a<t&&(t=a),a>s&&(s=a),e+=a}return{min:t,max:s,avg:e/n}},T=m=>{let n=m.length;if(n===0)return 0;let t=1e-6,s=m.reduce((a,c)=>a*(c+t),1),e=Math.pow(s,1/n),h=Math.max(0,Math.min(1,e));return parseFloat((h*100).toFixed(2))};var S=class{constructor(n){this.hex=n}get rgb(){return C(this.hex)}get lab(){return I(this.rgb)}get lch(){return P(this.lab)}get lightness(){let[n,t,s]=this.lab,e=Math.sqrt(t*t+s*s),a=(Math.atan2(s,t)*180/Math.PI+360)%360,c=.1644,l=.0603,r=.1307,i=.006,u=c*Math.abs(Math.sin((a-90)/2*(Math.PI/180)))+l,o=0;return(a<=90||a>=270)&&(o=r*Math.abs(Math.cos(a*(Math.PI/180)))+i),n+(u+o)*e}get chroma(){return this.lch[1]}get hue(){return this.lch[2]}get luminance(){let[n,t,s]=this.rgb;return .2126*n+.7152*t+.0722*s}get wcag(){return(Math.max(this.luminance,1)+.05)/(Math.min(this.luminance,1)+.05)}get apca(){let n=h=>h>5e-4?h:h+Math.pow(5e-4-h,.8),t=n(this.luminance),s=n(1),e=(Math.pow(t,.56)-Math.pow(s,.56))*100;return Math.abs(e)<.1?0:(e=e>0?e<1?0:e-.25:e>-1?0:e+.25,Math.round(e))}};var B=class{constructor(n=[],t="brand"){this.swatches=n.map(s=>new S(s)),this.name=t}get colors(){return this.swatches.map(n=>n.hex)}get peakChroma(){let n=this.colors.slice(2,-2),t="",s=-1/0;for(let e of n){let h=new S(e);h.chroma>s&&(s=h.chroma,t=e)}return s<6?this.colors[Math.ceil(this.steps/2)]:t}get steps(){return this.colors.length}get direction(){if(this.colors.length===0)return"lighten";let n=I(C(this.colors[0])),t=I(C(this.colors[this.colors.length-1]));return n[0]>t[0]?"darken":"lighten"}get baseColor(){return this.colors.length===0?"":this.peakChroma||this.colors[Math.floor(this.colors.length/2)]}get baseIndex(){return this.colors.length===0?-1:this.colors.findIndex(n=>n.toLowerCase()===this.baseColor.toLowerCase())}get wcag(){let n=this.swatches,t=n.length,s=t-1,e={};for(let h of[30,45,70]){let a=h/10,c=s,l=0;for(let r=1;r<t;r++){let i=1/0;for(let u=0;u<t-r;u++){let o=n[u].luminance,M=n[u+r].luminance,b=(Math.max(o,M)+.05)/(Math.min(o,M)+.05);b<i&&(i=b)}if(i>=a){c=r,l=i;break}r===s&&(l=i)}e[h]={efficiency:c/s,target:a,span:c,value:l}}return e}get apca(){let n=this.swatches,t=n.length,s=t-1,e={},h=(a,c)=>{let i=a<.022?a+Math.pow(.022-a,1.414):a,u=c<.022?c+Math.pow(.022-c,1.414):c,o=u>=i?(Math.pow(u,.56)-Math.pow(i,.57))*114:(Math.pow(u,.65)-Math.pow(i,.62))*114;return Math.abs(o)<10?0:(o=o>0?o-2.7:o+2.7,Math.round(o))};for(let a of[45,60,75]){let c=a,l=s,r=0;for(let i=1;i<t;i++){let u=1/0;for(let o=0;o<t-i;o++){let M=n[o].luminance>n[o+i].luminance?n[o].luminance:n[o+i].luminance,b=n[o].luminance>n[o+i].luminance?n[o+i].luminance:n[o].luminance,f=Math.abs(h(b,M));f<u&&(u=f)}if(u>=c){l=i,r=u;break}i===s&&(r=u)}e[a]={efficiency:l/s,target:c,span:l,value:r}}return e}get contrasts(){return{wcag:this.wcag,apca:this.apca}}get deltaECurve(){let n=[0];for(let t=1;t<this.swatches.length;t++){let s=y(this.swatches[t-1].lab,this.swatches[t].lab);n.push(n[t-1]+s)}return n}get unwrapHues(){let n=this.swatches.map(s=>s.hue).slice(1,-1);if(n.length===0)return[];let t=[n[0]];for(let s=1;s<n.length;s++){let e=n[s]-n[s-1];e>180?e-=360:e<-180&&(e+=360),t.push(t[s-1]+e)}return t}get lightnessLinearity(){let n=this.swatches.map(M=>M.lightness),t=n.length;if(t<2)return 1;let s=0,e=0,h=0,a=0;for(let M=0;M<t;M++)s+=M,e+=n[M],h+=M*n[M],a+=M*M;let c=t*a-s*s;if(Math.abs(c)<1e-10)return 1;let l=(t*h-s*e)/c,r=(e-l*s)/t;if(Math.abs(l*(t-1))<.001)return 1;let u=0,o=0;for(let M=0;M<t;M++){let b=l*M+r,f=n[M]-b;u+=f*f;let p=Math.max(b-Math.min(r,l*(t-1)+r),Math.max(r,l*(t-1)+r)-b);o+=p*p}return Math.max(0,Math.min(1,1-Math.sqrt(u/t)/Math.sqrt(o/t)))}get chromaSmoothness(){let n=this.swatches.map(o=>o.chroma),t=n.length;if(t<3)return 1;let s=133.8,e=Math.max(...n);if(e<=.01)return 1;let h=n.map(o=>o/e*s),a=Math.min(...h),c=Math.max(...h),l=h.findIndex(o=>o===c),r=E([[0,h[0]],[l,c],[t-1,h[t-1]]]),i=0,u=0;for(let o=0;o<t;o++){let M=r(o),b=h[o]-M;i+=b*b,u+=Math.pow(Math.max(M-a,c-M),2)}return Math.max(0,Math.min(1,1-Math.sqrt(i/t)/Math.sqrt(u/t)))}get spacingUniformity(){let n=this.deltaECurve,t=n.length;if(t<2)return 1;let s=[];for(let c=1;c<t;c++){let l=n[c]-n[c-1];if(l<0)return 0;s.push(l)}let e=s.reduce((c,l)=>c+l,0)/s.length;if(e<=1e-6)return 0;let h=0;for(let c of s)h+=Math.pow(c-e,2);let a=Math.sqrt(h/s.length)/e;return Math.max(0,Math.min(1,1/(1+a)))}get hueStability(){var a,c,l;let n=this.unwrapHues,t=n.length;if(t<2)return 1;let s=(l=(c=n[this.baseIndex-1])!=null?c:(a=this.swatches[this.baseIndex])==null?void 0:a.hue)!=null?l:0,e=0,h=0;for(let r=0;r<t;r++){let i=Math.abs(n[r]-s)%360;i>180&&(i=360-i),e+=i*i;let u=r/(t-1)*180;h+=u*u}return Math.max(0,Math.min(1,1-Math.sqrt(e/t)/(Math.sqrt(h/t)||1)))}get contrastEfficiency(){let n=this.wcag[45].span,t=this.steps;if(t<=1)return 1;let s=.5,e=n/t,h=s*((t-1)/t);return e<=h?1:e>=1?0:(1-e)/(1-h)}get metrics(){return{lightnessLinearity:this.lightnessLinearity,chromaSmoothness:this.chromaSmoothness,spacingUniformity:this.spacingUniformity,hueStability:this.hueStability,contrastEfficiency:this.contrastEfficiency}}get score(){return T(Object.values(this.metrics))}};export{B as Ramp,S as Swatch,y as calcDeltaE2000,T as calcScore,_ as calcStatistics,E as createMonotone,K as cssRgbToRgb,W as fromLightnessEAL,C as hexToRgb,P as labToLch,F as labToRgb,$ as lchToLab,U as rgbToHex,I as rgbToLab,Z as rootMeanSquare,V as toLightnessEAL};
|
|
1
|
+
var z=m=>{let t=s=>{let n=Math.max(0,Math.min(1,s)),e=n<=.0031308?12.92*n:1.055*Math.pow(n,1/2.4)-.055;return Math.max(0,Math.min(255,Math.round(e*255)))};return m.map(t)},G=m=>{let t=s=>s>.04045?Math.pow((s+.055)/1.055,2.4):s/12.92;return m.map(t)},N=m=>{let[t,s,n]=z(m);return t=t.toString(16).padStart(2,"0"),s=s.toString(16).padStart(2,"0"),n=n.toString(16).padStart(2,"0"),`#${t}${s}${n}`},S=m=>{let t=parseInt(m.slice(1,3),16)/255,s=parseInt(m.slice(3,5),16)/255,n=parseInt(m.slice(5,7),16)/255;return G([t,s,n])},O=m=>{let[t,s,n]=m,e=Math.sqrt(s*s+n*n),o=(Math.atan2(n,s)*180/Math.PI+360)%360,a=.1644,u=.0603,r=.1307,i=.006,l=a*Math.abs(Math.sin((o-90)/2*(Math.PI/180)))+u,c=0;return(o<=90||o>=270)&&(c=r*Math.abs(Math.cos(o*(Math.PI/180)))+i),t+(l+c)*e},V=(m,t)=>{let[,s,n]=t,e=Math.sqrt(s*s+n*n),o=(Math.atan2(n,s)*180/Math.PI+360)%360,a=.1644,u=.0603,r=.1307,i=.006,l=a*Math.abs(Math.sin((o-90)/2*(Math.PI/180)))+u,c=0;return(o<=90||o>=270)&&(c=r*Math.abs(Math.cos(o*(Math.PI/180)))+i),Math.max(0,m-(l+c)*e)},$=m=>{let[t,s,n]=m,e=n*Math.PI/180;return[t,s*Math.cos(e),s*Math.sin(e)]},y=m=>{let[t,s,n]=m,e=.4124564*t+.3575761*s+.1804375*n,h=.2126729*t+.7151522*s+.072175*n,o=.0193339*t+.119192*s+.9503041*n,a=.95047,u=1,r=1.08883,i=g=>g>.008856?Math.cbrt(g):7.787*g+16/116,l=i(e/a),c=i(h/u),p=i(o/r);return[116*c-16,500*(l-c),200*(c-p)]},F=m=>{let[t,s,n]=m,e=(t+16)/116,h=s/500+e,o=e-n/200,a=g=>g**3>.008856?g**3:(g-16/116)/7.787,u=.95047,r=1,i=1.08883,l=a(h)*u,c=a(e)*r,p=a(o)*i;return[3.2404542*l-1.5371385*c-.4985314*p,-.969266*l+1.8760108*c+.041556*p,.0556434*l-.2040259*c+1.0572252*p]},T=m=>{let[t,s,n]=m,e=Math.sqrt(s*s+n*n);if(e<1e-4)return[t,0,0];let o=(Math.atan2(n,s)*180/Math.PI+360)%360;return o>=359.9999&&(o=0),[t,e,o]},B=(m,t)=>{let[s,n,e]=m,[h,o,a]=t,u=(s+h)/2,r=Math.sqrt(n*n+e*e),i=Math.sqrt(o*o+a*a),l=(r+i)/2,c=.5*(1-Math.sqrt(Math.pow(l,7)/(Math.pow(l,7)+Math.pow(25,7)))),p=n*(1+c),g=o*(1+c),M=Math.sqrt(p*p+e*e),b=Math.sqrt(g*g+a*a),d=(M+b)/2,x=Math.atan2(e,p)*180/Math.PI+(Math.atan2(e,p)<0?360:0),f=Math.atan2(a,g)*180/Math.PI+(Math.atan2(a,g)<0?360:0),R=f-x;Math.abs(R)>180&&(R+=f<=x?360:-360);let C=Math.abs(x-f)>180?(x+f+360)/2:(x+f)/2,H=1-.17*Math.cos((C-30)*Math.PI/180)+.24*Math.cos(2*C*Math.PI/180)+.32*Math.cos((3*C+6)*Math.PI/180)-.2*Math.cos((4*C-63)*Math.PI/180),Y=h-s,v=b-M,P=2*Math.sqrt(M*b)*Math.sin(R/2*Math.PI/180),U=1+.015*Math.pow(u-50,2)/Math.sqrt(20+Math.pow(u-50,2)),k=1+.045*d,E=1+.015*d*H,W=30*Math.exp(-Math.pow((C-275)/25,2)),X=-(2*Math.sqrt(Math.pow(d,7)/(Math.pow(d,7)+Math.pow(25,7))))*Math.sin(2*W*Math.PI/180);return Math.sqrt(Math.pow(Y/U,2)+Math.pow(v/k,2)+Math.pow(P/E,2)+X*(v/k)*(P/E))},K=m=>{let t=m.match(/\d+(\.\d+)?/g);if(!t||t.length<3)throw new Error("Invalid CSS rgb()");let s=n=>{let e=n/255;return e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)};return[s(Number(t[0])),s(Number(t[1])),s(Number(t[2]))]},A=m=>{if(m.length<1)return r=>0;let t=[...m].sort((r,i)=>r[0]-i[0]),s=[];for(let r=0;r<t.length;r++)(r===0||t[r][0]!==t[r-1][0])&&s.push(t[r]);let n=s.length;if(n===1)return r=>s[0][1];let e=s.map(r=>r[0]),h=s.map(r=>r[1]),o=[],a=[];for(let r=0;r<n-1;r++)o[r]=e[r+1]-e[r],a[r]=(h[r+1]-h[r])/o[r];let u=new Array(n);u[0]=a[0],u[n-1]=a[n-2];for(let r=1;r<n-1;r++){let i=a[r-1],l=a[r];if(i*l<=0)u[r]=0;else{let c=(1+o[r]/(o[r-1]+o[r]))/3;u[r]=i*l/((1-c)*i+c*l)}}return r=>{if(r<=e[0])return h[0];if(r>=e[n-1])return h[n-1];let i=0,l=n-2,c=0;for(;i<=l;){let f=Math.floor((i+l)/2);if(r>=e[f]&&r<=e[f+1]){c=f;break}r<e[f]?l=f-1:i=f+1}let p=o[c],g=(r-e[c])/p,M=g*g,b=M*g,d=u[c]*p,x=u[c+1]*p;return(2*b-3*M+1)*h[c]+(b-2*M+g)*d+(-2*b+3*M)*h[c+1]+(b-M)*x}};function w(m){let t=m.length;if(t===0)return 0;let s=0;for(let n=0;n<t;n++)s+=m[n]*m[n];return Math.sqrt(s/t)}var Z=m=>{let t=m.length;if(t===0)return{min:0,max:0,avg:0};let s=m[0],n=m[0],e=0;for(let h=0;h<t;h++){let o=m[h];o<s&&(s=o),o>n&&(n=o),e+=o}return{min:s,max:n,avg:e/t}},L=m=>{let t=m.length;if(t===0)return 0;let s=1e-6,n=m.reduce((o,a)=>o*(a+s),1),e=Math.pow(n,1/t),h=Math.max(0,Math.min(1,e));return parseFloat((h*100).toFixed(2))};var I=class{constructor(t){this.hex=t}get rgb(){return S(this.hex)}get lab(){return y(this.rgb)}get lch(){return T(this.lab)}get lightness(){let[t,s,n]=this.lab,e=Math.sqrt(s*s+n*n),o=(Math.atan2(n,s)*180/Math.PI+360)%360,a=.1644,u=.0603,r=.1307,i=.006,l=a*Math.abs(Math.sin((o-90)/2*(Math.PI/180)))+u,c=0;return(o<=90||o>=270)&&(c=r*Math.abs(Math.cos(o*(Math.PI/180)))+i),t+(l+c)*e}get chroma(){return this.lch[1]}get hue(){return this.lch[2]}get luminance(){let[t,s,n]=this.rgb;return .2126*t+.7152*s+.0722*n}get wcag(){return(Math.max(this.luminance,1)+.05)/(Math.min(this.luminance,1)+.05)}get apca(){let t=h=>h>5e-4?h:h+Math.pow(5e-4-h,.8),s=t(this.luminance),n=t(1),e=(Math.pow(s,.56)-Math.pow(n,.56))*100;return Math.abs(e)<.1?0:(e=e>0?e<1?0:e-.25:e>-1?0:e+.25,Math.round(e))}};var q=class{constructor(t=[],s="brand"){this.swatches=t.map(n=>new I(n)),this.name=s}get colors(){return this.swatches.map(t=>t.hex)}get peakChroma(){let t=this.colors.slice(2,-2),s="",n=-1/0;for(let e of t){let h=new I(e);h.chroma>n&&(n=h.chroma,s=e)}return n<6?this.colors[Math.ceil(this.steps/2)]:s}get steps(){return this.colors.length}get direction(){if(this.colors.length===0)return"lighten";let t=y(S(this.colors[0])),s=y(S(this.colors[this.colors.length-1]));return t[0]>s[0]?"darken":"lighten"}get baseColor(){return this.colors.length===0?"":this.peakChroma||this.colors[Math.floor(this.colors.length/2)]}get baseIndex(){return this.colors.length===0?-1:this.colors.findIndex(t=>t.toLowerCase()===this.baseColor.toLowerCase())}get wcag(){let t=this.swatches,s=t.length,n=s-1,e={};for(let h of[30,45,70]){let o=h/10,a=n,u=0;for(let r=1;r<s;r++){let i=1/0;for(let l=0;l<s-r;l++){let c=t[l].luminance,p=t[l+r].luminance,g=(Math.max(c,p)+.05)/(Math.min(c,p)+.05);g<i&&(i=g)}if(i>=o){a=r,u=i;break}r===n&&(u=i)}e[h]={efficiency:a/n,target:o,span:a,value:u}}return e}get apca(){let t=this.swatches,s=t.length,n=s-1,e={},h=(o,a)=>{let i=o<.022?o+Math.pow(.022-o,1.414):o,l=a<.022?a+Math.pow(.022-a,1.414):a,c=l>=i?(Math.pow(l,.56)-Math.pow(i,.57))*114:(Math.pow(l,.65)-Math.pow(i,.62))*114;return Math.abs(c)<10?0:(c=c>0?c-2.7:c+2.7,Math.round(c))};for(let o of[45,60,75]){let a=o,u=n,r=0;for(let i=1;i<s;i++){let l=1/0;for(let c=0;c<s-i;c++){let p=t[c].luminance>t[c+i].luminance?t[c].luminance:t[c+i].luminance,g=t[c].luminance>t[c+i].luminance?t[c+i].luminance:t[c].luminance,M=Math.abs(h(g,p));M<l&&(l=M)}if(l>=a){u=i,r=l;break}i===n&&(r=l)}e[o]={efficiency:u/n,target:a,span:u,value:r}}return e}get contrasts(){return{wcag:this.wcag,apca:this.apca}}get deltaECurve(){let t=[0];for(let s=1;s<this.swatches.length;s++){let n=B(this.swatches[s-1].lab,this.swatches[s].lab);t.push(t[s-1]+n)}return t}get unwrapHues(){let t=this.swatches.map(n=>n.hue).slice(1,-1);if(t.length===0)return[];let s=[t[0]];for(let n=1;n<t.length;n++){let e=t[n]-t[n-1];e>180?e-=360:e<-180&&(e+=360),s.push(s[n-1]+e)}return s}get lightnessLinearity(){let t=this.swatches.map(p=>p.lightness),s=t.length;if(s<2)return 1;let n=0,e=0,h=0,o=0;for(let p=0;p<s;p++)n+=p,e+=t[p],h+=p*t[p],o+=p*p;let a=s*o-n*n;if(Math.abs(a)<1e-10)return 1;let u=(s*h-n*e)/a,r=(e-u*n)/s;if(Math.abs(u*(s-1))<.001)return 1;let l=0,c=0;for(let p=0;p<s;p++){let g=u*p+r,M=t[p]-g;l+=M*M;let b=Math.max(g-Math.min(r,u*(s-1)+r),Math.max(r,u*(s-1)+r)-g);c+=b*b}return Math.max(0,Math.min(1,1-Math.sqrt(l/s)/Math.sqrt(c/s)))}get chromaSmoothness(){let t=this.swatches.map(c=>c.chroma),s=t.length;if(s<3)return 1;let n=133.8,e=Math.max(...t);if(e<=.01)return 1;let h=t.map(c=>c/e*n),o=Math.min(...h),a=Math.max(...h),u=h.findIndex(c=>c===a),r=A([[0,h[0]],[u,a],[s-1,h[s-1]]]),i=0,l=0;for(let c=0;c<s;c++){let p=r(c),g=h[c]-p;i+=g*g,l+=Math.pow(Math.max(p-o,a-p),2)}return Math.max(0,Math.min(1,1-Math.sqrt(i/s)/Math.sqrt(l/s)))}get spacingUniformity(){let t=this.deltaECurve,s=t.length;if(s<2)return 1;let n=[];for(let a=1;a<s;a++){let u=t[a]-t[a-1];if(u<0)return 0;n.push(u)}let e=n.reduce((a,u)=>a+u,0)/n.length;if(e<=1e-6)return 0;let h=0;for(let a of n)h+=Math.pow(a-e,2);let o=Math.sqrt(h/n.length)/e;return Math.max(0,Math.min(1,1/(1+o)))}get hueStability(){var o,a,u;let t=this.unwrapHues,s=t.length;if(s<2)return 1;let n=(u=(a=t[this.baseIndex-1])!=null?a:(o=this.swatches[this.baseIndex])==null?void 0:o.hue)!=null?u:0,e=0,h=0;for(let r=0;r<s;r++){let i=Math.abs(t[r]-n)%360;i>180&&(i=360-i),e+=i*i;let l=r/(s-1)*180;h+=l*l}return Math.max(0,Math.min(1,1-Math.sqrt(e/s)/(Math.sqrt(h/s)||1)))}get contrastEfficiency(){let t=this.wcag[45].span,s=this.steps;if(s<=1)return 1;let n=.501,e=t/(s-1);return e<=n?1:e>=1?0:1-(e-n)/(1-n)}get metrics(){return{lightnessLinearity:this.lightnessLinearity,chromaSmoothness:this.chromaSmoothness,spacingUniformity:this.spacingUniformity,hueStability:this.hueStability,contrastEfficiency:this.contrastEfficiency}}get score(){return L(Object.values(this.metrics))}};var D=class{constructor(t={},s="Collection 1"){this.ramps=Object.entries(t).map(([n,e])=>new q(e,n)),this.name=s}get colors(){return Object.fromEntries(this.ramps.map(t=>[t.name,t.colors]))}get steps(){var t;return((t=this.ramps[0])==null?void 0:t.steps)||0}get wcag(){let t={},s=this.steps;for(let n of[30,45,70]){let e=this.ramps.map(a=>a.wcag[n]),h=Math.max(0,...e.map(a=>(a==null?void 0:a.span)||0)),o=e.reduce((a,u)=>a+((u==null?void 0:u.value)||0),0);t[n]={target:n/10,span:h,value:o/(this.ramps.length||1),efficiency:s>1?h/(s-1):0}}return t}get apca(){let t={},s=this.steps;for(let n of[45,60,75]){let e=this.ramps.map(a=>a.apca[n]),h=Math.max(0,...e.map(a=>(a==null?void 0:a.span)||0)),o=e.reduce((a,u)=>a+((u==null?void 0:u.value)||0),0);t[n]={target:n,span:h,value:o/(this.ramps.length||1),efficiency:s>1?h/(s-1):0}}return t}get contrastEfficiency(){return w(this.ramps.map(t=>t.contrastEfficiency))}get lightnessLinearity(){return w(this.ramps.map(t=>t.lightnessLinearity))}get chromaSmoothness(){return w(this.ramps.map(t=>t.chromaSmoothness))}get hueStability(){return w(this.ramps.map(t=>t.hueStability))}get spacingUniformity(){return w(this.ramps.map(t=>t.spacingUniformity))}get score(){return L([this.contrastEfficiency,this.lightnessLinearity,this.chromaSmoothness,this.hueStability,this.spacingUniformity])}};export{D as Palette,q as Ramp,I as Swatch,B as calcDeltaE2000,L as calcScore,Z as calcStatistics,A as createMonotone,K as cssRgbToRgb,V as fromLightnessEAL,S as hexToRgb,T as labToLch,F as labToRgb,$ as lchToLab,N as rgbToHex,y as rgbToLab,w as rootMeanSquare,O as toLightnessEAL};
|
package/package.json
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chromametry",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.3",
|
|
4
4
|
"description": "Web-accessible Color Palette Metrics",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
8
8
|
"type": "module",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
},
|
|
15
|
+
"./palettes": "./dist/palettes.js"
|
|
16
|
+
},
|
|
9
17
|
"scripts": {
|
|
10
18
|
"test": "vitest",
|
|
11
19
|
"generate": "tsx scripts/generate.ts",
|