@sardine/colour 2.3.0 → 2.4.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
@@ -1,6 +1,3 @@
1
- [![Test Coverage](https://api.codeclimate.com/v1/badges/e8d765e149b42c6bac15/test_coverage)](https://codeclimate.com/github/sardinedev/colour/test_coverage)
2
- [![npm version](https://badge.fury.io/js/%40sardine%2Fcolour.svg)](https://badge.fury.io/js/%40sardine%2Fcolour)
3
-
4
1
  <img alt="Sardine logo" src="https://colour.sardine.dev/assets/icons/logo.svg" width="300">
5
2
 
6
3
  # @sardine/colour
package/dist/index.cjs CHANGED
@@ -174,6 +174,51 @@ function convertCSSRGBtoHex(colour) {
174
174
  const rgb = convertCSSRGBtoRGB(colour);
175
175
  return convertRGBtoHex(rgb);
176
176
  }
177
+ function convertHextoRGB(hex) {
178
+ if (typeof hex !== "string") {
179
+ throw new Error(`convertHextoRGB expects a string but got a ${typeof hex}`);
180
+ }
181
+ if (hex.match(hexRegex)) {
182
+ return {
183
+ R: Number.parseInt(`${hex[1]}${hex[2]}`, 16),
184
+ G: Number.parseInt(`${hex[3]}${hex[4]}`, 16),
185
+ B: Number.parseInt(`${hex[5]}${hex[6]}`, 16)
186
+ };
187
+ }
188
+ if (hex.match(shortHexRegex)) {
189
+ return {
190
+ R: Number.parseInt(`${hex[1]}${hex[1]}`, 16),
191
+ G: Number.parseInt(`${hex[2]}${hex[2]}`, 16),
192
+ B: Number.parseInt(`${hex[3]}${hex[3]}`, 16)
193
+ };
194
+ }
195
+ if (hex.match(hexAlphaRegex)) {
196
+ return {
197
+ R: Number.parseInt(`${hex[1]}${hex[2]}`, 16),
198
+ G: Number.parseInt(`${hex[3]}${hex[4]}`, 16),
199
+ B: Number.parseInt(`${hex[5]}${hex[6]}`, 16),
200
+ A: Math.round(Number.parseInt(`${hex[7]}${hex[8]}`, 16) / 255 * 100) / 100
201
+ };
202
+ }
203
+ if (hex.match(shortAlphaHexRegex)) {
204
+ return {
205
+ R: Number.parseInt(`${hex[1]}${hex[1]}`, 16),
206
+ G: Number.parseInt(`${hex[2]}${hex[2]}`, 16),
207
+ B: Number.parseInt(`${hex[3]}${hex[3]}`, 16),
208
+ A: Math.round(Number.parseInt(`${hex[4]}${hex[4]}`, 16) / 255 * 100) / 100
209
+ };
210
+ }
211
+ throw new Error(
212
+ `convertHextoRGB expects an valid hexadecimal colour value but got ${hex}`
213
+ );
214
+ }
215
+ function convertHextoCSSRGB(hex) {
216
+ const rgb = convertHextoRGB(hex);
217
+ if (rgb.A) {
218
+ return `rgba(${rgb.R},${rgb.G},${rgb.B},${rgb.A})`;
219
+ }
220
+ return `rgb(${rgb.R},${rgb.G},${rgb.B})`;
221
+ }
177
222
  const namedCSSColours = /* @__PURE__ */ new Map([
178
223
  ["aliceblue", "#f0f8ff"],
179
224
  ["antiquewhite", "#faebd7"],
@@ -331,51 +376,6 @@ function convertHextoNamedCSSColour(colour) {
331
376
  }
332
377
  return void 0;
333
378
  }
334
- function convertHextoRGB(hex) {
335
- if (typeof hex !== "string") {
336
- throw new Error(`convertHextoRGB expects a string but got a ${typeof hex}`);
337
- }
338
- if (hex.match(hexRegex)) {
339
- return {
340
- R: Number.parseInt(`${hex[1]}${hex[2]}`, 16),
341
- G: Number.parseInt(`${hex[3]}${hex[4]}`, 16),
342
- B: Number.parseInt(`${hex[5]}${hex[6]}`, 16)
343
- };
344
- }
345
- if (hex.match(shortHexRegex)) {
346
- return {
347
- R: Number.parseInt(`${hex[1]}${hex[1]}`, 16),
348
- G: Number.parseInt(`${hex[2]}${hex[2]}`, 16),
349
- B: Number.parseInt(`${hex[3]}${hex[3]}`, 16)
350
- };
351
- }
352
- if (hex.match(hexAlphaRegex)) {
353
- return {
354
- R: Number.parseInt(`${hex[1]}${hex[2]}`, 16),
355
- G: Number.parseInt(`${hex[3]}${hex[4]}`, 16),
356
- B: Number.parseInt(`${hex[5]}${hex[6]}`, 16),
357
- A: Math.round(Number.parseInt(`${hex[7]}${hex[8]}`, 16) / 255 * 100) / 100
358
- };
359
- }
360
- if (hex.match(shortAlphaHexRegex)) {
361
- return {
362
- R: Number.parseInt(`${hex[1]}${hex[1]}`, 16),
363
- G: Number.parseInt(`${hex[2]}${hex[2]}`, 16),
364
- B: Number.parseInt(`${hex[3]}${hex[3]}`, 16),
365
- A: Math.round(Number.parseInt(`${hex[4]}${hex[4]}`, 16) / 255 * 100) / 100
366
- };
367
- }
368
- throw new Error(
369
- `convertHextoRGB expects an valid hexadecimal colour value but got ${hex}`
370
- );
371
- }
372
- function convertHextoCSSRGB(hex) {
373
- const rgb = convertHextoRGB(hex);
374
- if (rgb.A) {
375
- return `rgba(${rgb.R},${rgb.G},${rgb.B},${rgb.A})`;
376
- }
377
- return `rgb(${rgb.R},${rgb.G},${rgb.B})`;
378
- }
379
379
  function convertNamedCSSColourtoHex(name) {
380
380
  return namedCSSColours.get(name);
381
381
  }
@@ -671,5 +671,7 @@ exports.isCSSNamedDarkColour = isCSSNamedDarkColour;
671
671
  exports.isCSSRGBColour = isCSSRGBColour;
672
672
  exports.isCSSRGBDarkColour = isCSSRGBDarkColour;
673
673
  exports.isDarkColour = isDarkColour;
674
+ exports.isHexColour = isHexColour;
674
675
  exports.isHexDarkColour = isHexDarkColour;
676
+ exports.isNamedCSSColour = isNamedCSSColour;
675
677
  exports.pickHexColourContrast = pickHexColourContrast;
package/dist/index.d.ts CHANGED
@@ -2,9 +2,9 @@ export { RGBdistance } from "./RGBdistance";
2
2
  export { ciede2000 } from "./CIEDE2000";
3
3
  export { convertCSSRGBtoHex } from "./convertCSSRGBtoHex";
4
4
  export { convertCSSRGBtoRGB } from "./convertCSSRGBtoRGB";
5
+ export { convertHextoCSSRGB } from "./convertHextoCSSRGB";
5
6
  export { convertHextoNamedCSSColour } from "./convertHextoNamedCSSColour";
6
7
  export { convertHextoRGB } from "./convertHextoRGB";
7
- export { convertHextoCSSRGB } from "./convertHextoCSSRGB";
8
8
  export { convertNamedCSSColourtoHex } from "./convertNamedCSSColourtoHex";
9
9
  export { convertNamedCSSColourtoRGB } from "./convertNamedCSSColourtoRGB";
10
10
  export { convertRGBtoCSSRGB } from "./convertRGBtoCSSRGB";
@@ -28,5 +28,7 @@ export { isCSSNamedDarkColour } from "./isCSSNameDarkColour";
28
28
  export { isCSSRGBColour } from "./assertions";
29
29
  export { isCSSRGBDarkColour } from "./isCSSRGBDarkColour";
30
30
  export { isDarkColour } from "./isDarkColour";
31
+ export { isHexColour } from "./assertions";
31
32
  export { isHexDarkColour } from "./isHexDarkColour";
33
+ export { isNamedCSSColour } from "./assertions";
32
34
  export { pickHexColourContrast } from "./pickHexColourContrast";
package/dist/index.min.js CHANGED
@@ -1,7 +1,7 @@
1
- "use strict";function T(e,t){if(e===0&&t===0)return 0;const n=Math.atan2(e,t)*(180/Math.PI);return n>=0?n:n+360}function Ce({C1:e,C2:t,h1_d:n,h2_d:o}){if(e*t===0)return 0;const r=o-n;return Math.abs(r)<=180?r:r>180?r-360:r+360}function Se({C1:e,C2:t,h1_d:n,h2_d:o}){if(e*t===0)return o+n;const r=Math.abs(n-o);return r<=180?(o+n)/2:r>180&&n+o<360?(o+n+360)/2:(o+n-360)/2}const b=e=>e*(Math.PI/180),U=e=>Math.sqrt(e**7/(e**7+25**7));function g(e,t){const n=e/255,o=t?.03928:.04045;let r;return n>o?r=((n+.055)/1.055)**2.4:r=n/12.92,r}function y(e){const t=.20689655172413793,n=t**3;let o;return e>n?o=Math.cbrt(e):o=e/(3*t**2)+4/29,o}function pe(e,t,n){return Math.min(Math.max(e,t),n)}function j(e,t){const n=e.L,o=e.a,r=e.b,a=t.L,s=t.a,c=t.b,f=1,m=1,G=1,h=Math.sqrt(o**2+r**2),C=Math.sqrt(s**2+c**2),ue=a-n,le=(h+C)/2,P=.5*(1-U(le)),A=o*(1+P),F=s*(1+P),B=Math.sqrt(A**2+r**2),k=Math.sqrt(F**2+c**2),w=(B+k)/2,E=k-B,Y=T(r,A),X=T(c,F),de=Ce({C1:h,C2:C,h1_d:Y,h2_d:X}),Z=2*Math.sqrt(B*k)*Math.sin(b(de)/2),S=Se({C1:h,C2:C,h1_d:Y,h2_d:X}),D=(n+a)/2,me=1-.17*Math.cos(b(S-30))+.24*Math.cos(b(2*S))+.32*Math.cos(b(3*S+6))-.2*Math.cos(b(4*S-63)),be=1+.015*(D-50)**2/Math.sqrt(20+(D-50)**2),z=.045*w+1,_=1+.015*w*me,ge=30*Math.exp(-(((S-275)/25)**2)),he=-2*U(w)*Math.sin(b(ge*2));return Math.sqrt((ue/(f*be))**2+(E/(m*z))**2+(Z/(G*_))**2+he*(E/(m*z))*(Z/(G*_)))}function O(e){const{R:t,G:n,B:o}=e,r=g(t)*100,a=g(n)*100,s=g(o)*100,c=r*.4124+a*.3576+s*.1805,f=r*.2126+a*.7152+s*.0722,m=r*.0193+a*.1192+s*.9505;return{X:c,Y:f,Z:m}}function V(e){const{X:t,Y:n,Z:o}=e,r=t/95.047,a=n/100,s=o/108.883,c=y(r),f=y(a),m=y(s),G=116*f-16,h=500*(c-f),C=200*(f-m);return{L:G,a:h,b:C}}function N(e){const t=O(e);return V(t)}const J=(e,t)=>{const n=N(e),o=N(t);return j(n,o)},K=/^#[a-fA-F0-9]{6}$/,Q=/^#[a-fA-F0-9]{8}$/,ee=/^#[a-fA-F0-9]{3}$/,te=/^#[a-fA-F0-9]{4}$/,ne=/^rgba*\(\s*([-+]?\d+)\s*(?:,)?\s*([-+]?\d+)\s*(?:,)?\s*([-+]?\d+)\s*(?:,*|\/*)\s*([-+]?\d*[.]?\d+[%]?)*\)$/i;function i(e){const t=e.match(ne);if(!t)throw new Error(`convertCSSRGBtoHex expects a valid CSS RGB string but got ${e}`);const n=o=>o?Number.parseFloat(o):void 0;return{R:n(t[1]),G:n(t[2]),B:n(t[3]),A:n(t[4])}}function p({R:e,G:t,B:n,A:o}){const r=a=>pe(a,0,255).toString(16).padStart(2,"0");return`#${r(e)}${r(t)}${r(n)}${o?r(Math.round(o*255)):""}`}function M(e){const t=i(e);return p(t)}const H=new Map([["aliceblue","#f0f8ff"],["antiquewhite","#faebd7"],["aqua","#00ffff"],["aquamarine","#7fffd4"],["azure","#f0ffff"],["beige","#f5f5dc"],["bisque","#ffe4c4"],["black","#000000"],["blanchedalmond","#ffebcd"],["blue","#0000ff"],["blueviolet","#8a2be2"],["brown","#a52a2a"],["burlywood","#deb887"],["cadetblue","#5f9ea0"],["chartreuse","#7fff00"],["chocolate","#d2691e"],["coral","#ff7f50"],["cornflowerblue","#6495ed"],["cornsilk","#fff8dc"],["crimson","#dc143c"],["cyan","#00ffff"],["darkblue","#00008b"],["darkcyan","#008b8b"],["darkgoldenrod","#b8860b"],["darkgray","#a9a9a9"],["darkgreen","#006400"],["darkgrey","#a9a9a9"],["darkkhaki","#bdb76b"],["darkmagenta","#8b008b"],["darkolivegreen","#556b2f"],["darkorange","#ff8c00"],["darkorchid","#9932cc"],["darkred","#8b0000"],["darksalmon","#e9967a"],["darkseagreen","#8fbc8f"],["darkslateblue","#483d8b"],["darkslategray","#2f4f4f"],["darkslategrey","#2f4f4f"],["darkturquoise","#00ced1"],["darkviolet","#9400d3"],["deeppink","#ff1493"],["deepskyblue","#00bfff"],["dimgray","#696969"],["dimgrey","#696969"],["dodgerblue","#1e90ff"],["firebrick","#b22222"],["floralwhite","#fffaf0"],["forestgreen","#228b22"],["fuchsia","#ff00ff"],["gainsboro","#dcdcdc"],["ghostwhite","#f8f8ff"],["gold","#ffd700"],["goldenrod","#daa520"],["gray","#808080"],["green","#008000"],["greenyellow","#adff2f"],["grey","#808080"],["honeydew","#f0fff0"],["hotpink","#ff69b4"],["indianred","#cd5c5c"],["indigo","#4b0082"],["ivory","#fffff0"],["khaki","#f0e68c"],["lavender","#e6e6fa"],["lavenderblush","#fff0f5"],["lawngreen","#7cfc00"],["lemonchiffon","#fffacd"],["lightblue","#add8e6"],["lightcoral","#f08080"],["lightcyan","#e0ffff"],["lightgoldenrodyellow","#fafad2"],["lightgray","#d3d3d3"],["lightgreen","#90ee90"],["lightgrey","#d3d3d3"],["lightpink","#ffb6c1"],["lightsalmon","#ffa07a"],["lightseagreen","#20b2aa"],["lightskyblue","#87cefa"],["lightslategray","#778899"],["lightslategrey","#778899"],["lightsteelblue","#b0c4de"],["lightyellow","#ffffe0"],["lime","#00ff00"],["limegreen","#32cd32"],["linen","#faf0e6"],["magenta","#ff00ff"],["maroon","#800000"],["mediumaquamarine","#66cdaa"],["mediumblue","#0000cd"],["mediumorchid","#ba55d3"],["mediumpurple","#9370db"],["mediumseagreen","#3cb371"],["mediumslateblue","#7b68ee"],["mediumspringgreen","#00fa9a"],["mediumturquoise","#48d1cc"],["mediumvioletred","#c71585"],["midnightblue","#191970"],["mintcream","#f5fffa"],["mistyrose","#ffe4e1"],["moccasin","#ffe4b5"],["navajowhite","#ffdead"],["navy","#000080"],["oldlace","#fdf5e6"],["olive","#808000"],["olivedrab","#6b8e23"],["orangered","#ff4500"],["orchid","#da70d6"],["palegoldenrod","#eee8aa"],["palegreen","#98fb98"],["paleturquoise","#afeeee"],["palevioletred","#db7093"],["papayawhip","#ffefd5"],["peachpuff","#ffdab9"],["peru","#cd853f"],["pink","#ffc0cb"],["plum","#dda0dd"],["powderblue","#b0e0e6"],["purple","#800080"],["red","#ff0000"],["rosybrown","#bc8f8f"],["royalblue","#4169e1"],["saddlebrown","#8b4513"],["salmon","#fa8072"],["sandybrown","#f4a460"],["seagreen","#2e8b57"],["seashell","#fff5ee"],["sienna","#a0522d"],["silver","#c0c0c0"],["skyblue","#87ceeb"],["slateblue","#6a5acd"],["slategray","#708090"],["slategrey","#708090"],["snow","#fffafa"],["springgreen","#00ff7f"],["steelblue","#4682b4"],["tan","#d2b48c"],["teal","#008080"],["thistle","#d8bfd8"],["tomato","#ff6347"],["transparent","#00000000"],["turquoise","#40e0d0"],["violet","#ee82ee"],["wheat","#f5deb3"],["white","#ffffff"],["whitesmoke","#f5f5f5"],["yellow","#ffff00"],["yellowgreen","#9acd32"]]);function re(e){for(const[t,n]of H.entries())if(n===e)return t}function u(e){if(typeof e!="string")throw new Error(`convertHextoRGB expects a string but got a ${typeof e}`);if(e.match(K))return{R:Number.parseInt(`${e[1]}${e[2]}`,16),G:Number.parseInt(`${e[3]}${e[4]}`,16),B:Number.parseInt(`${e[5]}${e[6]}`,16)};if(e.match(ee))return{R:Number.parseInt(`${e[1]}${e[1]}`,16),G:Number.parseInt(`${e[2]}${e[2]}`,16),B:Number.parseInt(`${e[3]}${e[3]}`,16)};if(e.match(Q))return{R:Number.parseInt(`${e[1]}${e[2]}`,16),G:Number.parseInt(`${e[3]}${e[4]}`,16),B:Number.parseInt(`${e[5]}${e[6]}`,16),A:Math.round(Number.parseInt(`${e[7]}${e[8]}`,16)/255*100)/100};if(e.match(te))return{R:Number.parseInt(`${e[1]}${e[1]}`,16),G:Number.parseInt(`${e[2]}${e[2]}`,16),B:Number.parseInt(`${e[3]}${e[3]}`,16),A:Math.round(Number.parseInt(`${e[4]}${e[4]}`,16)/255*100)/100};throw new Error(`convertHextoRGB expects an valid hexadecimal colour value but got ${e}`)}function Re(e){const t=u(e);return t.A?`rgba(${t.R},${t.G},${t.B},${t.A})`:`rgb(${t.R},${t.G},${t.B})`}function l(e){return H.get(e)}function R(e){const t=l(e);if(t)return u(t)}function q({R:e,G:t,B:n,A:o}){return`rgb(${e} ${t} ${n}${o?` / ${o}`:""})`}function I(e){const t=p(e);return re(t)}function $(e,t){if(!t||t.length<2)return e;const n=[];for(const r of t){const a=J(e,r);n.push([r,a])}return n.sort((r,a)=>r[1]-a[1])[0][0]}function $e(e,t){if(!t||t.length<2)return e;const n=i(e),o=t.map(a=>i(a)),r=$(n,o);return q(r)}function L(e){return!!e.match(ne)}function oe(e){return!!e.match(K)||!!e.match(Q)||!!e.match(te)||!!e.match(ee)}function ae(e){return H.has(e)}function ve(e,t){if(!t||t.length<2)return e;let n,o;const r=[];if(oe(e)&&(n=u(e),o="hex"),L(e)&&(n=i(e),o="cssRGB"),ae(e)&&(n=R(e),o="namedCSS"),!n)return;for(const s of t)oe(s)&&r.push(u(s)),L(s)&&r.push(i(s)),ae(s)&&r.push(R(s));if(r.length<2)return e;const a=$(n,r);return o==="hex"?p(a):o==="cssRGB"?q(a):I(a)}function Ge(e,t){if(!t||t.length<2)return e;const n=u(e),o=t.map(a=>u(a)),r=$(n,o);return p(r)}function Be(e,t){if(!t||t.length<2)return e;const n=R(e),r=t.map(s=>R(s)).filter(s=>s!==void 0);if(!n||r.length<2)return e;const a=$(n,r);return I(a)}function v({R:e,G:t,B:n},o){const r=o==="WCAG2.1",a=g(e,r),s=g(t,r),c=g(n,r);return .2126*a+.7152*s+.0722*c}function d(e,t){const n=u(e);return v(n,t)}function se(e,t){const n=Math.max(e,t),o=Math.min(e,t),r=(n+.05)/(o+.05);return Math.floor(r*1e3)/1e3}function W(e,t,n){const o=d(e,n),r=d(t,n);return se(o,r)}function ke(e,t,n){let o,r;if(e.startsWith("#"))o=e;else if(e.startsWith("rgb"))o=M(e);else{const a=l(e);if(a===void 0)throw new Error(`getContrastRatio expects valid CSS named colours.
1
+ "use strict";function j(e,t){if(e===0&&t===0)return 0;const n=Math.atan2(e,t)*(180/Math.PI);return n>=0?n:n+360}function Ce({C1:e,C2:t,h1_d:n,h2_d:o}){if(e*t===0)return 0;const r=o-n;return Math.abs(r)<=180?r:r>180?r-360:r+360}function Se({C1:e,C2:t,h1_d:n,h2_d:o}){if(e*t===0)return o+n;const r=Math.abs(n-o);return r<=180?(o+n)/2:r>180&&n+o<360?(o+n+360)/2:(o+n-360)/2}const b=e=>e*(Math.PI/180),O=e=>Math.sqrt(e**7/(e**7+25**7));function g(e,t){const n=e/255,o=t?.03928:.04045;let r;return n>o?r=((n+.055)/1.055)**2.4:r=n/12.92,r}function y(e){const t=.20689655172413793,n=t**3;let o;return e>n?o=Math.cbrt(e):o=e/(3*t**2)+4/29,o}function pe(e,t,n){return Math.min(Math.max(e,t),n)}function V(e,t){const n=e.L,o=e.a,r=e.b,a=t.L,s=t.a,c=t.b,f=1,m=1,G=1,h=Math.sqrt(o**2+r**2),C=Math.sqrt(s**2+c**2),ue=a-n,le=(h+C)/2,F=.5*(1-O(le)),E=o*(1+F),Y=s*(1+F),B=Math.sqrt(E**2+r**2),k=Math.sqrt(Y**2+c**2),w=(B+k)/2,X=k-B,Z=j(r,E),D=j(c,Y),de=Ce({C1:h,C2:C,h1_d:Z,h2_d:D}),z=2*Math.sqrt(B*k)*Math.sin(b(de)/2),S=Se({C1:h,C2:C,h1_d:Z,h2_d:D}),_=(n+a)/2,me=1-.17*Math.cos(b(S-30))+.24*Math.cos(b(2*S))+.32*Math.cos(b(3*S+6))-.2*Math.cos(b(4*S-63)),be=1+.015*(_-50)**2/Math.sqrt(20+(_-50)**2),T=.045*w+1,U=1+.015*w*me,ge=30*Math.exp(-(((S-275)/25)**2)),he=-2*O(w)*Math.sin(b(ge*2));return Math.sqrt((ue/(f*be))**2+(X/(m*T))**2+(z/(G*U))**2+he*(X/(m*T))*(z/(G*U)))}function J(e){const{R:t,G:n,B:o}=e,r=g(t)*100,a=g(n)*100,s=g(o)*100,c=r*.4124+a*.3576+s*.1805,f=r*.2126+a*.7152+s*.0722,m=r*.0193+a*.1192+s*.9505;return{X:c,Y:f,Z:m}}function K(e){const{X:t,Y:n,Z:o}=e,r=t/95.047,a=n/100,s=o/108.883,c=y(r),f=y(a),m=y(s),G=116*f-16,h=500*(c-f),C=200*(f-m);return{L:G,a:h,b:C}}function N(e){const t=J(e);return K(t)}const Q=(e,t)=>{const n=N(e),o=N(t);return V(n,o)},ee=/^#[a-fA-F0-9]{6}$/,te=/^#[a-fA-F0-9]{8}$/,ne=/^#[a-fA-F0-9]{3}$/,re=/^#[a-fA-F0-9]{4}$/,oe=/^rgba*\(\s*([-+]?\d+)\s*(?:,)?\s*([-+]?\d+)\s*(?:,)?\s*([-+]?\d+)\s*(?:,*|\/*)\s*([-+]?\d*[.]?\d+[%]?)*\)$/i;function i(e){const t=e.match(oe);if(!t)throw new Error(`convertCSSRGBtoHex expects a valid CSS RGB string but got ${e}`);const n=o=>o?Number.parseFloat(o):void 0;return{R:n(t[1]),G:n(t[2]),B:n(t[3]),A:n(t[4])}}function p({R:e,G:t,B:n,A:o}){const r=a=>pe(a,0,255).toString(16).padStart(2,"0");return`#${r(e)}${r(t)}${r(n)}${o?r(Math.round(o*255)):""}`}function M(e){const t=i(e);return p(t)}function u(e){if(typeof e!="string")throw new Error(`convertHextoRGB expects a string but got a ${typeof e}`);if(e.match(ee))return{R:Number.parseInt(`${e[1]}${e[2]}`,16),G:Number.parseInt(`${e[3]}${e[4]}`,16),B:Number.parseInt(`${e[5]}${e[6]}`,16)};if(e.match(ne))return{R:Number.parseInt(`${e[1]}${e[1]}`,16),G:Number.parseInt(`${e[2]}${e[2]}`,16),B:Number.parseInt(`${e[3]}${e[3]}`,16)};if(e.match(te))return{R:Number.parseInt(`${e[1]}${e[2]}`,16),G:Number.parseInt(`${e[3]}${e[4]}`,16),B:Number.parseInt(`${e[5]}${e[6]}`,16),A:Math.round(Number.parseInt(`${e[7]}${e[8]}`,16)/255*100)/100};if(e.match(re))return{R:Number.parseInt(`${e[1]}${e[1]}`,16),G:Number.parseInt(`${e[2]}${e[2]}`,16),B:Number.parseInt(`${e[3]}${e[3]}`,16),A:Math.round(Number.parseInt(`${e[4]}${e[4]}`,16)/255*100)/100};throw new Error(`convertHextoRGB expects an valid hexadecimal colour value but got ${e}`)}function Re(e){const t=u(e);return t.A?`rgba(${t.R},${t.G},${t.B},${t.A})`:`rgb(${t.R},${t.G},${t.B})`}const H=new Map([["aliceblue","#f0f8ff"],["antiquewhite","#faebd7"],["aqua","#00ffff"],["aquamarine","#7fffd4"],["azure","#f0ffff"],["beige","#f5f5dc"],["bisque","#ffe4c4"],["black","#000000"],["blanchedalmond","#ffebcd"],["blue","#0000ff"],["blueviolet","#8a2be2"],["brown","#a52a2a"],["burlywood","#deb887"],["cadetblue","#5f9ea0"],["chartreuse","#7fff00"],["chocolate","#d2691e"],["coral","#ff7f50"],["cornflowerblue","#6495ed"],["cornsilk","#fff8dc"],["crimson","#dc143c"],["cyan","#00ffff"],["darkblue","#00008b"],["darkcyan","#008b8b"],["darkgoldenrod","#b8860b"],["darkgray","#a9a9a9"],["darkgreen","#006400"],["darkgrey","#a9a9a9"],["darkkhaki","#bdb76b"],["darkmagenta","#8b008b"],["darkolivegreen","#556b2f"],["darkorange","#ff8c00"],["darkorchid","#9932cc"],["darkred","#8b0000"],["darksalmon","#e9967a"],["darkseagreen","#8fbc8f"],["darkslateblue","#483d8b"],["darkslategray","#2f4f4f"],["darkslategrey","#2f4f4f"],["darkturquoise","#00ced1"],["darkviolet","#9400d3"],["deeppink","#ff1493"],["deepskyblue","#00bfff"],["dimgray","#696969"],["dimgrey","#696969"],["dodgerblue","#1e90ff"],["firebrick","#b22222"],["floralwhite","#fffaf0"],["forestgreen","#228b22"],["fuchsia","#ff00ff"],["gainsboro","#dcdcdc"],["ghostwhite","#f8f8ff"],["gold","#ffd700"],["goldenrod","#daa520"],["gray","#808080"],["green","#008000"],["greenyellow","#adff2f"],["grey","#808080"],["honeydew","#f0fff0"],["hotpink","#ff69b4"],["indianred","#cd5c5c"],["indigo","#4b0082"],["ivory","#fffff0"],["khaki","#f0e68c"],["lavender","#e6e6fa"],["lavenderblush","#fff0f5"],["lawngreen","#7cfc00"],["lemonchiffon","#fffacd"],["lightblue","#add8e6"],["lightcoral","#f08080"],["lightcyan","#e0ffff"],["lightgoldenrodyellow","#fafad2"],["lightgray","#d3d3d3"],["lightgreen","#90ee90"],["lightgrey","#d3d3d3"],["lightpink","#ffb6c1"],["lightsalmon","#ffa07a"],["lightseagreen","#20b2aa"],["lightskyblue","#87cefa"],["lightslategray","#778899"],["lightslategrey","#778899"],["lightsteelblue","#b0c4de"],["lightyellow","#ffffe0"],["lime","#00ff00"],["limegreen","#32cd32"],["linen","#faf0e6"],["magenta","#ff00ff"],["maroon","#800000"],["mediumaquamarine","#66cdaa"],["mediumblue","#0000cd"],["mediumorchid","#ba55d3"],["mediumpurple","#9370db"],["mediumseagreen","#3cb371"],["mediumslateblue","#7b68ee"],["mediumspringgreen","#00fa9a"],["mediumturquoise","#48d1cc"],["mediumvioletred","#c71585"],["midnightblue","#191970"],["mintcream","#f5fffa"],["mistyrose","#ffe4e1"],["moccasin","#ffe4b5"],["navajowhite","#ffdead"],["navy","#000080"],["oldlace","#fdf5e6"],["olive","#808000"],["olivedrab","#6b8e23"],["orangered","#ff4500"],["orchid","#da70d6"],["palegoldenrod","#eee8aa"],["palegreen","#98fb98"],["paleturquoise","#afeeee"],["palevioletred","#db7093"],["papayawhip","#ffefd5"],["peachpuff","#ffdab9"],["peru","#cd853f"],["pink","#ffc0cb"],["plum","#dda0dd"],["powderblue","#b0e0e6"],["purple","#800080"],["red","#ff0000"],["rosybrown","#bc8f8f"],["royalblue","#4169e1"],["saddlebrown","#8b4513"],["salmon","#fa8072"],["sandybrown","#f4a460"],["seagreen","#2e8b57"],["seashell","#fff5ee"],["sienna","#a0522d"],["silver","#c0c0c0"],["skyblue","#87ceeb"],["slateblue","#6a5acd"],["slategray","#708090"],["slategrey","#708090"],["snow","#fffafa"],["springgreen","#00ff7f"],["steelblue","#4682b4"],["tan","#d2b48c"],["teal","#008080"],["thistle","#d8bfd8"],["tomato","#ff6347"],["transparent","#00000000"],["turquoise","#40e0d0"],["violet","#ee82ee"],["wheat","#f5deb3"],["white","#ffffff"],["whitesmoke","#f5f5f5"],["yellow","#ffff00"],["yellowgreen","#9acd32"]]);function ae(e){for(const[t,n]of H.entries())if(n===e)return t}function l(e){return H.get(e)}function R(e){const t=l(e);if(t)return u(t)}function q({R:e,G:t,B:n,A:o}){return`rgb(${e} ${t} ${n}${o?` / ${o}`:""})`}function I(e){const t=p(e);return ae(t)}function $(e,t){if(!t||t.length<2)return e;const n=[];for(const r of t){const a=Q(e,r);n.push([r,a])}return n.sort((r,a)=>r[1]-a[1])[0][0]}function $e(e,t){if(!t||t.length<2)return e;const n=i(e),o=t.map(a=>i(a)),r=$(n,o);return q(r)}function L(e){return!!e.match(oe)}function W(e){return!!e.match(ee)||!!e.match(te)||!!e.match(re)||!!e.match(ne)}function x(e){return H.has(e)}function ve(e,t){if(!t||t.length<2)return e;let n,o;const r=[];if(W(e)&&(n=u(e),o="hex"),L(e)&&(n=i(e),o="cssRGB"),x(e)&&(n=R(e),o="namedCSS"),!n)return;for(const s of t)W(s)&&r.push(u(s)),L(s)&&r.push(i(s)),x(s)&&r.push(R(s));if(r.length<2)return e;const a=$(n,r);return o==="hex"?p(a):o==="cssRGB"?q(a):I(a)}function Ge(e,t){if(!t||t.length<2)return e;const n=u(e),o=t.map(a=>u(a)),r=$(n,o);return p(r)}function Be(e,t){if(!t||t.length<2)return e;const n=R(e),r=t.map(s=>R(s)).filter(s=>s!==void 0);if(!n||r.length<2)return e;const a=$(n,r);return I(a)}function v({R:e,G:t,B:n},o){const r=o==="WCAG2.1",a=g(e,r),s=g(t,r),c=g(n,r);return .2126*a+.7152*s+.0722*c}function d(e,t){const n=u(e);return v(n,t)}function se(e,t){const n=Math.max(e,t),o=Math.min(e,t),r=(n+.05)/(o+.05);return Math.floor(r*1e3)/1e3}function P(e,t,n){const o=d(e,n),r=d(t,n);return se(o,r)}function ke(e,t,n){let o,r;if(e.startsWith("#"))o=e;else if(e.startsWith("rgb"))o=M(e);else{const a=l(e);if(a===void 0)throw new Error(`getContrastRatio expects valid CSS named colours.
2
2
  ${e} is not a valid CSS named colour.
3
3
  See https://developer.mozilla.org/en-US/docs/Web/CSS/named-color`);o=a}if(t.startsWith("#"))r=t;else if(t.startsWith("rgb"))r=M(t);else{const a=l(t);if(a===void 0)throw new Error(`getContrastRatio expects valid CSS named colours.
4
4
  ${t} is not a valid CSS named colour.
5
- See https://developer.mozilla.org/en-US/docs/Web/CSS/named-color`);r=a}return W(o,r,n)}function we(e,t,n){const o=i(e),r=i(t),a=v(o,n),s=v(r,n);return se(a,s)}function ye(e,t,n){const o=l(e),r=l(t);if(o===void 0||r===void 0)throw new Error(`getContrastRatioFromNamedCSSColour expects valid CSS named colours.
5
+ See https://developer.mozilla.org/en-US/docs/Web/CSS/named-color`);r=a}return P(o,r,n)}function we(e,t,n){const o=i(e),r=i(t),a=v(o,n),s=v(r,n);return se(a,s)}function ye(e,t,n){const o=l(e),r=l(t);if(o===void 0||r===void 0)throw new Error(`getContrastRatioFromNamedCSSColour expects valid CSS named colours.
6
6
  ${e} or ${t} are not valid CSS named colours.
7
- See https://developer.mozilla.org/en-US/docs/Web/CSS/named-color`);return W(o,r,n)}function x(e,t){const n=d(e,t)+.05,o=1.05/n,r=n/.05;return o>r}function ce(e,t){const n=l(e);if(n)return x(n,t);throw new Error(`${e} is not a valid colour format. isCSSNamedDarkColour only accepts CSS named colours. Check more details here https://developer.mozilla.org/en-US/docs/Web/CSS/named-color`)}function fe(e,t){const n=i(e),o=v(n,t),r=1.05/o,a=o/.05;return r>a}function Ne(e,t){try{return e.startsWith("#")?x(e,t):e.startsWith("rgb")?fe(e,t):ce(e,t)}catch{throw new Error(`${e} is not a valid colour format. isDarkColour accepts CSS RGB formats, ie rgb(0,0,0) and rgba(255, 255, 255, 0.4), hexadecimal and CSS named colours.`)}}const ie=(e,t)=>e>t?e/t:t/e,Me=({backgroundColour:e,optionOneColour:t,optionTwoColour:n},o)=>{const r=d(e,o)+.05,a=d(t,o)+.05,s=d(n,o)+.05,c=ie(a,r),f=ie(s,r);return c>f?t:n};export{J as RGBdistance,j as ciede2000,M as convertCSSRGBtoHex,i as convertCSSRGBtoRGB,Re as convertHextoCSSRGB,re as convertHextoNamedCSSColour,u as convertHextoRGB,l as convertNamedCSSColourtoHex,R as convertNamedCSSColourtoRGB,q as convertRGBtoCSSRGB,p as convertRGBtoHex,N as convertRGBtoLab,I as convertRGBtoNamedCSSColour,O as convertRGBtoXYZ,V as convertXYZtoLab,$e as findNearestCSSRGBColour,ve as findNearestColour,Ge as findNearestHexColour,Be as findNearestNamedCSSColour,$ as findNearestRGBColour,ke as getContrastRatio,we as getContrastRatioFromCSSRGB,W as getContrastRatioFromHex,ye as getContrastRatioFromNamedCSSColour,d as getSRGBLuminanceFromHex,v as getSRGBLuminanceFromRGB,ce as isCSSNamedDarkColour,L as isCSSRGBColour,fe as isCSSRGBDarkColour,Ne as isDarkColour,x as isHexDarkColour,Me as pickHexColourContrast};
7
+ See https://developer.mozilla.org/en-US/docs/Web/CSS/named-color`);return P(o,r,n)}function A(e,t){const n=d(e,t)+.05,o=1.05/n,r=n/.05;return o>r}function ce(e,t){const n=l(e);if(n)return A(n,t);throw new Error(`${e} is not a valid colour format. isCSSNamedDarkColour only accepts CSS named colours. Check more details here https://developer.mozilla.org/en-US/docs/Web/CSS/named-color`)}function fe(e,t){const n=i(e),o=v(n,t),r=1.05/o,a=o/.05;return r>a}function Ne(e,t){try{return e.startsWith("#")?A(e,t):e.startsWith("rgb")?fe(e,t):ce(e,t)}catch{throw new Error(`${e} is not a valid colour format. isDarkColour accepts CSS RGB formats, ie rgb(0,0,0) and rgba(255, 255, 255, 0.4), hexadecimal and CSS named colours.`)}}const ie=(e,t)=>e>t?e/t:t/e,Me=({backgroundColour:e,optionOneColour:t,optionTwoColour:n},o)=>{const r=d(e,o)+.05,a=d(t,o)+.05,s=d(n,o)+.05,c=ie(a,r),f=ie(s,r);return c>f?t:n};export{Q as RGBdistance,V as ciede2000,M as convertCSSRGBtoHex,i as convertCSSRGBtoRGB,Re as convertHextoCSSRGB,ae as convertHextoNamedCSSColour,u as convertHextoRGB,l as convertNamedCSSColourtoHex,R as convertNamedCSSColourtoRGB,q as convertRGBtoCSSRGB,p as convertRGBtoHex,N as convertRGBtoLab,I as convertRGBtoNamedCSSColour,J as convertRGBtoXYZ,K as convertXYZtoLab,$e as findNearestCSSRGBColour,ve as findNearestColour,Ge as findNearestHexColour,Be as findNearestNamedCSSColour,$ as findNearestRGBColour,ke as getContrastRatio,we as getContrastRatioFromCSSRGB,P as getContrastRatioFromHex,ye as getContrastRatioFromNamedCSSColour,d as getSRGBLuminanceFromHex,v as getSRGBLuminanceFromRGB,ce as isCSSNamedDarkColour,L as isCSSRGBColour,fe as isCSSRGBDarkColour,Ne as isDarkColour,W as isHexColour,A as isHexDarkColour,x as isNamedCSSColour,Me as pickHexColourContrast};
package/dist/index.mjs CHANGED
@@ -172,6 +172,51 @@ function convertCSSRGBtoHex(colour) {
172
172
  const rgb = convertCSSRGBtoRGB(colour);
173
173
  return convertRGBtoHex(rgb);
174
174
  }
175
+ function convertHextoRGB(hex) {
176
+ if (typeof hex !== "string") {
177
+ throw new Error(`convertHextoRGB expects a string but got a ${typeof hex}`);
178
+ }
179
+ if (hex.match(hexRegex)) {
180
+ return {
181
+ R: Number.parseInt(`${hex[1]}${hex[2]}`, 16),
182
+ G: Number.parseInt(`${hex[3]}${hex[4]}`, 16),
183
+ B: Number.parseInt(`${hex[5]}${hex[6]}`, 16)
184
+ };
185
+ }
186
+ if (hex.match(shortHexRegex)) {
187
+ return {
188
+ R: Number.parseInt(`${hex[1]}${hex[1]}`, 16),
189
+ G: Number.parseInt(`${hex[2]}${hex[2]}`, 16),
190
+ B: Number.parseInt(`${hex[3]}${hex[3]}`, 16)
191
+ };
192
+ }
193
+ if (hex.match(hexAlphaRegex)) {
194
+ return {
195
+ R: Number.parseInt(`${hex[1]}${hex[2]}`, 16),
196
+ G: Number.parseInt(`${hex[3]}${hex[4]}`, 16),
197
+ B: Number.parseInt(`${hex[5]}${hex[6]}`, 16),
198
+ A: Math.round(Number.parseInt(`${hex[7]}${hex[8]}`, 16) / 255 * 100) / 100
199
+ };
200
+ }
201
+ if (hex.match(shortAlphaHexRegex)) {
202
+ return {
203
+ R: Number.parseInt(`${hex[1]}${hex[1]}`, 16),
204
+ G: Number.parseInt(`${hex[2]}${hex[2]}`, 16),
205
+ B: Number.parseInt(`${hex[3]}${hex[3]}`, 16),
206
+ A: Math.round(Number.parseInt(`${hex[4]}${hex[4]}`, 16) / 255 * 100) / 100
207
+ };
208
+ }
209
+ throw new Error(
210
+ `convertHextoRGB expects an valid hexadecimal colour value but got ${hex}`
211
+ );
212
+ }
213
+ function convertHextoCSSRGB(hex) {
214
+ const rgb = convertHextoRGB(hex);
215
+ if (rgb.A) {
216
+ return `rgba(${rgb.R},${rgb.G},${rgb.B},${rgb.A})`;
217
+ }
218
+ return `rgb(${rgb.R},${rgb.G},${rgb.B})`;
219
+ }
175
220
  const namedCSSColours = /* @__PURE__ */ new Map([
176
221
  ["aliceblue", "#f0f8ff"],
177
222
  ["antiquewhite", "#faebd7"],
@@ -329,51 +374,6 @@ function convertHextoNamedCSSColour(colour) {
329
374
  }
330
375
  return void 0;
331
376
  }
332
- function convertHextoRGB(hex) {
333
- if (typeof hex !== "string") {
334
- throw new Error(`convertHextoRGB expects a string but got a ${typeof hex}`);
335
- }
336
- if (hex.match(hexRegex)) {
337
- return {
338
- R: Number.parseInt(`${hex[1]}${hex[2]}`, 16),
339
- G: Number.parseInt(`${hex[3]}${hex[4]}`, 16),
340
- B: Number.parseInt(`${hex[5]}${hex[6]}`, 16)
341
- };
342
- }
343
- if (hex.match(shortHexRegex)) {
344
- return {
345
- R: Number.parseInt(`${hex[1]}${hex[1]}`, 16),
346
- G: Number.parseInt(`${hex[2]}${hex[2]}`, 16),
347
- B: Number.parseInt(`${hex[3]}${hex[3]}`, 16)
348
- };
349
- }
350
- if (hex.match(hexAlphaRegex)) {
351
- return {
352
- R: Number.parseInt(`${hex[1]}${hex[2]}`, 16),
353
- G: Number.parseInt(`${hex[3]}${hex[4]}`, 16),
354
- B: Number.parseInt(`${hex[5]}${hex[6]}`, 16),
355
- A: Math.round(Number.parseInt(`${hex[7]}${hex[8]}`, 16) / 255 * 100) / 100
356
- };
357
- }
358
- if (hex.match(shortAlphaHexRegex)) {
359
- return {
360
- R: Number.parseInt(`${hex[1]}${hex[1]}`, 16),
361
- G: Number.parseInt(`${hex[2]}${hex[2]}`, 16),
362
- B: Number.parseInt(`${hex[3]}${hex[3]}`, 16),
363
- A: Math.round(Number.parseInt(`${hex[4]}${hex[4]}`, 16) / 255 * 100) / 100
364
- };
365
- }
366
- throw new Error(
367
- `convertHextoRGB expects an valid hexadecimal colour value but got ${hex}`
368
- );
369
- }
370
- function convertHextoCSSRGB(hex) {
371
- const rgb = convertHextoRGB(hex);
372
- if (rgb.A) {
373
- return `rgba(${rgb.R},${rgb.G},${rgb.B},${rgb.A})`;
374
- }
375
- return `rgb(${rgb.R},${rgb.G},${rgb.B})`;
376
- }
377
377
  function convertNamedCSSColourtoHex(name) {
378
378
  return namedCSSColours.get(name);
379
379
  }
@@ -670,6 +670,8 @@ export {
670
670
  isCSSRGBColour,
671
671
  isCSSRGBDarkColour,
672
672
  isDarkColour,
673
+ isHexColour,
673
674
  isHexDarkColour,
675
+ isNamedCSSColour,
674
676
  pickHexColourContrast
675
677
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sardine/colour",
3
- "version": "2.3.0",
3
+ "version": "2.4.0",
4
4
  "description": "It does things to colours",
5
5
  "type": "module",
6
6
  "module": "./dist/index.mjs",