├── .npmignore ├── .gitignore ├── .gitattributes ├── LICENSE ├── package.json ├── tsconfig.json ├── naevner-min.js ├── README.md ├── naevner.js ├── src └── index.ts └── test └── colors.test.ts /.npmignore: -------------------------------------------------------------------------------- 1 | dist/ -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | config.codekit3 2 | *.log 3 | .DS_Store 4 | node_modules 5 | dist -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Samhaeng ApS 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0.5", 3 | "license": "MIT", 4 | "main": "dist/index.js", 5 | "typings": "dist/index.d.ts", 6 | "files": [ 7 | "src", 8 | "dist" 9 | ], 10 | "engines": { 11 | "node": ">=10" 12 | }, 13 | "scripts": { 14 | "start": "tsdx watch", 15 | "build": "tsdx build", 16 | "test": "tsdx test", 17 | "lint": "tsdx lint", 18 | "prepare": "tsdx build", 19 | "size": "size-limit", 20 | "analyze": "size-limit --why" 21 | }, 22 | "peerDependencies": {}, 23 | "husky": { 24 | "hooks": { 25 | "pre-commit": "tsdx lint" 26 | } 27 | }, 28 | "prettier": { 29 | "printWidth": 80, 30 | "semi": true, 31 | "singleQuote": true, 32 | "trailingComma": "es5" 33 | }, 34 | "name": "@samhaeng/naevner", 35 | "contributors": [ 36 | { 37 | "name": "Filip Jakobsen" 38 | }, 39 | { 40 | "name": "Rasmus Wølk" 41 | } 42 | ], 43 | "module": "dist/naevner.esm.js", 44 | "size-limit": [ 45 | { 46 | "path": "dist/naevner.cjs.production.min.js", 47 | "limit": "10 KB" 48 | }, 49 | { 50 | "path": "dist/naevner.esm.js", 51 | "limit": "10 KB" 52 | } 53 | ], 54 | "devDependencies": { 55 | "@size-limit/preset-small-lib": "^5.0.4", 56 | "husky": "^7.0.2", 57 | "size-limit": "^5.0.4", 58 | "tsdx": "^0.14.1", 59 | "tslib": "^2.3.1", 60 | "typescript": "^4.4.3" 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // see https://www.typescriptlang.org/tsconfig to better understand tsconfigs 3 | "include": ["src", "types"], 4 | "compilerOptions": { 5 | "module": "esnext", 6 | "lib": ["dom", "esnext"], 7 | "importHelpers": true, 8 | // output .d.ts declaration files for consumers 9 | "declaration": true, 10 | // output .js.map sourcemap files for consumers 11 | "sourceMap": true, 12 | // match output dir to input dir. e.g. dist/index instead of dist/src/index 13 | "rootDir": "./src", 14 | // stricter type-checking for stronger correctness. Recommended by TS 15 | "strict": true, 16 | // linter checks for common issues 17 | "noImplicitReturns": true, 18 | "noFallthroughCasesInSwitch": true, 19 | // noUnused* overlap with @typescript-eslint/no-unused-vars, can disable if duplicative 20 | "noUnusedLocals": true, 21 | "noUnusedParameters": true, 22 | // use Node's module resolution algorithm, instead of the legacy TS one 23 | "moduleResolution": "node", 24 | // transpile JSX to React.createElement 25 | "jsx": "react", 26 | // interop between ESM and CJS modules. Recommended by TS 27 | "esModuleInterop": true, 28 | // significant perf increase by skipping checking .d.ts files, particularly those in node_modules. Recommended by TS 29 | "skipLibCheck": true, 30 | // error out if import and file system have a casing mismatch. Recommended by TS 31 | "forceConsistentCasingInFileNames": true, 32 | // `tsdx build` ignores this option, but it is commonly used when type-checking separately with `tsc` 33 | "noEmit": true, 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /naevner-min.js: -------------------------------------------------------------------------------- 1 | /*! naevner v1.0.0 | MIT */ 2 | const naevner=(e,l="ish")=>{let r,n,a,t,o,g,u,b,c,y,i,w=l;const s=(e,l)=>{var r=l.indexOf("-"),n=parseInt(l.substr(0,r)),a=parseInt(l.substr(r+1));return e>=n&&e<=a};i=/^#.*/g.test(e)?e:"#"+e,r=function(e){let l=0,r=0,n=0;return 4==e.length?(l="0x"+e[1]+e[1],r="0x"+e[2]+e[2],n="0x"+e[3]+e[3]):7==e.length&&(l="0x"+e[1]+e[2],r="0x"+e[3]+e[4],n="0x"+e[5]+e[6]),{r:l,g:r,b:n}}(i),n=function(e,l,r){e/=255,l/=255,r/=255;let n=Math.min(e,l,r),a=Math.max(e,l,r),t=a-n,o=0,g=0,u=0;return o=0==t?0:a==e?(l-r)/t%6:a==l?(r-e)/t+2:(e-l)/t+4,o=Math.round(60*o),o<0&&(o+=360),u=(a+n)/2,g=0==t?0:t/(1-Math.abs(2*u-1)),g=+(100*g).toFixed(1),u=+(100*u).toFixed(1),{h:o,s:g,l:u}}(r.r,r.g,r.b);let d=parseInt(n.h),h=parseInt(n.s),k=parseInt(n.l);return a=null,t=null,o=null,g=null,u=null,b=null,c=null,s(h,"0-0")?b="monochrome":s(h,"1-6")?b="grey":s(h,"7-10")?b=`grey${w}`:s(h,"11-35")?b="faded":s(h,"36-65")?b="calm":s(h,"66-90")?b="clear":s(h,"91-100")&&(b="vibrant"),s(k,"0-5")?a="black":s(k,"6-10")?a="very dark":s(k,"11-35")?a="dark":s(k,"36-65")?a=null:s(k,"66-85")?a="light":s(k,"86-98")?a="very light":s(k,"98-100")&&(a="white"),s(d,"0-3")||s(d,"346-360")?"grey"!==b&&"black"!==a&&(k<20||h<40)?(o="brown",u="red"):k<30||h<50?(o="red",u="brown"):(o="red",u=null):s(d,"4-6")?"grey"!==b&&"black"!==a&&(k<35||h<50)?(o="brown",u="orange"):(o="red",u="orange"):s(d,"7-12")?"grey"!==b&&"black"!==a&&(k<35||h<50)?(o="brown",u="orange"):k<40&&h<90||k<45&&h<70?(o="orange",u="brown"):(o="orange",u="red"):s(d,"13-35")?"grey"!==b&&"black"!==a&&(k<35||h<50)?(o="brown",u="orange"):k<40&&h<90||k<45&&h<70?(o="orange",u="brown"):(o="orange",u=null):s(d,"36-42")?"grey"!==b&&"black"!==a&&k<50||h<70?(o="brown",u="olive"):(o="orange",u="yellow"):s(d,"43-46")?"grey"!==b&&"black"!==a&&(k<50||h<70)?(o="olive",u="brown"):(o="yellow",u="orange"):s(d,"47-61")?"grey"!==b&&"black"!==a&&(k<50||h<70)?(o="olive",u=null):(o="yellow",u=null):s(d,"62-67")?"grey"!==b&&"black"!==a&&(k<50||h<70)?(o="olive",u="green"):(o="yellow",u="green"):s(d,"68-74")?"grey"!==b&&"black"!==a&&(k<50||h<70)?(o="green",u="olive"):(o="green",u="yellow"):s(d,"75-147")?(o="green",u=null):s(d,"148-157")?(o="green",u="turquoise"):s(d,"158-172")?(o="turquoise",u=null):s(d,"173-193")?(o="cyan",u=null):s(d,"194-201")?(o="cyan",u="blue"):s(d,"202-211")?(o="blue",u="cyan"):s(d,"212-255")?(o="blue",u=null):s(d,"256-258")?(o="blue",u="purple"):s(d,"259-265")?(o="purple",u="blue"):s(d,"266-280")?(o="purple",u=null):s(d,"281-287")?(o="purple",u="magenta"):s(d,"288-298")?(o="magenta",u="purple"):s(d,"299-316")?(o="magenta",u=null):s(d,"317-337")?"grey"!==b&&"black"!==a&&(k<30||h<40)?(o="magenta",u="brown"):(o="magenta",u="red"):s(d,"338-345")&&("grey"!==b&&"black"!==a&&(k<35||h<50)?(o="brown",u="magenta"):(o="red",u="magenta")),t=a?a+", ":"",c=u?b+", ":b+" ",g=u?u+w+" "+o:o,"monochrome"==b?"black"==a||"white"==a?y=`${a}`:(a||(a=""),y=`${a} grey`):y="black"==a?`${o}-tinted black`:"white"==a?`${o}-tinted off-white`:"grey"==b?`${t}${o}${w} ${b}`:`${t}${c}${g}`,y}; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Naevner.js 2 | ## Color descriptions generated from hex color codes 3 | Javascript plugin that provides natural language descriptions of hex color codes. 4 | 5 | ## Why we made this 6 | We made this to have screenreader support for reading out color names on [remembertostand.com](https://remembertostand.com/) (Turn on screenreader and press C when on the site to hear it in action) 7 | 8 | ## Credits 9 | * The hexToRGB and RGBToHSL functions used as part of this plugin are from https://css-tricks.com/converting-color-spaces-in-javascript/ 10 | 11 | ## Demo 12 | * Interactive demo of Naevner.js: [Nævner (naevner.com)](https://naevner.com/) 13 | * Naevner.js in use on a website — interactive demo: [Naevner.js in use on remembertostand.com](https://remembertostand.com/) (Turn on screenreader and press C to change interface colors to hear it in action) 14 | * Naevner.js in use on a website — video demonstration of screenreader usage: [Naevner.js screenreader demo video](https://youtu.be/8kn6D_BuHYg) 15 | 16 | ## Getting started 17 | 18 | ### Install in a browser 19 | Include the [minified code](https://github.com/samhaeng/naevner/blob/main/naevner-min.js) 20 | 21 | ### Install with yarn 22 | ``` 23 | yarn add @samhaeng/naevner 24 | ``` 25 | 26 | ### Install with NPM 27 | ``` 28 | npm install @samhaeng/naevner 29 | ``` 30 | 31 | ## How to use 32 | ```javascript 33 | import naevner from '@samhaeng/naevner' 34 | 35 | naevner(color); 36 | ``` 37 | 38 | ## Examples 39 | ```javascript 40 | //Examples: 41 | naevner("#000000"); //Returns: “black” 42 | naevner("#0000ff"); //Returns: “vivid blue” 43 | naevner("#D6365C"); //Returns: “clear red” 44 | naevner("#2F5651"); //Returns: “dark, faded turquoise” 45 | naevner("#3F0548"); //Returns: “dark, clear, purpleish magenta” 46 | ``` 47 | ## Accepted values 48 | * 3-digit hex with preceding #-sign — e.g. `#f00` 49 | * 3-digit hex without preceding #-sign — e.g. `f00` 50 | * 6-digit hex with preceding #-sign — e.g. `#ff0000` 51 | * 6-digit hex without preceding #-sign — e.g. `ff0000` 52 | 53 | ## Parameters 54 | ### approximationSuffix 55 | 56 | Ending for approximate colors — e.g. “greenish yellow” or “redish orange". Note that “off-white” and “black” nuances currently always use the term “-tinted” (e.g. “red-tinted black” or “yellow-tinted off-white”) independent of this parameter. 57 | ```javascript 58 | naevner(color, approximationSuffix); 59 | ``` 60 | 61 | approximationSuffix examples: 62 | ```javascript 63 | naevner("#3F0548"); //Returns: “dark, clear, purpleish magenta” 64 | naevner("#3F0548", "-tinted"); //Returns: “dark, clear, purple-tinted magenta” 65 | naevner("#3F0548", "-like"); //Returns: “dark, clear, purple-like magenta” 66 | ``` 67 | 68 | # Other color repositories 69 | The purpose of this plugin is to provide short, unambiguous descriptions using commonly used color terms. For some situations, different types of color descriptions may be more useful. For those situations, you may want to have a look at the following repositories. These are provided for your convenience and are not associated with this repository or Samhæng: 70 | * https://github.com/words/color-description 71 | * https://github.com/meodai/color-names 72 | 73 | 74 | # Questions, ideas and advice 75 | If you have questions or advice, feel free to open an issue on this repo. Thank you! 76 | -------------------------------------------------------------------------------- /naevner.js: -------------------------------------------------------------------------------- 1 | /*! naevner v1.0.0 | MIT */ 2 | const naevner = (color, approximationSuffix="ish") => { 3 | let colorInRGB, 4 | colorInHSL, 5 | lightness, 6 | lightnessToPrint, 7 | hue, 8 | hueWithNuanceToPrint, 9 | hueNuance, 10 | saturation, 11 | saturationToPrint, 12 | approximationSuffixToPrint = approximationSuffix, 13 | colorDescription, 14 | parsedColor; 15 | 16 | // hexToRGB + RGBToHSL functions from https://css-tricks.com/converting-color-spaces-in-javascript/ 17 | function hexToRGB(h) { 18 | let r = 0, g = 0, b = 0; 19 | 20 | if (h.length == 4) { 21 | r = "0x" + h[1] + h[1]; 22 | g = "0x" + h[2] + h[2]; 23 | b = "0x" + h[3] + h[3]; 24 | 25 | } else if (h.length == 7) { 26 | r = "0x" + h[1] + h[2]; 27 | g = "0x" + h[3] + h[4]; 28 | b = "0x" + h[5] + h[6]; 29 | } 30 | 31 | return {r,g,b} 32 | } 33 | 34 | function RGBToHSL(r,g,b) { 35 | // Make r, g, and b fractions of 1 36 | r /= 255; 37 | g /= 255; 38 | b /= 255; 39 | 40 | // Find greatest and smallest channel values 41 | let cmin = Math.min(r,g,b), 42 | cmax = Math.max(r,g,b), 43 | delta = cmax - cmin, 44 | h = 0, 45 | s = 0, 46 | l = 0; 47 | 48 | // Calculate hue 49 | // No difference 50 | if (delta == 0) 51 | h = 0; 52 | // Red is max 53 | else if (cmax == r) 54 | h = ((g - b) / delta) % 6; 55 | // Green is max 56 | else if (cmax == g) 57 | h = (b - r) / delta + 2; 58 | // Blue is max 59 | else 60 | h = (r - g) / delta + 4; 61 | 62 | h = Math.round(h * 60); 63 | 64 | // Make negative hues positive behind 360° 65 | if (h < 0) 66 | h += 360; 67 | 68 | // Calculate lightness 69 | l = (cmax + cmin) / 2; 70 | 71 | // Calculate saturation 72 | s = delta == 0 ? 0 : delta / (1 - Math.abs(2 * l - 1)); 73 | 74 | // Multiply l and s by 100 75 | s = +(s * 100).toFixed(1); 76 | l = +(l * 100).toFixed(1); 77 | 78 | return {h:h,s:s,l:l}; 79 | } 80 | 81 | const numberIsInRange = (colorAspectValue, range) => { 82 | var fullRange = range.indexOf("-"); 83 | var startOfRange = parseInt(range.substr(0, fullRange)); 84 | var endOfRange = parseInt(range.substr(fullRange + 1)); 85 | if(colorAspectValue >= startOfRange && colorAspectValue <= endOfRange){ 86 | return true; 87 | } else{ 88 | return false; 89 | } 90 | } 91 | 92 | //parse color input 93 | parsedColor = /^#.*/g.test(color) ? color : "#" + color; 94 | 95 | //assess color code: 96 | colorInRGB = hexToRGB(parsedColor,true); 97 | colorInHSL = RGBToHSL(colorInRGB.r,colorInRGB.g,colorInRGB.b); 98 | 99 | let h = parseInt(colorInHSL.h), 100 | s = parseInt(colorInHSL.s), 101 | l = parseInt(colorInHSL.l); 102 | 103 | //reset values 104 | lightness = null; 105 | lightnessToPrint = null; 106 | hue = null; 107 | hueWithNuanceToPrint = null; 108 | hueNuance = null; 109 | saturation = null; 110 | saturationToPrint = null; 111 | 112 | //determine saturation term 113 | if ( numberIsInRange(s, "0-0") ) { saturation = "monochrome" } 114 | else if ( numberIsInRange(s, "1-6") ) { saturation = "grey" } 115 | else if ( numberIsInRange(s, "7-10") ) { saturation = `grey${approximationSuffixToPrint}` } 116 | else if ( numberIsInRange(s, "11-35") ) { saturation = "faded" } 117 | else if ( numberIsInRange(s, "36-65") ) { saturation = "calm" } 118 | else if ( numberIsInRange(s, "66-90") ) { saturation = "clear" } 119 | else if ( numberIsInRange(s, "91-100") ) { saturation = "vibrant" } 120 | 121 | //determine lightness term 122 | if ( numberIsInRange(l, "0-5") ) { lightness = "black" } 123 | else if ( numberIsInRange(l, "6-10") ) { lightness = "very dark" } 124 | else if ( numberIsInRange(l, "11-35") ) { lightness = "dark" } 125 | else if ( numberIsInRange(l, "36-65") ) { lightness = null } 126 | else if ( numberIsInRange(l, "66-85") ) { lightness = "light" } 127 | else if ( numberIsInRange(l, "86-98") ) { lightness = "very light" } 128 | else if ( numberIsInRange(l, "98-100") ) { lightness = "white" } 129 | 130 | //determine hue term 131 | if ( (numberIsInRange(h, "0-3")) || (numberIsInRange(h, "346-360")) ) { //red 132 | 133 | if ( (saturation !== "grey") && (lightness !== "black") && (l < 20 || s < 40) ){ hue = "brown"; hueNuance="red" } 134 | else if ( l < 30 || s < 50 ) { hue = "red"; hueNuance="brown" } 135 | else{ hue = "red"; hueNuance=null } 136 | 137 | } 138 | else if ( numberIsInRange(h, "4-6") ) { //orange-ish red 139 | 140 | if ( (saturation !== "grey") && (lightness !== "black") && (l < 35 || s < 50) ){ hue = "brown"; hueNuance="orange" } 141 | else{ hue = "red"; hueNuance="orange" } 142 | 143 | } 144 | else if ( numberIsInRange(h, "7-12") ) { //red-ish orange 145 | 146 | if ( (saturation !== "grey") && (lightness !== "black") && (l < 35 || s < 50) ){ hue = "brown"; hueNuance="orange" } 147 | else if ( (l < 40 && s < 90) || (l < 45 && s < 70) ) { hue = "orange"; hueNuance="brown" } 148 | else{ hue = "orange"; hueNuance="red" } 149 | 150 | } 151 | else if ( numberIsInRange(h, "13-35") ) { // orange 152 | 153 | if ( (saturation !== "grey") && (lightness !== "black") && (l < 35 || s < 50) ) { hue = "brown"; hueNuance="orange" } 154 | else if ( (l < 40 && s < 90) || (l < 45 && s < 70) ) { hue = "orange"; hueNuance="brown" } 155 | else{ hue = "orange"; hueNuance=null } 156 | } 157 | else if ( numberIsInRange(h, "36-42") ) { //yellow-ish orange 158 | 159 | 160 | if ( (saturation !== "grey") && (lightness !== "black") && ( l < 50) || s < 70 ){ hue = "brown"; hueNuance="olive" } 161 | else{ hue = "orange"; hueNuance="yellow" } 162 | } 163 | else if ( numberIsInRange(h, "43-46") ) { //orange-ish yellow 164 | 165 | if ( (saturation !== "grey") && (lightness !== "black") && (l < 50 || s < 70) ){ hue = "olive"; hueNuance="brown" } 166 | else{ hue = "yellow"; hueNuance="orange" } 167 | 168 | } 169 | else if ( numberIsInRange(h, "47-61") ) { //yellow 170 | 171 | if ( (saturation !== "grey") && (lightness !== "black") && (l < 50 || s < 70 ) ){ hue = "olive"; hueNuance=null } 172 | else{ hue = "yellow"; hueNuance=null } 173 | 174 | } 175 | else if ( numberIsInRange(h, "62-67") ) { //green-ish yellow 176 | 177 | if ( (saturation !== "grey") && (lightness !== "black") && ( l < 50 || s < 70 ) ){ hue = "olive"; hueNuance="green" } 178 | else{ hue = "yellow"; hueNuance="green" } 179 | 180 | } 181 | else if ( numberIsInRange(h, "68-74") ) { //yellow-ish green 182 | 183 | if ( (saturation !== "grey") && (lightness !== "black") && ( l < 50 || s < 70 ) ){ hue = "green"; hueNuance="olive" } 184 | else{ hue = "green"; hueNuance="yellow" } 185 | 186 | } 187 | else if ( numberIsInRange(h, "75-147") ) { hue = "green"; hueNuance=null } 188 | else if ( numberIsInRange(h, "148-157") ) { hue = "green"; hueNuance="turquoise" } 189 | else if ( numberIsInRange(h, "158-172") ) { hue = "turquoise"; hueNuance=null } 190 | else if ( numberIsInRange(h, "173-193") ) { hue = "cyan"; hueNuance=null } 191 | else if ( numberIsInRange(h, "194-201") ) { hue = "cyan"; hueNuance="blue" } 192 | else if ( numberIsInRange(h, "202-211") ) { hue = "blue"; hueNuance="cyan" } 193 | else if ( numberIsInRange(h, "212-255") ) { hue = "blue"; hueNuance=null } 194 | else if ( numberIsInRange(h, "256-258") ) { hue = "blue"; hueNuance="purple" } 195 | else if ( numberIsInRange(h, "259-265") ) { hue = "purple"; hueNuance="blue" } 196 | else if ( numberIsInRange(h, "266-280") ) { hue = "purple"; hueNuance=null } 197 | else if ( numberIsInRange(h, "281-287") ) { hue = "purple"; hueNuance="magenta" } 198 | else if ( numberIsInRange(h, "288-298") ) { hue = "magenta"; hueNuance="purple" } 199 | else if ( numberIsInRange(h, "299-316") ) { hue = "magenta"; hueNuance=null } 200 | else if ( numberIsInRange(h, "317-337") ) { //red-ish magenta 201 | 202 | if ( (saturation !== "grey") && (lightness !== "black") && (l < 30 || s < 40) ){ hue = "magenta"; hueNuance="brown" } 203 | else{ hue = "magenta"; hueNuance="red" } 204 | 205 | } 206 | else if ( numberIsInRange(h, "338-345") ) { //magenta-ish red 207 | 208 | if ( (saturation !== "grey") && (lightness !== "black") && (l < 35 || s < 50) ) { hue = "brown"; hueNuance="magenta" } 209 | else{ hue = "red"; hueNuance="magenta" } 210 | 211 | } 212 | 213 | //For the last two groups below, we need to construct a natural-language sentence that can handle multiple adjectives with proper punctuation 214 | lightnessToPrint = lightness ? lightness + ", " : ""; 215 | saturationToPrint = hueNuance ? saturation + ", " : saturation + " "; 216 | hueWithNuanceToPrint = hueNuance ? hueNuance + approximationSuffixToPrint + " " + hue : hue; 217 | 218 | //Is monochrome 219 | if (saturation == "monochrome"){ 220 | if (lightness=="black" || lightness=="white"){ 221 | colorDescription = `${lightness}`; 222 | } else { 223 | if (!lightness){lightness = ""} 224 | colorDescription = `${lightness} grey`; 225 | } 226 | } 227 | 228 | //Tinted black 229 | else if ( 230 | lightness == "black"){ colorDescription = `${hue}-tinted black`; 231 | } 232 | 233 | //Tinted white 234 | else if(lightness == "white"){ 235 | colorDescription = `${hue}-tinted off-white`; 236 | } 237 | 238 | //Tinted grey - combine hue, lightness, saturation to determine color name: 239 | else if(saturation == "grey"){ colorDescription = `${lightnessToPrint}${hue}${approximationSuffixToPrint} ${saturation}`; } 240 | 241 | //Any other color - combine hue, lightness, saturation to determine color name: 242 | else{ colorDescription = `${lightnessToPrint}${saturationToPrint}${hueWithNuanceToPrint}`; } 243 | 244 | //return color name 245 | return colorDescription; 246 | 247 | } -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | /*! naevner v1.0.0 | MIT */ 2 | type Naevner = (color: string, approximationSuffix?: string) => string; 3 | 4 | const naevner: Naevner = (color, approximationSuffix = "ish") => { 5 | let lightness, 6 | lightnessToPrint, 7 | hue, 8 | hueWithNuanceToPrint, 9 | hueNuance, 10 | saturation, 11 | saturationToPrint, 12 | approximationSuffixToPrint = approximationSuffix, 13 | colorDescription, 14 | parsedColor; 15 | 16 | // hexToRGB + RGBToHSL functions from https://css-tricks.com/converting-color-spaces-in-javascript/ 17 | function hexToRGB(h: string): { r: number, g: number, b: number } { 18 | let r: string = '0', g: string = '0', b: string = '0'; 19 | 20 | if (h.length == 4) { 21 | r = "0x" + h[1] + h[1]; 22 | g = "0x" + h[2] + h[2]; 23 | b = "0x" + h[3] + h[3]; 24 | 25 | } else if (h.length == 7) { 26 | r = "0x" + h[1] + h[2]; 27 | g = "0x" + h[3] + h[4]; 28 | b = "0x" + h[5] + h[6]; 29 | } 30 | 31 | return { 32 | r: parseInt(`${r}`), 33 | g: parseInt(`${g}`), 34 | b: parseInt(`${b}`) 35 | } 36 | } 37 | 38 | function RGBToHSL(r: any, g: any, b: any): { h: number, s: number, l: number } { 39 | // Make r, g, and b fractions of 1 40 | r /= 255; 41 | g /= 255; 42 | b /= 255; 43 | 44 | // Find greatest and smallest channel values 45 | let cmin = Math.min(r,g,b), 46 | cmax = Math.max(r,g,b), 47 | delta = cmax - cmin, 48 | h = 0, 49 | s = 0, 50 | l = 0; 51 | 52 | // Calculate hue 53 | // No difference 54 | if (delta == 0) 55 | h = 0; 56 | // Red is max 57 | else if (cmax == r) 58 | h = ((g - b) / delta) % 6; 59 | // Green is max 60 | else if (cmax == g) 61 | h = (b - r) / delta + 2; 62 | // Blue is max 63 | else 64 | h = (r - g) / delta + 4; 65 | 66 | h = Math.round(h * 60); 67 | 68 | // Make negative hues positive behind 360° 69 | if (h < 0) 70 | h += 360; 71 | 72 | // Calculate lightness 73 | l = (cmax + cmin) / 2; 74 | 75 | // Calculate saturation 76 | s = delta == 0 ? 0 : delta / (1 - Math.abs(2 * l - 1)); 77 | 78 | // Multiply l and s by 100 79 | s = +(s * 100).toFixed(1); 80 | l = +(l * 100).toFixed(1); 81 | 82 | return { 83 | h: Math.floor(h), 84 | s: Math.floor(s), 85 | l: Math.floor(l), 86 | }; 87 | } 88 | 89 | const numberIsInRange = (colorAspectValue: number, range: string) => { 90 | var fullRange = range.indexOf("-"); 91 | var startOfRange = parseInt(range.substr(0, fullRange)); 92 | var endOfRange = parseInt(range.substr(fullRange + 1)); 93 | if(colorAspectValue >= startOfRange && colorAspectValue <= endOfRange){ 94 | return true; 95 | } else{ 96 | return false; 97 | } 98 | } 99 | 100 | //parse color input 101 | parsedColor = /^#.*/g.test(color) ? color : "#" + color; 102 | 103 | //assess color code: 104 | const colorInRGB = hexToRGB(parsedColor); 105 | const { h, s, l } = RGBToHSL(colorInRGB.r, colorInRGB.g, colorInRGB.b); 106 | 107 | //reset values 108 | lightness = null; 109 | lightnessToPrint = null; 110 | hue = null; 111 | hueWithNuanceToPrint = null; 112 | hueNuance = null; 113 | saturation = null; 114 | saturationToPrint = null; 115 | 116 | //determine saturation term 117 | if ( numberIsInRange(s, "0-0") ) { saturation = "monochrome" } 118 | else if ( numberIsInRange(s, "1-6") ) { saturation = "grey" } 119 | else if ( numberIsInRange(s, "7-10") ) { saturation = `grey${approximationSuffixToPrint}` } 120 | else if ( numberIsInRange(s, "11-35") ) { saturation = "faded" } 121 | else if ( numberIsInRange(s, "36-65") ) { saturation = "calm" } 122 | else if ( numberIsInRange(s, "66-90") ) { saturation = "clear" } 123 | else if ( numberIsInRange(s, "91-100") ) { saturation = "vibrant" } 124 | 125 | //determine lightness term 126 | if ( numberIsInRange(l, "0-5") ) { lightness = "black" } 127 | else if ( numberIsInRange(l, "6-10") ) { lightness = "very dark" } 128 | else if ( numberIsInRange(l, "11-35") ) { lightness = "dark" } 129 | else if ( numberIsInRange(l, "36-65") ) { lightness = null } 130 | else if ( numberIsInRange(l, "66-85") ) { lightness = "light" } 131 | else if ( numberIsInRange(l, "86-98") ) { lightness = "very light" } 132 | else if ( numberIsInRange(l, "98-100") ) { lightness = "white" } 133 | 134 | //determine hue term 135 | if ( (numberIsInRange(h, "0-3")) || (numberIsInRange(h, "346-360")) ) { //red 136 | 137 | if ( (saturation !== "grey") && (lightness !== "black") && (l < 20 || s < 40) ){ hue = "brown"; hueNuance="red" } 138 | else if ( l < 30 || s < 50 ) { hue = "red"; hueNuance="brown" } 139 | else{ hue = "red"; hueNuance=null } 140 | 141 | } 142 | else if ( numberIsInRange(h, "4-6") ) { //orange-ish red 143 | 144 | if ( (saturation !== "grey") && (lightness !== "black") && (l < 35 || s < 50) ){ hue = "brown"; hueNuance="orange" } 145 | else{ hue = "red"; hueNuance="orange" } 146 | 147 | } 148 | else if ( numberIsInRange(h, "7-12") ) { //red-ish orange 149 | 150 | if ( (saturation !== "grey") && (lightness !== "black") && (l < 35 || s < 50) ){ hue = "brown"; hueNuance="orange" } 151 | else if ( (l < 40 && s < 90) || (l < 45 && s < 70) ) { hue = "orange"; hueNuance="brown" } 152 | else{ hue = "orange"; hueNuance="red" } 153 | 154 | } 155 | else if ( numberIsInRange(h, "13-35") ) { // orange 156 | 157 | if ( (saturation !== "grey") && (lightness !== "black") && (l < 35 || s < 50) ) { hue = "brown"; hueNuance="orange" } 158 | else if ( (l < 40 && s < 90) || (l < 45 && s < 70) ) { hue = "orange"; hueNuance="brown" } 159 | else{ hue = "orange"; hueNuance=null } 160 | } 161 | else if ( numberIsInRange(h, "36-42") ) { //yellow-ish orange 162 | 163 | 164 | if ( (saturation !== "grey") && (lightness !== "black") && ( l < 50) || s < 70 ){ hue = "brown"; hueNuance="olive" } 165 | else{ hue = "orange"; hueNuance="yellow" } 166 | } 167 | else if ( numberIsInRange(h, "43-46") ) { //orange-ish yellow 168 | 169 | if ( (saturation !== "grey") && (lightness !== "black") && (l < 50 || s < 70) ){ hue = "olive"; hueNuance="brown" } 170 | else{ hue = "yellow"; hueNuance="orange" } 171 | 172 | } 173 | else if ( numberIsInRange(h, "47-61") ) { //yellow 174 | 175 | if ( (saturation !== "grey") && (lightness !== "black") && (l < 50 || s < 70 ) ){ hue = "olive"; hueNuance=null } 176 | else{ hue = "yellow"; hueNuance=null } 177 | 178 | } 179 | else if ( numberIsInRange(h, "62-67") ) { //green-ish yellow 180 | 181 | if ( (saturation !== "grey") && (lightness !== "black") && ( l < 50 || s < 70 ) ){ hue = "olive"; hueNuance="green" } 182 | else{ hue = "yellow"; hueNuance="green" } 183 | 184 | } 185 | else if ( numberIsInRange(h, "68-74") ) { //yellow-ish green 186 | 187 | if ( (saturation !== "grey") && (lightness !== "black") && ( l < 50 || s < 70 ) ){ hue = "green"; hueNuance="olive" } 188 | else{ hue = "green"; hueNuance="yellow" } 189 | 190 | } 191 | else if ( numberIsInRange(h, "75-147") ) { hue = "green"; hueNuance=null } 192 | else if ( numberIsInRange(h, "148-157") ) { hue = "green"; hueNuance="turquoise" } 193 | else if ( numberIsInRange(h, "158-172") ) { hue = "turquoise"; hueNuance=null } 194 | else if ( numberIsInRange(h, "173-193") ) { hue = "cyan"; hueNuance=null } 195 | else if ( numberIsInRange(h, "194-201") ) { hue = "cyan"; hueNuance="blue" } 196 | else if ( numberIsInRange(h, "202-211") ) { hue = "blue"; hueNuance="cyan" } 197 | else if ( numberIsInRange(h, "212-255") ) { hue = "blue"; hueNuance=null } 198 | else if ( numberIsInRange(h, "256-258") ) { hue = "blue"; hueNuance="purple" } 199 | else if ( numberIsInRange(h, "259-265") ) { hue = "purple"; hueNuance="blue" } 200 | else if ( numberIsInRange(h, "266-280") ) { hue = "purple"; hueNuance=null } 201 | else if ( numberIsInRange(h, "281-287") ) { hue = "purple"; hueNuance="magenta" } 202 | else if ( numberIsInRange(h, "288-298") ) { hue = "magenta"; hueNuance="purple" } 203 | else if ( numberIsInRange(h, "299-316") ) { hue = "magenta"; hueNuance=null } 204 | else if ( numberIsInRange(h, "317-337") ) { //red-ish magenta 205 | 206 | if ( (saturation !== "grey") && (lightness !== "black") && (l < 30 || s < 40) ){ hue = "magenta"; hueNuance="brown" } 207 | else{ hue = "magenta"; hueNuance="red" } 208 | 209 | } 210 | else if ( numberIsInRange(h, "338-345") ) { //magenta-ish red 211 | 212 | if ( (saturation !== "grey") && (lightness !== "black") && (l < 35 || s < 50) ) { hue = "brown"; hueNuance="magenta" } 213 | else{ hue = "red"; hueNuance="magenta" } 214 | 215 | } 216 | 217 | //For the last two groups below, we need to construct a natural-language sentence that can handle multiple adjectives with proper punctuation 218 | lightnessToPrint = lightness ? lightness + ", " : ""; 219 | saturationToPrint = hueNuance ? saturation + ", " : saturation + " "; 220 | hueWithNuanceToPrint = hueNuance ? hueNuance + approximationSuffixToPrint + " " + hue : hue; 221 | 222 | //Is monochrome 223 | if (saturation == "monochrome"){ 224 | if (lightness=="black" || lightness=="white"){ 225 | colorDescription = `${lightness}`; 226 | } else { 227 | if (!lightness){lightness = ""} 228 | colorDescription = `${lightness} grey`; 229 | } 230 | } 231 | 232 | //Tinted black 233 | else if ( 234 | lightness == "black"){ colorDescription = `${hue}-tinted black`; 235 | } 236 | 237 | //Tinted white 238 | else if(lightness == "white"){ 239 | colorDescription = `${hue}-tinted off-white`; 240 | } 241 | 242 | //Tinted grey - combine hue, lightness, saturation to determine color name: 243 | else if(saturation == "grey"){ colorDescription = `${lightnessToPrint}${hue}${approximationSuffixToPrint} ${saturation}`; } 244 | 245 | //Any other color - combine hue, lightness, saturation to determine color name: 246 | else{ colorDescription = `${lightnessToPrint}${saturationToPrint}${hueWithNuanceToPrint}`; } 247 | 248 | //return color name 249 | return colorDescription; 250 | 251 | } 252 | 253 | export default naevner; -------------------------------------------------------------------------------- /test/colors.test.ts: -------------------------------------------------------------------------------- 1 | import naevner from '../src'; 2 | const cases = { 3 | "#6a58cc": "calm blue", 4 | "#528821": "dark, calm green", 5 | "#9651b2": "calm, magentaish purple", 6 | "#3709d7": "vibrant blue", 7 | "#fc752b": "vibrant orange", 8 | "#d8382f": "clear red", 9 | "#c6cc9c": "light, faded, oliveish green", 10 | "#422da6": "calm blue", 11 | "#5da19d": "faded cyan", 12 | "#be5310": "clear orange", 13 | "#056517": "dark, clear green", 14 | "#68bef3": "light, clear, cyanish blue", 15 | "#8adf29": "clear green", 16 | "#5c6483": "faded blue", 17 | "#a809bc": "clear, purpleish magenta", 18 | "#cdea3f": "clear, yellowish green", 19 | "#afef2c": "clear green", 20 | "#0f3eac": "clear blue", 21 | "#b09c5d": "faded, brownish olive", 22 | "#a53b17": "clear orange", 23 | "#12f2ad": "clear turquoise", 24 | "#293599": "calm blue", 25 | "#97d978": "light, calm green", 26 | "#cfa63a": "calm, brownish olive", 27 | "#d8f552": "clear, yellowish green", 28 | "#296a2e": "dark, calm green", 29 | "#861f9e": "clear, purpleish magenta", 30 | "#6e9f81": "faded green", 31 | "#6dd8aa": "calm, turquoiseish green", 32 | "#40e214": "clear green", 33 | "#3267d4": "calm blue", 34 | "#7c653b": "dark, faded, oliveish brown", 35 | "#dbd49e": "light, calm olive", 36 | "#cb4980": "calm, redish magenta", 37 | "#1120e3": "clear blue", 38 | "#e1f36b": "light, clear, yellowish green", 39 | "#943f42": "calm, brownish red", 40 | "#621d73": "dark, calm, purpleish magenta", 41 | "#e75889": "clear, magentaish red", 42 | "#68132f": "dark, clear, magentaish brown", 43 | "#e47141": "clear orange", 44 | "#57ce31": "calm green", 45 | "#85323b": "dark, calm, brownish red", 46 | "#cbc50d": "clear olive", 47 | "#dc304c": "clear red", 48 | "#a06d04": "dark, vibrant, oliveish brown", 49 | "#4c1450": "dark, calm, purpleish magenta", 50 | "#b0550a": "clear orange", 51 | "#6e35fe": "vibrant, purpleish blue", 52 | "#adcbba": "light, faded green", 53 | "#4dc72c": "calm green", 54 | "#afd04f": "calm green", 55 | "#f00e0f": "clear red", 56 | "#05241c": "very dark, clear turquoise", 57 | "#27545b": "dark, calm cyan", 58 | "#a8920a": "dark, clear olive", 59 | "#ca5737": "calm orange", 60 | "#304464": "dark, faded blue", 61 | "#9dd2ee": "light, clear, blueish cyan", 62 | "#16bf49": "clear green", 63 | "#42f693": "clear green", 64 | "#155232": "dark, calm, turquoiseish green", 65 | "#3bc90e": "clear green", 66 | "#58554a": "dark, greyish olive", 67 | "#429728": "calm green", 68 | "#8fb0b5": "faded cyan", 69 | "#a3b22e": "calm, greenish olive", 70 | "#d9b2a3": "light, calm, orangeish brown", 71 | "#7e981d": "dark, clear, oliveish green", 72 | "#3f99f6": "vibrant, cyanish blue", 73 | "#ab506d": "calm, magentaish brown", 74 | "#fe5189": "vibrant, magentaish red", 75 | "#f595ec": "light, clear magenta", 76 | "#d365b6": "calm magenta", 77 | "#938764": "faded, brownish olive", 78 | "#01c084": "vibrant turquoise", 79 | "#b33e4f": "calm, brownish red", 80 | "#5a40ed": "clear blue", 81 | "#83f9c2": "light, clear, turquoiseish green", 82 | "#dbcfed": "very light, calm, blueish purple", 83 | "#4db363": "calm green", 84 | "#9d2de3": "clear purple", 85 | "#e86cbf": "light, clear, redish magenta", 86 | "#2ee1f4": "clear cyan", 87 | "#0995c9": "vibrant, blueish cyan", 88 | "#f9c646": "vibrant, orangeish yellow", 89 | "#96f604": "vibrant green", 90 | "#1ad3dc": "clear cyan", 91 | "#6af4b3": "light, clear, turquoiseish green", 92 | "#d9afce": "light, faded magenta", 93 | "#ac17a7": "clear magenta", 94 | "#ccb91a": "clear olive", 95 | "#b4c560": "calm, oliveish green", 96 | "#0abd3c": "clear green", 97 | "#608661": "faded green", 98 | "#1340ea": "clear blue", 99 | "#2870a4": "calm, cyanish blue", 100 | "#3635a5": "calm blue", 101 | "#1a7bb9": "clear, cyanish blue", 102 | "#cb4b33": "calm, orangeish brown", 103 | "#faed11": "vibrant yellow", 104 | "#4f5f0c": "dark, clear, oliveish green", 105 | "#04f9fb": "vibrant cyan", 106 | "#38b8b4": "calm cyan", 107 | "#360fb3": "clear blue", 108 | "#83565a": "faded, redish brown", 109 | "#2fa0a7": "calm cyan", 110 | "#25bce6": "clear cyan", 111 | "#131fce": "clear blue", 112 | "#79d7d0": "calm cyan", 113 | "#a53c0c": "dark, clear, orangeish brown", 114 | "#481b20": "dark, calm, redish brown", 115 | "#0eb707": "vibrant green", 116 | "#48c303": "vibrant green", 117 | "#2e0fa0": "dark, clear blue", 118 | "#4558ca": "calm blue", 119 | "#1f8550": "dark, calm, turquoiseish green", 120 | "#507b7d": "faded cyan", 121 | "#d014e4": "clear, purpleish magenta", 122 | "#9458e7": "clear, blueish purple", 123 | "#4f4a67": "dark, faded blue", 124 | "#11117d": "dark, clear blue", 125 | "#319d28": "calm green", 126 | "#3605a1": "dark, vibrant, blueish purple", 127 | "#7be604": "vibrant green", 128 | "#3653e4": "clear blue", 129 | "#f0f664": "light, clear, greenish yellow", 130 | "#321991": "dark, clear blue", 131 | "#07f139": "vibrant green", 132 | "#4104c6": "vibrant, blueish purple", 133 | "#c55858": "calm, brownish red", 134 | "#7098e3": "light, clear blue", 135 | "#9d103f": "dark, clear, magentaish brown", 136 | "#e172d3": "light, calm magenta", 137 | "#b62280": "clear, redish magenta", 138 | "#199006": "dark, vibrant green", 139 | "#ccbaf5": "light, clear, purpleish blue", 140 | "#3b7225": "dark, calm green", 141 | "#4f8049": "faded green", 142 | "#0d0a30": "dark, calm blue", 143 | "#541f27": "dark, calm, brownish red", 144 | "#bd0397": "vibrant magenta", 145 | "#0374bb": "vibrant, cyanish blue", 146 | "#ef19fd": "vibrant, purpleish magenta", 147 | "#5b75ef": "clear blue", 148 | "#fe135b": "vibrant, magentaish red", 149 | "#a68f5b": "faded, oliveish brown", 150 | "#75330f": "dark, clear, orangeish brown", 151 | "#0c9661": "dark, clear, turquoiseish green", 152 | "#2e1a34": "dark, faded, magentaish purple", 153 | "#0adfa8": "vibrant turquoise", 154 | "#d0c5c9": "light, greyish, magentaish brown", 155 | "#8b9ebe": "faded blue", 156 | "#f1b688": "light, clear orange", 157 | "#8ee98d": "light, clear green", 158 | "#654211": "dark, clear, orangeish brown", 159 | "#fa4201": "vibrant orange", 160 | "#d809f3": "vibrant, purpleish magenta", 161 | "#f953b4": "vibrant, redish magenta", 162 | "#53cdf4": "clear, blueish cyan", 163 | "#5f55df": "clear blue", 164 | "#a17c2c": "calm, oliveish brown", 165 | "#83dc60": "calm green", 166 | "#e6f988": "light, clear, yellowish green", 167 | "#0766a4": "dark, vibrant, cyanish blue", 168 | "#06d383": "vibrant, turquoiseish green", 169 | "#5ae282": "clear green", 170 | "#9accd8": "light, calm cyan", 171 | "#4cf4b0": "clear, turquoiseish green", 172 | "#100fcf": "clear blue", 173 | "#5e0d53": "dark, clear magenta", 174 | "#d56238": "calm orange", 175 | "#dcc801": "vibrant olive", 176 | "#314bce": "calm blue", 177 | "#e9305b": "clear red", 178 | "#4d84bc": "calm, cyanish blue", 179 | "#10a79b": "dark, clear cyan", 180 | "#e587a4": "light, calm, magentaish red", 181 | "#2de819": "clear green", 182 | "#f7e213": "vibrant yellow", 183 | "#efd58d": "light, clear, orangeish yellow", 184 | "#78d2c8": "calm cyan", 185 | "#4c4769": "dark, faded blue", 186 | "#d27226": "clear orange", 187 | "#d33d27": "clear, orangeish brown", 188 | "#6e58ee": "clear blue", 189 | "#e073f5": "light, clear, purpleish magenta", 190 | "#d1a1fb": "light, vibrant purple", 191 | "#4de816": "clear green", 192 | "#39c0dd": "clear cyan", 193 | "#d4167c": "clear, redish magenta", 194 | "#1a1619": "very dark, greyish magenta", 195 | "#f16c72": "light, clear red", 196 | "#940e5b": "dark, clear, redish magenta", 197 | "#a2c704": "vibrant, oliveish green", 198 | "#53f18a": "clear green", 199 | "#962ba4": "calm, purpleish magenta", 200 | "#df3c8f": "clear, redish magenta", 201 | "#61469b": "calm, blueish purple", 202 | "#aeb33f": "calm, greenish olive", 203 | "#ae80a4": "faded magenta", 204 | "#005408": "dark, vibrant green", 205 | "#2aff62": "vibrant green", 206 | "#fa1eb2": "vibrant, redish magenta", 207 | "#dedec1": "light, faded olive", 208 | "#24de75": "clear green", 209 | "#3a69ad": "calm blue", 210 | "#a01fe4": "clear purple", 211 | "#749297": "faded cyan", 212 | "#7f3a96": "calm, magentaish purple", 213 | "#3ca41a": "clear green", 214 | "#f96600": "vibrant orange", 215 | "#f09e39": "clear orange", 216 | "#bfba20": "clear olive", 217 | "#f3670a": "vibrant orange", 218 | "#ab9215": "clear olive", 219 | "#9e5fa6": "faded, purpleish magenta", 220 | "#2cb330": "calm green", 221 | "#616695": "faded blue", 222 | "#a0ef4b": "clear green", 223 | "#e8221f": "clear red", 224 | "#296c68": "dark, calm cyan", 225 | "#129753": "dark, clear, turquoiseish green", 226 | "#b1b4f6": "light, clear blue", 227 | "#8bb201": "dark, vibrant, oliveish green", 228 | "#c2f917": "vibrant green", 229 | "#76d156": "calm green", 230 | "#91bc47": "calm green", 231 | "#2b4239": "dark, faded, turquoiseish green", 232 | "#5f5945": "dark, faded, brownish olive", 233 | "#890e41": "dark, clear, brownish magenta", 234 | "#28ff07": "vibrant green", 235 | "#a64823": "calm orange", 236 | "#91a099": "greyish, turquoiseish green", 237 | "#6a1882": "dark, clear, magentaish purple", 238 | "#ec88bb": "light, clear, redish magenta", 239 | "#7f522d": "dark, calm, orangeish brown", 240 | "#0cfc1f": "vibrant green", 241 | "#b0c358": "calm, oliveish green", 242 | "#c3acc4": "light, faded, purpleish magenta", 243 | "#eee70c": "clear olive", 244 | "#c7369d": "calm, redish magenta", 245 | "#96c6f0": "light, clear, cyanish blue", 246 | "#76642f": "dark, calm, brownish olive", 247 | "#5a1729": "dark, calm, magentaish brown", 248 | "#81d782": "light, calm green", 249 | "#fcbb97": "light, vibrant orange", 250 | "#50d662": "calm green", 251 | "#4dc6b5": "calm turquoise", 252 | "#bea810": "clear olive", 253 | "#2d3189": "dark, calm blue", 254 | "#6916b3": "clear purple", 255 | "#62ea67": "clear green", 256 | "#087c95": "dark, clear cyan", 257 | "#dd5d20": "clear orange", 258 | "#db01a7": "vibrant magenta", 259 | "#27b596": "calm turquoise", 260 | "#d33e55": "calm red", 261 | "#6cd87c": "calm green", 262 | "#2f23e4": "clear blue", 263 | "#2c07aa": "dark, vibrant blue", 264 | "#280da0": "dark, clear blue", 265 | "#134020": "dark, calm green", 266 | "#c37a29": "calm orange", 267 | "#955803": "dark, vibrant, orangeish brown", 268 | "#4f9243": "calm green", 269 | "#16b7f1": "clear, blueish cyan", 270 | "#548535": "calm green", 271 | "#216450": "dark, calm turquoise", 272 | "#7f1fc5": "clear purple", 273 | "#d23a10": "clear orange", 274 | "#63a41b": "clear green", 275 | "#069ab7": "vibrant cyan", 276 | "#1c7e6c": "dark, calm turquoise", 277 | "#4f3f36": "dark, faded, orangeish brown", 278 | "#ea4d7c": "clear, magentaish red", 279 | "#f447cd": "clear magenta", 280 | "#37b566": "calm green", 281 | "#363fe9": "clear blue", 282 | "#083114": "dark, clear green", 283 | "#755684": "faded purple", 284 | "#cd3ac8": "calm magenta", 285 | "#2e2734": "dark, faded purple", 286 | "#b30219": "dark, vibrant red", 287 | "#2e265d": "dark, calm blue", 288 | "#8cd27d": "calm green", 289 | "#461a31": "dark, calm, brownish magenta", 290 | "#3940ff": "vibrant blue", 291 | "#ada75a": "faded olive", 292 | "#c550bb": "calm magenta", 293 | "#c9582e": "calm orange", 294 | "#8daa8a": "faded green", 295 | "#d29db2": "light, calm, brownish magenta", 296 | "#4abc29": "calm green", 297 | "#474319": "dark, calm olive", 298 | "#d098f8": "light, clear purple", 299 | "#60be83": "calm green", 300 | "#3f0d00": "dark, vibrant, brownish orange", 301 | "#b505cf": "vibrant, purpleish magenta", 302 | "#18c54b": "clear green", 303 | "#db0d1c": "clear red", 304 | "#453fdc": "clear blue", 305 | "#c34aa9": "calm magenta", 306 | "#7b4141": "faded, redish brown", 307 | "#f2d6d7": "very light, calm red", 308 | "#992a39": "calm red", 309 | "#d873c2": "calm magenta", 310 | "#d2dba4": "light, calm, oliveish green", 311 | "#a31476": "dark, clear, redish magenta", 312 | "#74f661": "light, clear green", 313 | "#6d93c3": "calm blue", 314 | "#999e14": "dark, clear, greenish olive", 315 | "#b1eb7d": "light, clear green", 316 | "#95105c": "dark, clear, redish magenta", 317 | "#00f0a0": "vibrant turquoise", 318 | "#a4959f": "greyish, brownish magenta", 319 | "#b412ab": "clear magenta", 320 | "#8c42b2": "calm purple", 321 | "#4e0fd8": "clear, blueish purple", 322 | "#4f3524": "dark, calm, orangeish brown", 323 | "#17589a": "dark, clear, cyanish blue", 324 | "#b41f78": "clear, redish magenta", 325 | "#aee08f": "light, calm green", 326 | "#3c3198": "calm blue", 327 | "#c8741f": "clear orange", 328 | "#4d4d21": "dark, calm olive", 329 | "#2c7637": "dark, calm green", 330 | "#4f2b5a": "dark, faded, magentaish purple", 331 | "#9c2ad3": "clear purple", 332 | "#9b55c7": "calm purple", 333 | "#fa663a": "vibrant orange", 334 | "#4876bc": "calm blue", 335 | "#3e36f8": "vibrant blue", 336 | "#610e5f": "dark, clear magenta", 337 | "#ad146f": "clear, redish magenta", 338 | "#dc3517": "clear, orangeish brown", 339 | "#7a7b5b": "faded, greenish olive", 340 | "#53919d": "faded cyan", 341 | "#214437": "dark, faded turquoise", 342 | "#44c35a": "calm green", 343 | "#956f3b": "calm, orangeish brown", 344 | "#d9915b": "calm orange", 345 | "#5c2039": "dark, calm, brownish magenta", 346 | "#e8c431": "clear yellow", 347 | "#77ce55": "calm green", 348 | "#a6af41": "calm, greenish olive", 349 | "#0003e1": "vibrant blue", 350 | "#3d7f18": "dark, clear green", 351 | "#8aa97a": "faded green", 352 | "#836485": "faded, purpleish magenta", 353 | "#cbc3fa": "very light, clear blue", 354 | "#6c4837": "dark, faded, orangeish brown", 355 | "#89042f": "dark, vibrant, magentaish brown", 356 | "#7a8598": "faded blue", 357 | "#56390e": "dark, clear, oliveish brown", 358 | "#0e5412": "dark, clear green", 359 | "#52e26f": "clear green", 360 | "#124ed6": "clear blue", 361 | "#d58830": "clear orange", 362 | "#6fc9f6": "light, clear, blueish cyan", 363 | "#2206b1": "dark, vibrant blue", 364 | "#4d0c4b": "dark, clear magenta", 365 | "#66acab": "faded cyan", 366 | "#79511c": "dark, calm, orangeish brown", 367 | "#5f6286": "faded blue", 368 | "#d78303": "vibrant, oliveish brown", 369 | "#41c3db": "clear cyan", 370 | "#9239e7": "clear purple", 371 | "#ee3655": "clear red", 372 | "#607fad": "faded blue", 373 | "#02bcf7": "vibrant, blueish cyan", 374 | "#39a5c0": "calm cyan", 375 | "#d5abf9": "light, clear purple", 376 | "#62af1c": "clear green", 377 | "#4bd88b": "calm green", 378 | "#7a55e6": "clear blue", 379 | "#4612f8": "vibrant blue", 380 | "#2153e8": "clear blue", 381 | "#74a6e3": "light, clear blue", 382 | "#ac91ab": "faded magenta", 383 | "#0ae765": "vibrant green", 384 | "#3cffe0": "vibrant turquoise", 385 | "#992ffc": "vibrant purple", 386 | "#cbbc86": "light, calm olive", 387 | "#21a954": "clear green", 388 | "#76fc74": "light, vibrant green", 389 | "#70adc3": "calm, blueish cyan", 390 | "#12f592": "vibrant, turquoiseish green", 391 | "#3004e8": "vibrant blue", 392 | "#7e0026": "dark, vibrant, magentaish brown", 393 | "#e5386e": "clear, magentaish red", 394 | "#9af9cf": "light, clear, turquoiseish green", 395 | "#4969cc": "calm blue", 396 | "#02afb9": "vibrant cyan", 397 | "#2624ec": "clear blue", 398 | "#b125e6": "clear, magentaish purple", 399 | "#3173b7": "calm, cyanish blue", 400 | "#4e4ee1": "clear blue", 401 | "#104024": "dark, calm green", 402 | "#291642": "dark, calm purple", 403 | "#ff45f2": "vibrant magenta", 404 | "#88c198": "faded green", 405 | "#5de59b": "clear green", 406 | "#957e07": "dark, vibrant olive", 407 | "#b00b34": "clear, magentaish red", 408 | "#a90e52": "dark, clear, redish magenta", 409 | "#7531c8": "calm purple", 410 | "#c6d721": "clear, greenish olive", 411 | "#dadf67": "calm, greenish olive", 412 | "#582e50": "dark, faded magenta", 413 | "#510db1": "clear, blueish purple", 414 | "#e1db24": "clear yellow", 415 | "#281ea9": "clear blue", 416 | "#fb77d9": "light, vibrant magenta", 417 | "#7254c0": "calm, purpleish blue", 418 | "#f42404": "vibrant, orangeish brown", 419 | "#56de29": "clear green", 420 | "#7c6901": "dark, vibrant olive", 421 | "#cbbc98": "light, faded, oliveish brown", 422 | "#95899f": "greyish purple", 423 | "#92bd4b": "calm green", 424 | "#809766": "faded green", 425 | "#f94ab2": "vibrant, redish magenta", 426 | "#e8f824": "vibrant, greenish yellow", 427 | "#187803": "dark, vibrant green", 428 | "#604f52": "dark, greyish, redish brown", 429 | "#ce5bdc": "calm, purpleish magenta", 430 | "#50a243": "calm green", 431 | "#19418a": "dark, clear blue", 432 | "#735f5c": "faded, orangeish brown", 433 | "#ef1b38": "clear red", 434 | "#e2323e": "clear red", 435 | "#6e115e": "dark, clear magenta", 436 | "#6a11cb": "clear purple", 437 | "#1bc2d8": "clear cyan", 438 | "#853ed5": "calm purple", 439 | "#4fcb8b": "calm, turquoiseish green", 440 | "#55dd34": "clear green", 441 | "#5131f2": "clear blue", 442 | "#0afa86": "vibrant, turquoiseish green", 443 | "#43924f": "calm green", 444 | "#4be58f": "clear green", 445 | "#7865da": "calm blue", 446 | "#59005a": "dark, vibrant magenta", 447 | "#782168": "dark, calm magenta", 448 | "#1a0d84": "dark, clear blue", 449 | "#16c706": "vibrant green", 450 | "#231066": "dark, clear blue", 451 | "#f41bbe": "clear magenta", 452 | "#15d53d": "clear green", 453 | "#489173": "faded, turquoiseish green", 454 | "#a89b9b": "greyish, redish brown", 455 | "#834db4": "calm purple", 456 | "#1533e2": "clear blue", 457 | "#343375": "dark, calm blue", 458 | "#03de74": "vibrant, turquoiseish green", 459 | "#79bd72": "calm green", 460 | "#b803b2": "vibrant magenta", 461 | "#27b88d": "calm turquoise", 462 | "#35cb63": "calm green", 463 | "#0a061e": "very dark, clear blue", 464 | "#31c2e9": "clear cyan", 465 | "#a53b34": "calm red", 466 | "#c01a79": "clear, redish magenta", 467 | "#54a74c": "calm green", 468 | "#7cb1eb": "light, clear, cyanish blue", 469 | "#a9df40": "clear green", 470 | "#cb65dd": "calm, purpleish magenta", 471 | "#c332ec": "clear, magentaish purple", 472 | "#54b0ae": "calm cyan", 473 | "#d2d6cb": "light, faded green", 474 | "#f03f67": "clear red", 475 | "#5c98de": "clear blue", 476 | "#fccf0b": "vibrant yellow", 477 | "#c53af6": "vibrant, magentaish purple", 478 | "#087ec8": "vibrant, cyanish blue", 479 | "#503718": "dark, calm, orangeish brown", 480 | "#a7cf6b": "calm green", 481 | "#1112b7": "clear blue", 482 | "#4826ef": "clear blue", 483 | "#c4da50": "calm, oliveish green", 484 | "#64ca9d": "calm, turquoiseish green", 485 | "#349b70": "calm, turquoiseish green", 486 | "#fe0094": "vibrant, redish magenta", 487 | "#cbf3ed": "very light, calm turquoise", 488 | "#fa14c6": "vibrant magenta", 489 | "#67b1b4": "faded cyan", 490 | "#d25255": "calm red", 491 | "#2bd621": "clear green", 492 | "#678c66": "faded green", 493 | "#7e5093": "faded, magentaish purple", 494 | "#b55ede": "clear, magentaish purple", 495 | "#cf3783": "calm, redish magenta", 496 | "#e73508": "vibrant, brownish orange", 497 | "#8e0c3e": "dark, clear, redish magenta", 498 | "#58a73e": "calm green", 499 | "#e7198b": "clear, redish magenta", 500 | "#05797f": "dark, vibrant cyan", 501 | "#b6290f": "clear, orangeish brown", 502 | "#8a32c1": "calm purple", 503 | "#94be4e": "calm green", 504 | "#10fc6c": "vibrant green", 505 | "#194b1b": "dark, calm green", 506 | "#23c33a": "clear green", 507 | "#32f85f": "vibrant green", 508 | "#17d3bd": "clear cyan", 509 | "#520368": "dark, vibrant, magentaish purple", 510 | "#761e55": "dark, calm, brownish magenta", 511 | "#597a46": "faded green", 512 | "#f1e608": "vibrant olive", 513 | "#6c45f3": "clear blue", 514 | "#099cd3": "vibrant, blueish cyan", 515 | "#b8da36": "clear, oliveish green", 516 | "#bb6e82": "calm, magentaish brown", 517 | "#e2bfcc": "light, calm, magentaish brown", 518 | "#e3ce08": "vibrant olive", 519 | "#debfda": "light, faded magenta", 520 | "#5fc712": "clear green", 521 | "#e9085d": "vibrant, redish magenta", 522 | "#374606": "dark, clear, oliveish green", 523 | "#50b48e": "calm, turquoiseish green", 524 | "#cadafe": "very light, vibrant blue", 525 | "#29f4cf": "clear turquoise", 526 | "#842f06": "dark, vibrant, orangeish brown", 527 | "#682013": "dark, clear, orangeish brown", 528 | "#b10efc": "vibrant, magentaish purple", 529 | "#0f1bad": "clear blue", 530 | "#6c3e8d": "calm purple", 531 | "#800b8d": "dark, clear, purpleish magenta", 532 | "#f43b0d": "vibrant, brownish orange", 533 | "#0b60c8": "clear blue", 534 | "#55f1f0": "clear cyan", 535 | "#7c04eb": "vibrant purple", 536 | "#ebec1a": "clear yellow", 537 | "#be9fd3": "light, calm purple", 538 | "#b760b5": "calm magenta", 539 | "#0f4d19": "dark, clear green", 540 | "#9d6587": "faded, brownish magenta", 541 | "#5b64b3": "calm blue", 542 | "#efebed": "very light, faded, brownish magenta", 543 | "#14430b": "dark, clear green", 544 | "#7c8172": "greenish grey", 545 | "#e18788": "light, calm red", 546 | "#d4a041": "calm, oliveish brown", 547 | "#e4b8e2": "light, calm magenta", 548 | "#70c6e0": "calm, blueish cyan", 549 | "#ae113d": "clear, magentaish red", 550 | "#3c2655": "dark, calm purple", 551 | "#aacdd1": "light, faded cyan", 552 | "#fe7697": "light, vibrant, magentaish red", 553 | "#939ca6": "greyish blue", 554 | "#bbf6ec": "light, clear turquoise", 555 | "#6de6ae": "light, clear, turquoiseish green", 556 | "#e53d63": "clear red", 557 | "#db612f": "clear orange", 558 | "#c4de29": "clear, yellowish green", 559 | "#5e1020": "dark, clear, brownish red", 560 | "#47b355": "calm green", 561 | "#41b0ca": "calm cyan", 562 | "#b5bbe0": "light, calm blue", 563 | "#f5699b": "light, clear, magentaish red", 564 | "#6080d1": "calm blue", 565 | "#78c6b7": "calm turquoise", 566 | "#4b006a": "dark, vibrant, magentaish purple", 567 | "#4bc65a": "calm green", 568 | "#eee22e": "clear yellow", 569 | "#e57681": "light, clear red", 570 | "#f7c929": "vibrant yellow", 571 | "#ee8725": "clear orange", 572 | "#df0444": "vibrant, magentaish red", 573 | "#024552": "dark, vibrant cyan", 574 | "#c2f32d": "clear green", 575 | "#990ac8": "clear, magentaish purple", 576 | "#56e983": "clear green", 577 | "#6078d2": "calm blue", 578 | "#133264": "dark, clear blue", 579 | "#ab43ad": "calm magenta", 580 | "#919a78": "faded green", 581 | "#9791ec": "light, clear blue", 582 | "#b922fe": "vibrant, magentaish purple", 583 | "#d8cec1": "light, faded, orangeish brown", 584 | "#69422d": "dark, calm, orangeish brown", 585 | "#8bcc1d": "clear green", 586 | "#0f658b": "dark, clear, blueish cyan", 587 | "#0ed7fb": "vibrant cyan", 588 | "#15492c": "dark, calm green", 589 | "#2c4532": "dark, faded green", 590 | "#421ea2": "clear, purpleish blue", 591 | "#597cd2": "calm blue", 592 | "#b8bdbc": "light, turquoiseish grey", 593 | "#f53223": "vibrant red", 594 | "#872325": "dark, calm red", 595 | "#3b5b58": "dark, faded cyan", 596 | "#0df57f": "vibrant, turquoiseish green", 597 | "#077006": "dark, clear green", 598 | "#7de1ca": "light, calm turquoise", 599 | "#521931": "dark, calm, brownish magenta", 600 | "#d72829": "clear red", 601 | "#b0a699": "faded, orangeish brown", 602 | "#2505ca": "vibrant blue", 603 | "#3123a7": "calm blue", 604 | "#211f50": "dark, calm blue", 605 | "#462052": "dark, calm, magentaish purple", 606 | "#f297b2": "light, clear, magentaish red", 607 | "#893e99": "calm, purpleish magenta", 608 | "#a3894d": "faded, oliveish brown", 609 | "#e146fc": "vibrant, purpleish magenta", 610 | "#3c6f76": "dark, faded cyan", 611 | "#366eef": "clear blue", 612 | "#e63564": "clear, magentaish red", 613 | "#3f7d7b": "faded cyan", 614 | "#970656": "dark, vibrant, redish magenta", 615 | "#c3a8d8": "light, calm purple", 616 | "#81daf1": "light, clear cyan", 617 | "#e8deba": "light, calm olive", 618 | "#53229e": "calm, blueish purple", 619 | "#c40c4a": "clear, magentaish red", 620 | "#11fe4e": "vibrant green", 621 | "#49b6c6": "calm cyan", 622 | "#434383": "faded blue", 623 | "#e73ae6": "clear magenta", 624 | "#f37fd5": "light, clear magenta", 625 | "#cd849c": "light, calm, magentaish brown", 626 | "#6b9092": "faded cyan", 627 | "#ab4aab": "calm magenta", 628 | "#fd153f": "vibrant red", 629 | "#96175c": "dark, clear, redish magenta", 630 | "#519490": "faded cyan", 631 | "#bccb96": "light, faded green", 632 | "#9b47c2": "calm, magentaish purple", 633 | "#a2c98a": "light, calm green", 634 | "#261b98": "dark, clear blue", 635 | "#ef06b5": "vibrant magenta", 636 | "#6c1960": "dark, calm magenta", 637 | "#f43573": "clear, magentaish red", 638 | "#069ddd": "vibrant, blueish cyan", 639 | "#97ae2c": "calm, oliveish green", 640 | "#ec71d6": "light, clear magenta", 641 | "#960c57": "dark, clear, redish magenta", 642 | "#922007": "dark, clear, brownish orange", 643 | "#223753": "dark, calm blue", 644 | "#f8cfef": "very light, clear magenta", 645 | "#be413c": "calm red", 646 | "#5c3353": "dark, faded magenta", 647 | "#e8690d": "clear orange", 648 | "#c52680": "clear, redish magenta", 649 | "#935ac6": "calm purple", 650 | "#01a9ca": "vibrant cyan", 651 | "#bfebad": "light, calm green", 652 | "#a41e3b": "clear red", 653 | "#31f15a": "clear green", 654 | "#053763": "dark, clear, cyanish blue", 655 | "#5856c0": "calm blue", 656 | "#0d8dae": "clear cyan", 657 | "#2b61d4": "clear blue", 658 | "#3b4068": "dark, faded blue", 659 | "#43471e": "dark, calm, greenish olive", 660 | "#bbd860": "calm green", 661 | "#fbab1d": "vibrant, yellowish orange", 662 | "#96a8eb": "light, clear blue", 663 | "#142b74": "dark, clear blue", 664 | "#4b2d35": "dark, faded, magentaish brown", 665 | "#5a97a7": "faded cyan", 666 | "#f32598": "clear, redish magenta", 667 | "#ea6055": "clear red", 668 | "#5d4800": "dark, vibrant, brownish olive", 669 | "#9be5dd": "light, calm cyan", 670 | "#84d37e": "light, calm green", 671 | "#dc4708": "vibrant orange", 672 | "#7963bf": "calm blue", 673 | "#c826cc": "clear magenta", 674 | "#06acc3": "vibrant cyan", 675 | "#d3094b": "vibrant, magentaish red", 676 | "#45b012": "clear green", 677 | "#7aef51": "clear green", 678 | "#3a0ad5": "vibrant blue", 679 | "#5b1497": "dark, clear purple", 680 | "#4b1cb0": "clear, blueish purple", 681 | "#3d4f9a": "calm blue", 682 | "#2264dc": "clear blue", 683 | "#4e2e3e": "dark, faded, brownish magenta", 684 | "#2e4066": "dark, calm blue", 685 | "#e8a226": "clear, yellowish orange", 686 | "#d7fb6b": "light, vibrant green", 687 | "#0c0652": "dark, clear blue", 688 | "#1dfcff": "vibrant cyan", 689 | "#0fdd14": "clear green", 690 | "#e5f9f5": "very light, calm turquoise", 691 | "#e1c171": "light, calm, brownish olive", 692 | "#93b7ec": "light, clear blue", 693 | "#50679b": "faded blue", 694 | "#e1aa93": "light, calm orange", 695 | "#0076cb": "vibrant, cyanish blue", 696 | "#357f1b": "dark, calm green", 697 | "#31f915": "vibrant green", 698 | "#7d697e": "greyish, purpleish magenta", 699 | "#f673a6": "light, clear, redish magenta", 700 | "#5c19fd": "vibrant, purpleish blue", 701 | "#945c05": "dark, vibrant, oliveish brown", 702 | "#fdadc1": "light, vibrant, magentaish red", 703 | "#3f4a28": "dark, faded green", 704 | "#22fe25": "vibrant green", 705 | "#62f09e": "light, clear green", 706 | "#8bc1b3": "faded turquoise", 707 | "#3b0869": "dark, clear purple", 708 | "#45a5d1": "calm, blueish cyan", 709 | "#80d979": "light, calm green", 710 | "#c86c8f": "calm, redish magenta", 711 | "#411157": "dark, clear, magentaish purple", 712 | "#05ec81": "vibrant, turquoiseish green", 713 | "#43f66d": "clear green", 714 | "#94e09b": "light, calm green", 715 | "#b747ce": "calm, purpleish magenta", 716 | "#53bf9c": "calm turquoise", 717 | "#5c4609": "dark, clear, brownish olive", 718 | "#560d3c": "dark, clear, brownish magenta", 719 | "#11c3ec": "clear cyan", 720 | "#cf0364": "vibrant, redish magenta", 721 | "#4b919c": "faded cyan", 722 | "#e291fb": "light, vibrant, magentaish purple", 723 | "#f0169f": "clear, redish magenta", 724 | "#09aed2": "vibrant cyan", 725 | "#d873cf": "calm magenta", 726 | "#b9d9e2": "light, calm cyan", 727 | "#5792f2": "clear blue", 728 | "#b794e1": "light, calm purple", 729 | "#0d4175": "dark, clear, cyanish blue", 730 | "#fdb233": "vibrant, yellowish orange", 731 | "#b5924f": "calm, oliveish brown", 732 | "#fe0012": "vibrant red", 733 | "#15dcda": "clear cyan", 734 | "#dfa305": "vibrant, brownish olive", 735 | "#b7cce8": "light, calm blue", 736 | "#29f2ce": "clear turquoise", 737 | "#f4d0ed": "very light, calm magenta", 738 | "#cab3bd": "light, faded, brownish magenta", 739 | "#a85b30": "calm orange", 740 | "#fdd440": "vibrant yellow", 741 | "#b25fa9": "faded magenta", 742 | "#6923ef": "clear, blueish purple", 743 | "#20d20f": "clear green", 744 | "#0b48cc": "clear blue", 745 | "#00cccc": "vibrant cyan", 746 | "#e9a314": "clear, oliveish brown", 747 | "#ce43c1": "calm magenta", 748 | "#d92091": "clear, redish magenta", 749 | "#e79c3c": "clear orange", 750 | "#158a5a": "dark, clear, turquoiseish green", 751 | "#486237": "dark, faded green", 752 | "#2f38b4": "calm blue", 753 | "#bf1bf4": "clear, magentaish purple", 754 | "#419e1f": "clear green", 755 | "#290bd5": "clear blue", 756 | "#9c4f41": "calm, orangeish brown", 757 | "#140b69": "dark, clear blue", 758 | "#cba179": "calm, orangeish brown", 759 | "#f3b9a9": "light, clear orange", 760 | "#3e23c1": "clear blue", 761 | "#31288b": "dark, calm blue", 762 | "#d7770a": "vibrant orange", 763 | "#d26f05": "vibrant orange", 764 | "#a8d1c6": "light, faded turquoise", 765 | "#7b79a7": "faded blue", 766 | "#7da38a": "faded green", 767 | "#dc33c2": "clear magenta", 768 | "#62590b": "dark, clear olive", 769 | "#7eea41": "clear green", 770 | "#b26458": "calm, orangeish brown", 771 | "#c9cc71": "calm, greenish olive", 772 | "#a9ea62": "clear green", 773 | "#4547a6": "calm blue", 774 | "#daadbd": "light, calm, magentaish brown", 775 | "#316c53": "dark, calm, turquoiseish green", 776 | "#eb85eb": "light, clear magenta", 777 | "#501b5a": "dark, calm, purpleish magenta", 778 | "#43bbcf": "calm cyan", 779 | "#c3da40": "clear, oliveish green", 780 | "#7a27ab": "calm purple", 781 | "#4934d7": "clear blue", 782 | "#2e8818": "dark, clear green", 783 | "#7c839f": "faded blue", 784 | "#e8d080": "light, clear, brownish olive", 785 | "#0f86e3": "clear, cyanish blue", 786 | "#7d232e": "dark, calm red", 787 | "#a40cf5": "vibrant purple", 788 | "#629f5f": "faded green", 789 | "#4395e8": "clear, cyanish blue", 790 | "#360aa7": "dark, clear, purpleish blue", 791 | "#e1d5f8": "very light, clear, blueish purple", 792 | "#0677fd": "vibrant blue", 793 | "#22385b": "dark, calm blue", 794 | "#a86154": "faded, orangeish brown", 795 | "#4c2b49": "dark, faded magenta", 796 | "#fe608b": "light, vibrant, magentaish red", 797 | "#3b7b84": "calm cyan", 798 | "#7e6188": "faded, magentaish purple", 799 | "#dbb398": "light, calm, orangeish brown", 800 | "#7d2341": "dark, calm, magentaish brown", 801 | "#50ba61": "calm green", 802 | "#58ac32": "calm green", 803 | "#e08438": "clear orange", 804 | "#14abff": "vibrant, blueish cyan", 805 | "#541fe2": "clear, purpleish blue", 806 | "#5a30e1": "clear blue", 807 | "#476c86": "faded, cyanish blue", 808 | "#369d22": "calm green", 809 | "#15a67c": "clear turquoise", 810 | "#cbb929": "clear olive", 811 | "#dd7b8f": "light, calm red", 812 | "#1577eb": "clear blue", 813 | "#051911": "green-tinted black", 814 | "#3cc9ea": "clear cyan", 815 | "#bf9b44": "calm, oliveish brown", 816 | "#3e67cf": "calm blue", 817 | "#152451": "dark, calm blue", 818 | "#2b4905": "dark, clear green", 819 | "#c230fb": "vibrant, magentaish purple", 820 | "#7d4bb4": "calm purple", 821 | "#cca374": "calm, orangeish brown", 822 | "#894d2b": "dark, calm orange", 823 | "#a7ae5f": "faded, greenish olive", 824 | "#694d04": "dark, vibrant, brownish olive", 825 | "#66c890": "calm green", 826 | "#1feb4c": "clear green", 827 | "#320342": "dark, vibrant, magentaish purple", 828 | "#4bb3de": "clear, blueish cyan", 829 | "#2d235a": "dark, calm blue", 830 | "#d2c1e8": "light, calm purple", 831 | "#da8153": "calm orange", 832 | "#45d2d8": "calm cyan", 833 | "#7c103b": "dark, clear, brownish magenta", 834 | "#af7d08": "dark, vibrant, oliveish brown", 835 | "#14831d": "dark, clear green", 836 | "#80535a": "faded, redish brown", 837 | "#bf4ed3": "calm, purpleish magenta", 838 | "#2338c4": "clear blue", 839 | "#320c9d": "dark, clear, purpleish blue", 840 | "#79b668": "faded green", 841 | "#2ee034": "clear green", 842 | "#7381c1": "calm blue", 843 | "#37c6ba": "calm cyan", 844 | "#6384b5": "faded blue", 845 | "#05fa96": "vibrant, turquoiseish green", 846 | "#cb8f28": "clear, oliveish brown", 847 | "#74858b": "greyish, blueish cyan", 848 | "#9ed8c7": "light, calm turquoise", 849 | "#a4ad05": "dark, vibrant, greenish olive", 850 | "#ae0544": "dark, vibrant, magentaish red", 851 | "#4aeffa": "vibrant cyan", 852 | "#0af7eb": "vibrant cyan", 853 | "#3a0dc2": "clear blue", 854 | "#19ea0a": "vibrant green", 855 | "#0b7484": "dark, clear cyan", 856 | "#264122": "dark, faded green", 857 | "#36b506": "vibrant green", 858 | "#9a5314": "dark, clear, orangeish brown", 859 | "#692ff5": "clear, purpleish blue", 860 | "#8df660": "light, clear green", 861 | "#cb4ceb": "clear, purpleish magenta", 862 | "#820433": "dark, vibrant, magentaish brown", 863 | "#1c89fe": "vibrant, cyanish blue", 864 | "#f8c3fb": "very light, clear, purpleish magenta", 865 | "#3f1aeb": "clear blue", 866 | "#aaafaa": "light, greenish grey", 867 | "#bef29b": "light, clear green", 868 | "#fb3b04": "vibrant orange", 869 | "#b7bb21": "clear, greenish olive", 870 | "#736510": "dark, clear olive", 871 | "#63e5c2": "clear turquoise", 872 | "#f2997a": "light, clear orange", 873 | "#3fecad": "clear turquoise", 874 | "#74f712": "vibrant green", 875 | "#7cba67": "calm green", 876 | "#e1f66a": "light, clear, yellowish green", 877 | "#6f0f2f": "dark, clear, magentaish brown", 878 | "#d69d03": "vibrant, brownish olive", 879 | "#aff557": "clear green", 880 | "#b112a2": "clear magenta", 881 | "#2d1b74": "dark, calm blue", 882 | "#bd40c9": "calm, purpleish magenta", 883 | "#40b675": "calm green", 884 | "#3d79dd": "clear blue", 885 | "#4c7340": "dark, faded green", 886 | "#590f99": "dark, clear purple", 887 | "#515a6c": "faded blue", 888 | "#f523c5": "vibrant magenta", 889 | "#a75e13": "clear orange", 890 | "#227a98": "calm, blueish cyan", 891 | "#1d060d": "very dark, calm, magentaish brown", 892 | "#529cf2": "clear blue", 893 | "#cdf2b0": "light, clear green", 894 | "#0dcadd": "clear cyan", 895 | "#f4ff9f": "light, vibrant, greenish yellow", 896 | "#f18d31": "clear orange", 897 | "#36bb96": "calm turquoise", 898 | "#e49077": "light, clear orange", 899 | "#da00a1": "vibrant magenta", 900 | "#7b4cf1": "clear, purpleish blue", 901 | "#a1a605": "dark, vibrant, greenish olive", 902 | "#bfefd8": "light, calm, turquoiseish green", 903 | "#d59e1c": "clear, oliveish brown", 904 | "#87e8a9": "light, clear green", 905 | "#4fd107": "vibrant green", 906 | "#226a53": "dark, calm turquoise", 907 | "#3e47aa": "calm blue", 908 | "#96af48": "calm green", 909 | "#58a29f": "faded cyan", 910 | "#50cfcc": "calm cyan", 911 | "#38cb04": "vibrant green", 912 | "#b5c427": "clear, greenish olive", 913 | "#7584b5": "faded blue", 914 | "#6058b2": "calm blue", 915 | "#3ff2da": "clear turquoise", 916 | "#d98338": "clear orange", 917 | "#61d4ca": "calm cyan", 918 | "#4a34df": "clear blue", 919 | "#37d8b2": "clear turquoise", 920 | "#525e0e": "dark, clear, oliveish green", 921 | "#e40c8c": "clear, redish magenta", 922 | "#a67583": "faded, magentaish brown", 923 | "#3eec8a": "clear green", 924 | "#64528b": "faded, blueish purple", 925 | "#c7fac6": "very light, clear green", 926 | "#9154ad": "faded, magentaish purple", 927 | "#39f244": "clear green", 928 | "#82f8b9": "light, clear, turquoiseish green", 929 | "#54f23d": "clear green", 930 | "#07ead7": "vibrant cyan", 931 | "#00df80": "vibrant, turquoiseish green", 932 | "#af3e7a": "calm, redish magenta", 933 | "#d0fa84": "light, vibrant green", 934 | "#8df389": "light, clear green", 935 | "#0c795c": "dark, clear turquoise", 936 | "#d13427": "clear red", 937 | "#2b35b9": "calm blue", 938 | "#9ffed4": "light, vibrant, turquoiseish green", 939 | "#1f55af": "clear blue", 940 | "#1ceb1d": "clear green", 941 | "#923b42": "calm, brownish red", 942 | "#c731b1": "calm magenta", 943 | "#db26f6": "vibrant, purpleish magenta", 944 | "#0439fe": "vibrant blue", 945 | "#f708a7": "vibrant, redish magenta", 946 | "#885970": "faded, brownish magenta", 947 | "#85dc93": "light, calm green", 948 | "#3e7824": "dark, calm green", 949 | "#944cc7": "calm purple", 950 | "#8b4241": "calm, redish brown", 951 | "#5821ba": "clear, blueish purple", 952 | "#99e9b7": "light, calm green", 953 | "#607734": "dark, calm green", 954 | "#3ed4a9": "calm turquoise", 955 | "#f5a44c": "clear orange", 956 | "#239e39": "calm green", 957 | "#e190b9": "light, calm, redish magenta", 958 | "#af1f88": "clear magenta", 959 | "#db8a5c": "calm orange", 960 | "#b3cea4": "light, faded green", 961 | "#5859b0": "faded blue", 962 | "#f50eab": "vibrant, redish magenta", 963 | "#e79219": "clear orange", 964 | "#16ea60": "clear green", 965 | "#864fbe": "calm purple", 966 | "#cf29cd": "clear magenta", 967 | "#90443d": "calm, brownish red", 968 | "#1b5d8c": "dark, clear, cyanish blue", 969 | "#a0ba0f": "clear, oliveish green", 970 | "#d98c75": "calm orange", 971 | "#427888": "faded, blueish cyan", 972 | "#654dd1": "calm blue", 973 | "#491282": "dark, clear purple", 974 | "#2c4df7": "vibrant blue", 975 | "#26d29c": "clear turquoise", 976 | "#f4bd2b": "clear, orangeish yellow", 977 | "#07d1f9": "vibrant cyan", 978 | "#7973c0": "calm blue", 979 | "#037f0e": "dark, vibrant green", 980 | "#3ae84a": "clear green", 981 | "#933ace": "calm purple", 982 | "#37fbe1": "vibrant turquoise", 983 | "#dbba26": "clear yellow", 984 | "#945dea": "clear, blueish purple", 985 | "#e66a20": "clear orange", 986 | "#d875c6": "calm magenta", 987 | "#b4d370": "calm green", 988 | "#706d1b": "dark, calm olive", 989 | "#4479e2": "clear blue", 990 | "#cf06e1": "vibrant, purpleish magenta", 991 | "#0d25ec": "clear blue", 992 | "#ba1344": "clear, magentaish red", 993 | "#4e03cb": "vibrant, blueish purple", 994 | "#a8639a": "faded magenta", 995 | "#782a92": "calm, magentaish purple", 996 | "#835f42": "faded, orangeish brown", 997 | "#fc2f55": "vibrant red", 998 | "#f3d2d2": "very light, calm red", 999 | "#f057ef": "clear magenta", 1000 | "#ed5f52": "clear red", 1001 | "#2428fc": "vibrant blue", 1002 | "#36e073": "clear green" 1003 | }; 1004 | 1005 | describe('Check if hex matches output color', () => { 1006 | Object.entries(cases).forEach(([hex, color]) => { 1007 | it(`${hex} returns "${color}"`, () => { 1008 | expect(naevner(hex)).toEqual(color); 1009 | }); 1010 | }) 1011 | }); 1012 | --------------------------------------------------------------------------------