diff --git a/src/components/menu.tsx b/src/components/menu.tsx index 3907267..a773986 100644 --- a/src/components/menu.tsx +++ b/src/components/menu.tsx @@ -16,6 +16,7 @@ import { Timelapse as TimelapseIcon, Help as HelpIcon, CoPresent as CoPresentIcon, + ColorLens as ColorLensIcon, } from '@mui/icons-material'; import { useContext } from "react"; @@ -82,6 +83,13 @@ const getMenu: IMenu[] = [ url: '/convert', needsInternet: false, }, + { + name: 'Colour Picker', + icon: , + category: Category.Conversion, + url: '/colour', + needsInternet: false, + }, { name: 'Cron Calculator', icon: , diff --git a/src/index.tsx b/src/index.tsx index 44710ff..750dc0a 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -7,7 +7,7 @@ import Layout from "./theme/layout"; import { ErrorBoundary } from "./error"; import { Home, AboutPage, CronConversionPage, DomainToolsHome, HelpPage, InspectionHome, - InspectonResultDisplay, StringConversionPage, UnixEpochPage + InspectonResultDisplay, StringConversionPage, UnixEpochPage, ColourPickerPage } from './pages'; import { ConnectionContext } from './context'; @@ -39,6 +39,9 @@ const App = () => { } /> } /> } /> + } /> + } /> + } /> } /> } /> } /> diff --git a/src/interfaces.ts b/src/interfaces.ts index 0c879f3..7d35772 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -149,3 +149,38 @@ export interface IDomainSelection { protocol: string; url: string; } + +export interface RGB { + r: number; + g: number; + b: number; +} + +export interface HSL { + h: number; + s: number; + l: number; +} + +export interface CMYK { + c: number; + m: number; + y: number; + k: number; +} + +export interface Hue { + p: number; + q: number; + t: number; +} + +export interface IColourValues { + hex: string; + rgb: RGB; + hsl: HSL; + cmyk: CMYK; + htmlCode: string; + xkcdCode: string; + oxVar: string; +} diff --git a/src/pages/colour.tsx b/src/pages/colour.tsx new file mode 100644 index 0000000..f35eff1 --- /dev/null +++ b/src/pages/colour.tsx @@ -0,0 +1,287 @@ +import { Button, Card, Grid, InputAdornment, TextField, Typography } from "@mui/material"; +import { useEffect, useState } from "react"; +import { CMYK, HSL, IColourValues, RGB } from "../interfaces"; +import { cmykToAll, hexToAll, hslToAll, isValidColorString, rgbToAll } from "../utils/colourUtils"; + +const siteTitle = "Colour Picker"; + +const ColourPickerPage = () => { + const inputGet = window.location.hash.split('/').slice(-1)[0]; + const startingVal = isValidColorString(inputGet) ? inputGet : '9c27b0'; + const [colours, setColours] = useState(hexToAll(`#${startingVal}`)); + + useEffect(() => { document.title = `${siteTitle} - What's This?` }); + + useEffect(() => { + if (isValidColorString(colours.hex)) { + window.location.href = `/#/colour/${colours.hex.replace('#', '')}` + } + }, [colours]); + + return ( + <> + {siteTitle} + Select a colour you like, and convert it into many different formats. + + + + + Picker + + + { + setColours(hexToAll(e.target.value)); + }} /> + + + + + + Hex + + + setColours(hexToAll(e.target.value))} + /> + + + + + + + + + RGB + + + + R, + }} + onChange={(e) => { + const rgb: RGB = { ...colours.rgb, r: parseInt(e.target.value) } + setColours(rgbToAll(rgb)); + }} + /> + + + G, + }} + onChange={(e) => { + const rgb: RGB = { ...colours.rgb, g: parseInt(e.target.value) } + setColours(rgbToAll(rgb)); + }} + /> + + + B, + }} + onChange={(e) => { + const rgb: RGB = { ...colours.rgb, b: parseInt(e.target.value) } + setColours(rgbToAll(rgb)); + }} + /> + + + + + + + + + + HSL + + + + H, + }} + onChange={(e) => { + const hsl: HSL = { ...colours.hsl, h: parseInt(e.target.value) } + setColours(hslToAll(hsl)); + }} + /> + + + S, + endAdornment: %, + }} + onChange={(e) => { + const hsl: HSL = { ...colours.hsl, s: parseInt(e.target.value) } + setColours(hslToAll(hsl)); + }} + /> + + + L, + endAdornment: %, + }} + onChange={(e) => { + const hsl: HSL = { ...colours.hsl, l: parseInt(e.target.value) } + setColours(hslToAll(hsl)); + }} + /> + + + + + + + + + + CMYK + + + + C, + endAdornment: %, + }} + onChange={(e) => { + const cmyk: CMYK = { ...colours.cmyk, c: parseInt(e.target.value) } + setColours(cmykToAll(cmyk)); + }} + /> + + + M, + endAdornment: %, + }} + onChange={(e) => { + const cmyk: CMYK = { ...colours.cmyk, m: parseInt(e.target.value) } + setColours(cmykToAll(cmyk)); + }} + /> + + + Y, + endAdornment: %, + }} + onChange={(e) => { + const cmyk: CMYK = { ...colours.cmyk, y: parseInt(e.target.value) } + setColours(cmykToAll(cmyk)); + }} + /> + + + K, + endAdornment: %, + }} + onChange={(e) => { + const cmyk: CMYK = { ...colours.cmyk, k: parseInt(e.target.value) } + setColours(cmykToAll(cmyk)); + }} + /> + + + + + + + + + + HTML Name + + + {colours.htmlCode} + + + + + + XKCD Name + + + {colours.xkcdCode} + + + + + + 0x Variant + + + {colours.oxVar} + + + + + ); +} + +export default ColourPickerPage; diff --git a/src/pages/index.ts b/src/pages/index.ts index 8d11ee7..ae79eef 100644 --- a/src/pages/index.ts +++ b/src/pages/index.ts @@ -5,3 +5,4 @@ export { default as StringConversionPage } from './converter'; export { default as CronConversionPage } from './cron'; export { AboutPage, HelpPage } from './help'; export { default as UnixEpochPage } from './time'; +export { default as ColourPickerPage } from './colour'; diff --git a/src/utils/colourCodes/htmlColours.json b/src/utils/colourCodes/htmlColours.json new file mode 100644 index 0000000..384de5d --- /dev/null +++ b/src/utils/colourCodes/htmlColours.json @@ -0,0 +1,143 @@ +{ + "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", + "DarkKhaki": "#BDB76B", + "DarkMagenta": "#8B008B", + "DarkOliveGreen": "#556B2F", + "DarkOrange": "#FF8C00", + "DarkOrchid": "#9932CC", + "DarkRed": "#8B0000", + "DarkSalmon": "#E9967A", + "DarkSeaGreen": "#8FBC8F", + "DarkSlateBlue": "#483D8B", + "DarkSlateGray": "#2F4F4F", + "DarkTurquoise": "#00CED1", + "DarkViolet": "#9400D3", + "DeepPink": "#FF1493", + "DeepSkyBlue": "#00BFFF", + "DimGray": "#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", + "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", + "LightPink": "#FFB6C1", + "LightSalmon": "#FFA07A", + "LightSeaGreen": "#20B2AA", + "LightSkyBlue": "#87CEFA", + "LightSlateGray": "#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", + "Orange": "#FFA500", + "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", + "RebeccaPurple": "#663399", + "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", + "Snow": "#FFFAFA", + "SpringGreen": "#00FF7F", + "SteelBlue": "#4682B4", + "Tan": "#D2B48C", + "Teal": "#008080", + "Thistle": "#D8BFD8", + "Tomato": "#FF6347", + "Turquoise": "#40E0D0", + "Violet": "#EE82EE", + "Wheat": "#F5DEB3", + "White": "#FFFFFF", + "WhiteSmoke": "#F5F5F5", + "Yellow": "#FFFF00", + "YellowGreen": "#9ACD32" +} diff --git a/src/utils/colourCodes/xkcdColours.json b/src/utils/colourCodes/xkcdColours.json new file mode 100644 index 0000000..8b39c6d --- /dev/null +++ b/src/utils/colourCodes/xkcdColours.json @@ -0,0 +1,951 @@ +{ + "Cloudy Blue": "#ACC2D9", + "Dark Pastel Green": "#56AE57", + "Dust": "#B2996E", + "Electric Lime": "#A8FF04", + "Fresh Green": "#69D84F", + "Light Eggplant": "#894585", + "Nasty Green": "#70B23F", + "Really Light Blue": "#D4FFFF", + "Tea": "#65AB7C", + "Warm Purple": "#952E8F", + "Yellowish Tan": "#FCFC81", + "Cement": "#A5A391", + "Dark Grass Green": "#388004", + "Dusty Teal": "#4C9085", + "Grey Teal": "#5E9B8A", + "Macaroni And Cheese": "#EFB435", + "Pinkish Tan": "#D99B82", + "Spruce": "#0A5F38", + "Strong Blue": "#0C06F7", + "Toxic Green": "#61DE2A", + "Windows Blue": "#3778BF", + "Blue Blue": "#2242C7", + "Blue With A Hint Of Purple": "#533CC6", + "Booger": "#9BB53C", + "Bright Sea Green": "#05FFA6", + "Dark Green Blue": "#1F6357", + "Deep Turquoise": "#017374", + "Green Teal": "#0CB577", + "Strong Pink": "#FF0789", + "Bland": "#AFA88B", + "Deep Aqua": "#08787F", + "Lavender Pink": "#DD85D7", + "Light Moss Green": "#A6C875", + "Light Seafoam Green": "#A7FFB5", + "Olive Yellow": "#C2B709", + "Pig Pink": "#E78EA5", + "Deep Lilac": "#966EBD", + "Desert": "#CCAD60", + "Dusty Lavender": "#AC86A8", + "Purpley Grey": "#947E94", + "Purply": "#983FB2", + "Candy Pink": "#FF63E9", + "Light Pastel Green": "#B2FBA5", + "Boring Green": "#63B365", + "Kiwi Green": "#8EE53F", + "Light Grey Green": "#B7E1A1", + "Orange Pink": "#FF6F52", + "Tea Green": "#BDF8A3", + "Very Light Brown": "#D3B683", + "Egg Shell": "#FFFCC4", + "Eggplant Purple": "#430541", + "Powder Pink": "#FFB2D0", + "Reddish Grey": "#997570", + "Baby Shit Brown": "#AD900D", + "Liliac": "#C48EFD", + "Stormy Blue": "#507B9C", + "Ugly Brown": "#7D7103", + "Custard": "#FFFD78", + "Darkish Pink": "#DA467D", + "Deep Brown": "#410200", + "Greenish Beige": "#C9D179", + "Manilla": "#FFFA86", + "Off Blue": "#5684AE", + "Battleship Grey": "#6B7C85", + "Browny Green": "#6F6C0A", + "Bruise": "#7E4071", + "Kelley Green": "#009337", + "Sickly Yellow": "#D0E429", + "Sunny Yellow": "#FFF917", + "Azul": "#1D5DEC", + "Darkgreen": "#054907", + "Green/Yellow": "#B5CE08", + "Lichen": "#8FB67B", + "Light Light Green": "#C8FFB0", + "Pale Gold": "#FDDE6C", + "Sun Yellow": "#FFDF22", + "Tan Green": "#A9BE70", + "Burple": "#6832E3", + "Butterscotch": "#FDB147", + "Toupe": "#C7AC7D", + "Dark Cream": "#FFF39A", + "Indian Red": "#850E04", + "Light Lavendar": "#EFC0FE", + "Poison Green": "#40FD14", + "Baby Puke Green": "#B6C406", + "Bright Yellow Green": "#9DFF00", + "Charcoal Grey": "#3C4142", + "Squash": "#F2AB15", + "Cinnamon": "#AC4F06", + "Light Pea Green": "#C4FE82", + "Radioactive Green": "#2CFA1F", + "Raw Sienna": "#9A6200", + "Baby Purple": "#CA9BF7", + "Cocoa": "#875F42", + "Light Royal Blue": "#3A2EFE", + "Orangeish": "#FD8D49", + "Rust Brown": "#8B3103", + "Sand Brown": "#CBA560", + "Swamp": "#698339", + "Tealish Green": "#0CDC73", + "Burnt Siena": "#B75203", + "Camo": "#7F8F4E", + "Dusk Blue": "#26538D", + "Fern": "#63A950", + "Old Rose": "#C87F89", + "Pale Light Green": "#B1FC99", + "Peachy Pink": "#FF9A8A", + "Rosy Pink": "#F6688E", + "Light Bluish Green": "#76FDA8", + "Light Bright Green": "#53FE5C", + "Light Neon Green": "#4EFD54", + "Light Seafoam": "#A0FEBF", + "Tiffany Blue": "#7BF2DA", + "Washed Out Green": "#BCF5A6", + "Browny Orange": "#CA6B02", + "Nice Blue": "#107AB0", + "Sapphire": "#2138AB", + "Greyish Teal": "#719F91", + "Orangey Yellow": "#FDB915", + "Parchment": "#FEFCAF", + "Straw": "#FCF679", + "Very Dark Brown": "#1D0200", + "Terracota": "#CB6843", + "Ugly Blue": "#31668A", + "Clear Blue": "#247AFD", + "Creme": "#FFFFB6", + "Foam Green": "#90FDA9", + "Grey/Green": "#86A17D", + "Light Gold": "#FDDC5C", + "Seafoam Blue": "#78D1B6", + "Topaz": "#13BBAF", + "Violet Pink": "#FB5FFC", + "Wintergreen": "#20F986", + "Yellow Tan": "#FFE36E", + "Dark Fuchsia": "#9D0759", + "Indigo Blue": "#3A18B1", + "Light Yellowish Green": "#C2FF89", + "Pale Magenta": "#D767AD", + "Rich Purple": "#720058", + "Sunflower Yellow": "#FFDA03", + "Green/Blue": "#01C08D", + "Leather": "#AC7434", + "Racing Green": "#014600", + "Vivid Purple": "#9900FA", + "Dark Royal Blue": "#02066F", + "Hazel": "#8E7618", + "Muted Pink": "#D1768F", + "Booger Green": "#96B403", + "Canary": "#FDFF63", + "Cool Grey": "#95A3A6", + "Dark Taupe": "#7F684E", + "Darkish Purple": "#751973", + "True Green": "#089404", + "Coral Pink": "#FF6163", + "Dark Sage": "#598556", + "Dark Slate Blue": "#214761", + "Flat Blue": "#3C73A8", + "Mushroom": "#BA9E88", + "Rich Blue": "#021BF9", + "Dirty Purple": "#734A65", + "Greenblue": "#23C48B", + "Icky Green": "#8FAE22", + "Light Khaki": "#E6F2A2", + "Warm Blue": "#4B57DB", + "Dark Hot Pink": "#D90166", + "Deep Sea Blue": "#015482", + "Carmine": "#9D0216", + "Dark Yellow Green": "#728F02", + "Pale Peach": "#FFE5AD", + "Plum Purple": "#4E0550", + "Golden Rod": "#F9BC08", + "Neon Red": "#FF073A", + "Old Pink": "#C77986", + "Very Pale Blue": "#D6FFFE", + "Blood Orange": "#FE4B03", + "Grapefruit": "#FD5956", + "Sand Yellow": "#FCE166", + "Clay Brown": "#B2713D", + "Dark Blue Grey": "#1F3B4D", + "Flat Green": "#699D4C", + "Light Green Blue": "#56FCA2", + "Warm Pink": "#FB5581", + "Dodger Blue": "#3E82FC", + "Gross Green": "#A0BF16", + "Ice": "#D6FFFA", + "Metallic Blue": "#4F738E", + "Pale Salmon": "#FFB19A", + "Sap Green": "#5C8B15", + "Algae": "#54AC68", + "Bluey Grey": "#89A0B0", + "Greeny Grey": "#7EA07A", + "Highlighter Green": "#1BFC06", + "Light Light Blue": "#CAFFFB", + "Light Mint": "#B6FFBB", + "Raw Umber": "#A75E09", + "Vivid Blue": "#152EFF", + "Deep Lavender": "#8D5EB7", + "Dull Teal": "#5F9E8F", + "Light Greenish Blue": "#63F7B4", + "Mud Green": "#606602", + "Pinky": "#FC86AA", + "Red Wine": "#8C0034", + "Shit Green": "#758000", + "Tan Brown": "#AB7E4C", + "Darkblue": "#030764", + "Rosa": "#FE86A4", + "Lipstick": "#D5174E", + "Pale Mauve": "#FED0FC", + "Claret": "#680018", + "Dandelion": "#FEDF08", + "Orangered": "#FE420F", + "Poop Green": "#6F7C00", + "Ruby": "#CA0147", + "Dark": "#1B2431", + "Greenish Turquoise": "#00FBB0", + "Pastel Red": "#DB5856", + "Piss Yellow": "#DDD618", + "Bright Cyan": "#41FDFE", + "Dark Coral": "#CF524E", + "Algae Green": "#21C36F", + "Darkish Red": "#A90308", + "Reddy Brown": "#6E1005", + "Blush Pink": "#FE828C", + "Camouflage Green": "#4B6113", + "Lawn Green": "#4DA409", + "Putty": "#BEAE8A", + "Vibrant Blue": "#0339F8", + "Dark Sand": "#A88F59", + "Purple/Blue": "#5D21D0", + "Saffron": "#FEB209", + "Twilight": "#4E518B", + "Warm Brown": "#964E02", + "Bluegrey": "#85A3B2", + "Bubble Gum Pink": "#FF69AF", + "Duck Egg Blue": "#C3FBF4", + "Greenish Cyan": "#2AFEB7", + "Petrol": "#005F6A", + "Royal": "#0C1793", + "Butter": "#FFFF81", + "Dusty Orange": "#F0833A", + "Off Yellow": "#F1F33F", + "Pale Olive Green": "#B1D27B", + "Orangish": "#FC824A", + "Leaf": "#71AA34", + "Light Blue Grey": "#B7C9E2", + "Dried Blood": "#4B0101", + "Lightish Purple": "#A552E6", + "Rusty Red": "#AF2F0D", + "Lavender Blue": "#8B88F8", + "Light Grass Green": "#9AF764", + "Light Mint Green": "#A6FBB2", + "Sunflower": "#FFC512", + "Velvet": "#750851", + "Brick Orange": "#C14A09", + "Lightish Red": "#FE2F4A", + "Pure Blue": "#0203E2", + "Twilight Blue": "#0A437A", + "Violet Red": "#A50055", + "Yellowy Brown": "#AE8B0C", + "Carnation": "#FD798F", + "Muddy Yellow": "#BFAC05", + "Dark Seafoam Green": "#3EAF76", + "Deep Rose": "#C74767", + "Dusty Red": "#B9484E", + "Grey/Blue": "#647D8E", + "Lemon Lime": "#BFFE28", + "Purple/Pink": "#D725DE", + "Brown Yellow": "#B29705", + "Purple Brown": "#673A3F", + "Wisteria": "#A87DC2", + "Banana Yellow": "#FAFE4B", + "Lipstick Red": "#C0022F", + "Water Blue": "#0E87CC", + "Brown Grey": "#8D8468", + "Vibrant Purple": "#AD03DE", + "Baby Green": "#8CFF9E", + "Barf Green": "#94AC02", + "Eggshell Blue": "#C4FFF7", + "Sandy Yellow": "#FDEE73", + "Cool Green": "#33B864", + "Pale": "#FFF9D0", + "Blue/Grey": "#758DA3", + "Hot Magenta": "#F504C9", + "Greyblue": "#77A1B5", + "Purpley": "#8756E4", + "Baby Shit Green": "#889717", + "Brownish Pink": "#C27E79", + "Dark Aquamarine": "#017371", + "Diarrhea": "#9F8303", + "Light Mustard": "#F7D560", + "Pale Sky Blue": "#BDF6FE", + "Turtle Green": "#75B84F", + "Bright Olive": "#9CBB04", + "Dark Grey Blue": "#29465B", + "Greeny Brown": "#696006", + "Lemon Green": "#ADF802", + "Light Periwinkle": "#C1C6FC", + "Seaweed Green": "#35AD6B", + "Sunshine Yellow": "#FFFD37", + "Ugly Purple": "#A442A0", + "Medium Pink": "#F36196", + "Puke Brown": "#947706", + "Very Light Pink": "#FFF4F2", + "Viridian": "#1E9167", + "Bile": "#B5C306", + "Faded Yellow": "#FEFF7F", + "Very Pale Green": "#CFFDBC", + "Vibrant Green": "#0ADD08", + "Bright Lime": "#87FD05", + "Spearmint": "#1EF876", + "Light Aquamarine": "#7BFDC7", + "Light Sage": "#BCECAC", + "Yellowgreen": "#BBF90F", + "Baby Poo": "#AB9004", + "Dark Seafoam": "#1FB57A", + "Deep Teal": "#00555A", + "Heather": "#A484AC", + "Rust Orange": "#C45508", + "Dirty Blue": "#3F829D", + "Fern Green": "#548D44", + "Bright Lilac": "#C95EFB", + "Weird Green": "#3AE57F", + "Peacock Blue": "#016795", + "Avocado Green": "#87A922", + "Faded Orange": "#F0944D", + "Grape Purple": "#5D1451", + "Hot Green": "#25FF29", + "Lime Yellow": "#D0FE1D", + "Mango": "#FFA62B", + "Shamrock": "#01B44C", + "Bubblegum": "#FF6CB5", + "Purplish Brown": "#6B4247", + "Vomit Yellow": "#C7C10C", + "Pale Cyan": "#B7FFFA", + "Key Lime": "#AEFF6E", + "Tomato Red": "#EC2D01", + "Lightgreen": "#76FF7B", + "Merlot": "#730039", + "Night Blue": "#040348", + "Purpleish Pink": "#DF4EC8", + "Apple": "#6ECB3C", + "Baby Poop Green": "#8F9805", + "Green Apple": "#5EDC1F", + "Heliotrope": "#D94FF5", + "Yellow/Green": "#C8FD3D", + "Almost Black": "#070D0D", + "Cool Blue": "#4984B8", + "Leafy Green": "#51B73B", + "Mustard Brown": "#AC7E04", + "Dusk": "#4E5481", + "Dull Brown": "#876E4B", + "Frog Green": "#58BC08", + "Vivid Green": "#2FEF10", + "Bright Light Green": "#2DFE54", + "Fluro Green": "#0AFF02", + "Kiwi": "#9CEF43", + "Seaweed": "#18D17B", + "Navy Green": "#35530A", + "Ultramarine Blue": "#1805DB", + "Iris": "#6258C4", + "Pastel Orange": "#FF964F", + "Yellowish Orange": "#FFAB0F", + "Perrywinkle": "#8F8CE7", + "Tealish": "#24BCA8", + "Dark Plum": "#3F012C", + "Pear": "#CBF85F", + "Pinkish Orange": "#FF724C", + "Midnight Purple": "#280137", + "Light Urple": "#B36FF6", + "Dark Mint": "#48C072", + "Greenish Tan": "#BCCB7A", + "Light Burgundy": "#A8415B", + "Turquoise Blue": "#06B1C4", + "Ugly Pink": "#CD7584", + "Sandy": "#F1DA7A", + "Electric Pink": "#FF0490", + "Muted Purple": "#805B87", + "Mid Green": "#50A747", + "Greyish": "#A8A495", + "Neon Yellow": "#CFFF04", + "Banana": "#FFFF7E", + "Carnation Pink": "#FF7FA7", + "Tomato": "#EF4026", + "Sea": "#3C9992", + "Muddy Brown": "#886806", + "Turquoise Green": "#04F489", + "Buff": "#FEF69E", + "Fawn": "#CFAF7B", + "Muted Blue": "#3B719F", + "Pale Rose": "#FDC1C5", + "Dark Mint Green": "#20C073", + "Amethyst": "#9B5FC0", + "Blue/Green": "#0F9B8E", + "Chestnut": "#742802", + "Sick Green": "#9DB92C", + "Pea": "#A4BF20", + "Rusty Orange": "#CD5909", + "Stone": "#ADA587", + "Rose Red": "#BE013C", + "Pale Aqua": "#B8FFEB", + "Deep Orange": "#DC4D01", + "Earth": "#A2653E", + "Mossy Green": "#638B27", + "Grassy Green": "#419C03", + "Pale Lime Green": "#B1FF65", + "Light Grey Blue": "#9DBCD4", + "Pale Grey": "#FDFDFE", + "Asparagus": "#77AB56", + "Blueberry": "#464196", + "Purple Red": "#990147", + "Pale Lime": "#BEFD73", + "Greenish Teal": "#32BF84", + "Caramel": "#AF6F09", + "Deep Magenta": "#A0025C", + "Light Peach": "#FFD8B1", + "Milk Chocolate": "#7F4E1E", + "Ocher": "#BF9B0C", + "Off Green": "#6BA353", + "Purply Pink": "#F075E6", + "Lightblue": "#7BC8F6", + "Dusky Blue": "#475F94", + "Golden": "#F5BF03", + "Light Beige": "#FFFEB6", + "Butter Yellow": "#FFFD74", + "Dusky Purple": "#895B7B", + "French Blue": "#436BAD", + "Ugly Yellow": "#D0C101", + "Greeny Yellow": "#C6F808", + "Orangish Red": "#F43605", + "Shamrock Green": "#02C14D", + "Orangish Brown": "#B25F03", + "Tree Green": "#2A7E19", + "Deep Violet": "#490648", + "Gunmetal": "#536267", + "Blue/Purple": "#5A06EF", + "Cherry": "#CF0234", + "Sandy Brown": "#C4A661", + "Warm Grey": "#978A84", + "Dark Indigo": "#1F0954", + "Midnight": "#03012D", + "Bluey Green": "#2BB179", + "Grey Pink": "#C3909B", + "Soft Purple": "#A66FB5", + "Blood": "#770001", + "Brown Red": "#922B05", + "Medium Grey": "#7D7F7C", + "Berry": "#990F4B", + "Poo": "#8F7303", + "Purpley Pink": "#C83CB9", + "Light Salmon": "#FEA993", + "Snot": "#ACBB0D", + "Easter Purple": "#C071FE", + "Light Yellow Green": "#CCFD7F", + "Dark Navy Blue": "#00022E", + "Drab": "#828344", + "Light Rose": "#FFC5CB", + "Rouge": "#AB1239", + "Purplish Red": "#B0054B", + "Slime Green": "#99CC04", + "Baby Poop": "#937C00", + "Irish Green": "#019529", + "Pink/Purple": "#EF1DE7", + "Dark Navy": "#000435", + "Greeny Blue": "#42B395", + "Light Plum": "#9D5783", + "Pinkish Grey": "#C8ACA9", + "Dirty Orange": "#C87606", + "Rust Red": "#AA2704", + "Pale Lilac": "#E4CBFF", + "Orangey Red": "#FA4224", + "Primary Blue": "#0804F9", + "Kermit Green": "#5CB200", + "Brownish Purple": "#76424E", + "Murky Green": "#6C7A0E", + "Wheat": "#FBDD7E", + "Very Dark Purple": "#2A0134", + "Bottle Green": "#044A05", + "Watermelon": "#FD4659", + "Deep Sky Blue": "#0D75F8", + "Fire Engine Red": "#FE0002", + "Yellow Ochre": "#CB9D06", + "Pumpkin Orange": "#FB7D07", + "Pale Olive": "#B9CC81", + "Light Lilac": "#EDC8FF", + "Lightish Green": "#61E160", + "Carolina Blue": "#8AB8FE", + "Mulberry": "#920A4E", + "Shocking Pink": "#FE02A2", + "Auburn": "#9A3001", + "Bright Lime Green": "#65FE08", + "Celadon": "#BEFDB7", + "Pinkish Brown": "#B17261", + "Poo Brown": "#885F01", + "Bright Sky Blue": "#02CCFE", + "Celery": "#C1FD95", + "Dirt Brown": "#836539", + "Strawberry": "#FB2943", + "Dark Lime": "#84B701", + "Copper": "#B66325", + "Medium Brown": "#7F5112", + "Muted Green": "#5FA052", + "Robin'S Egg": "#6DEDFD", + "Bright Aqua": "#0BF9EA", + "Bright Lavender": "#C760FF", + "Ivory": "#FFFFCB", + "Very Light Purple": "#F6CEFC", + "Light Navy": "#155084", + "Pink Red": "#F5054F", + "Olive Brown": "#645403", + "Poop Brown": "#7A5901", + "Mustard Green": "#A8B504", + "Ocean Green": "#3D9973", + "Very Dark Blue": "#000133", + "Dusty Green": "#76A973", + "Light Navy Blue": "#2E5A88", + "Minty Green": "#0BF77D", + "Adobe": "#BD6C48", + "Barney": "#AC1DB8", + "Jade Green": "#2BAF6A", + "Bright Light Blue": "#26F7FD", + "Light Lime": "#AEFD6C", + "Dark Khaki": "#9B8F55", + "Orange Yellow": "#FFAD01", + "Ocre": "#C69C04", + "Maize": "#F4D054", + "Faded Pink": "#DE9DAC", + "British Racing Green": "#05480D", + "Sandstone": "#C9AE74", + "Mud Brown": "#60460F", + "Light Sea Green": "#98F6B0", + "Robin Egg Blue": "#8AF1FE", + "Aqua Marine": "#2EE8BB", + "Dark Sea Green": "#11875D", + "Soft Pink": "#FDB0C0", + "Orangey Brown": "#B16002", + "Cherry Red": "#F7022A", + "Burnt Yellow": "#D5AB09", + "Brownish Grey": "#86775F", + "Camel": "#C69F59", + "Purplish Grey": "#7A687F", + "Marine": "#042E60", + "Greyish Pink": "#C88D94", + "Pale Turquoise": "#A5FBD5", + "Pastel Yellow": "#FFFE71", + "Bluey Purple": "#6241C7", + "Canary Yellow": "#FFFE40", + "Faded Red": "#D3494E", + "Sepia": "#985E2B", + "Coffee": "#A6814C", + "Bright Magenta": "#FF08E8", + "Mocha": "#9D7651", + "Ecru": "#FEFFCA", + "Purpleish": "#98568D", + "Cranberry": "#9E003A", + "Darkish Green": "#287C37", + "Brown Orange": "#B96902", + "Dusky Rose": "#BA6873", + "Melon": "#FF7855", + "Sickly Green": "#94B21C", + "Silver": "#C5C9C7", + "Purply Blue": "#661AEE", + "Purpleish Blue": "#6140EF", + "Hospital Green": "#9BE5AA", + "Shit Brown": "#7B5804", + "Mid Blue": "#276AB3", + "Amber": "#FEB308", + "Easter Green": "#8CFD7E", + "Soft Blue": "#6488EA", + "Cerulean Blue": "#056EEE", + "Golden Brown": "#B27A01", + "Bright Turquoise": "#0FFEF9", + "Red Pink": "#FA2A55", + "Red Purple": "#820747", + "Greyish Brown": "#7A6A4F", + "Vermillion": "#F4320C", + "Russet": "#A13905", + "Steel Grey": "#6F828A", + "Lighter Purple": "#A55AF4", + "Bright Violet": "#AD0AFD", + "Prussian Blue": "#004577", + "Slate Green": "#658D6D", + "Dirty Pink": "#CA7B80", + "Dark Blue Green": "#005249", + "Pine": "#2B5D34", + "Yellowy Green": "#BFF128", + "Dark Gold": "#B59410", + "Bluish": "#2976BB", + "Darkish Blue": "#014182", + "Dull Red": "#BB3F3F", + "Pinky Red": "#FC2647", + "Bronze": "#A87900", + "Pale Teal": "#82CBB2", + "Military Green": "#667C3E", + "Barbie Pink": "#FE46A5", + "Bubblegum Pink": "#FE83CC", + "Pea Soup Green": "#94A617", + "Dark Mustard": "#A88905", + "Shit": "#7F5F00", + "Medium Purple": "#9E43A2", + "Very Dark Green": "#062E03", + "Dirt": "#8A6E45", + "Dusky Pink": "#CC7A8B", + "Red Violet": "#9E0168", + "Lemon Yellow": "#FDFF38", + "Pistachio": "#C0FA8B", + "Dull Yellow": "#EEDC5B", + "Dark Lime Green": "#7EBD01", + "Denim Blue": "#3B5B92", + "Teal Blue": "#01889F", + "Lightish Blue": "#3D7AFD", + "Purpley Blue": "#5F34E7", + "Light Indigo": "#6D5ACF", + "Swamp Green": "#748500", + "Brown Green": "#706C11", + "Dark Maroon": "#3C0008", + "Hot Purple": "#CB00F5", + "Dark Forest Green": "#002D04", + "Faded Blue": "#658CBB", + "Drab Green": "#749551", + "Light Lime Green": "#B9FF66", + "Snot Green": "#9DC100", + "Yellowish": "#FAEE66", + "Light Blue Green": "#7EFBB3", + "Bordeaux": "#7B002C", + "Light Mauve": "#C292A1", + "Ocean": "#017B92", + "Marigold": "#FCC006", + "Muddy Green": "#657432", + "Dull Orange": "#D8863B", + "Steel": "#738595", + "Electric Purple": "#AA23FF", + "Fluorescent Green": "#08FF08", + "Yellowish Brown": "#9B7A01", + "Blush": "#F29E8E", + "Soft Green": "#6FC276", + "Bright Orange": "#FF5B00", + "Lemon": "#FDFF52", + "Purple Grey": "#866F85", + "Acid Green": "#8FFE09", + "Pale Lavender": "#EECFFE", + "Violet Blue": "#510AC9", + "Light Forest Green": "#4F9153", + "Burnt Red": "#9F2305", + "Khaki Green": "#728639", + "Cerise": "#DE0C62", + "Faded Purple": "#916E99", + "Apricot": "#FFB16D", + "Dark Olive Green": "#3C4D03", + "Grey Brown": "#7F7053", + "Green Grey": "#77926F", + "True Blue": "#010FCC", + "Pale Violet": "#CEAEFA", + "Periwinkle Blue": "#8F99FB", + "Light Sky Blue": "#C6FCFF", + "Blurple": "#5539CC", + "Green Brown": "#544E03", + "Bluegreen": "#017A79", + "Bright Teal": "#01F9C6", + "Brownish Yellow": "#C9B003", + "Pea Soup": "#929901", + "Forest": "#0B5509", + "Barney Purple": "#A00498", + "Ultramarine": "#2000B1", + "Purplish": "#94568C", + "Puke Yellow": "#C2BE0E", + "Bluish Grey": "#748B97", + "Dark Periwinkle": "#665FD1", + "Dark Lilac": "#9C6DA5", + "Reddish": "#C44240", + "Light Maroon": "#A24857", + "Dusty Purple": "#825F87", + "Terra Cotta": "#C9643B", + "Avocado": "#90B134", + "Marine Blue": "#01386A", + "Teal Green": "#25A36F", + "Slate Grey": "#59656D", + "Lighter Green": "#75FD63", + "Electric Green": "#21FC0D", + "Dusty Blue": "#5A86AD", + "Golden Yellow": "#FEC615", + "Bright Yellow": "#FFFD01", + "Light Lavender": "#DFC5FE", + "Umber": "#B26400", + "Poop": "#7F5E00", + "Dark Peach": "#DE7E5D", + "Jungle Green": "#048243", + "Eggshell": "#FFFFD4", + "Denim": "#3B638C", + "Yellow Brown": "#B79400", + "Dull Purple": "#84597E", + "Chocolate Brown": "#411900", + "Wine Red": "#7B0323", + "Neon Blue": "#04D9FF", + "Dirty Green": "#667E2C", + "Light Tan": "#FBEEAC", + "Ice Blue": "#D7FFFE", + "Cadet Blue": "#4E7496", + "Dark Mauve": "#874C62", + "Very Light Blue": "#D5FFFF", + "Grey Purple": "#826D8C", + "Pastel Pink": "#FFBACD", + "Very Light Green": "#D1FFBD", + "Dark Sky Blue": "#448EE4", + "Evergreen": "#05472A", + "Dull Pink": "#D5869D", + "Aubergine": "#3D0734", + "Mahogany": "#4A0100", + "Reddish Orange": "#F8481C", + "Deep Green": "#02590F", + "Vomit Green": "#89A203", + "Purple Pink": "#E03FD8", + "Dusty Pink": "#D58A94", + "Faded Green": "#7BB274", + "Camo Green": "#526525", + "Pinky Purple": "#C94CBE", + "Pink Purple": "#DB4BDA", + "Brownish Red": "#9E3623", + "Dark Rose": "#B5485D", + "Mud": "#735C12", + "Brownish": "#9C6D57", + "Emerald Green": "#028F1E", + "Pale Brown": "#B1916E", + "Dull Blue": "#49759C", + "Burnt Umber": "#A0450E", + "Medium Green": "#39AD48", + "Clay": "#B66A50", + "Light Aqua": "#8CFFDB", + "Light Olive Green": "#A4BE5C", + "Brownish Orange": "#CB7723", + "Dark Aqua": "#05696B", + "Purplish Pink": "#CE5DAE", + "Dark Salmon": "#C85A53", + "Greenish Grey": "#96AE8D", + "Jade": "#1FA774", + "Ugly Green": "#7A9703", + "Dark Beige": "#AC9362", + "Emerald": "#01A049", + "Pale Red": "#D9544D", + "Light Magenta": "#FA5FF7", + "Sky": "#82CAFC", + "Light Cyan": "#ACFFFC", + "Yellow Orange": "#FCB001", + "Reddish Purple": "#910951", + "Reddish Pink": "#FE2C54", + "Orchid": "#C875C4", + "Dirty Yellow": "#CDC50A", + "Orange Red": "#FD411E", + "Deep Red": "#9A0200", + "Orange Brown": "#BE6400", + "Cobalt Blue": "#030AA7", + "Neon Pink": "#FE019A", + "Rose Pink": "#F7879A", + "Greyish Purple": "#887191", + "Raspberry": "#B00149", + "Aqua Green": "#12E193", + "Salmon Pink": "#FE7B7C", + "Tangerine": "#FF9408", + "Brownish Green": "#6A6E09", + "Red Brown": "#8B2E16", + "Greenish Brown": "#696112", + "Pumpkin": "#E17701", + "Pine Green": "#0A481E", + "Charcoal": "#343837", + "Baby Pink": "#FFB7CE", + "Cornflower": "#6A79F7", + "Blue Violet": "#5D06E9", + "Chocolate": "#3D1C02", + "Greyish Green": "#82A67D", + "Scarlet": "#BE0119", + "Green Yellow": "#C9FF27", + "Dark Olive": "#373E02", + "Sienna": "#A9561E", + "Pastel Purple": "#CAA0FF", + "Terracotta": "#CA6641", + "Aqua Blue": "#02D8E9", + "Sage Green": "#88B378", + "Blood Red": "#980002", + "Deep Pink": "#CB0162", + "Grass": "#5CAC2D", + "Moss": "#769958", + "Pastel Blue": "#A2BFFE", + "Bluish Green": "#10A674", + "Green Blue": "#06B48B", + "Dark Tan": "#AF884A", + "Greenish Blue": "#0B8B87", + "Pale Orange": "#FFA756", + "Vomit": "#A2A415", + "Forrest Green": "#154406", + "Dark Lavender": "#856798", + "Dark Violet": "#34013F", + "Purple Blue": "#632DE9", + "Dark Cyan": "#0A888A", + "Olive Drab": "#6F7632", + "Pinkish": "#D46A7E", + "Cobalt": "#1E488F", + "Neon Purple": "#BC13FE", + "Light Turquoise": "#7EF4CC", + "Apple Green": "#76CD26", + "Dull Green": "#74A662", + "Wine": "#80013F", + "Powder Blue": "#B1D1FC", + "Off White": "#FFFFE4", + "Electric Blue": "#0652FF", + "Dark Turquoise": "#045C5A", + "Blue Purple": "#5729CE", + "Azure": "#069AF3", + "Bright Red": "#FF000D", + "Pinkish Red": "#F10C45", + "Cornflower Blue": "#5170D7", + "Light Olive": "#ACBF69", + "Grape": "#6C3461", + "Greyish Blue": "#5E819D", + "Purplish Blue": "#601EF9", + "Yellowish Green": "#B0DD16", + "Greenish Yellow": "#CDFD02", + "Medium Blue": "#2C6FBB", + "Dusty Rose": "#C0737A", + "Light Violet": "#D6B4FC", + "Midnight Blue": "#020035", + "Bluish Purple": "#703BE7", + "Red Orange": "#FD3C06", + "Dark Magenta": "#960056", + "Greenish": "#40A368", + "Ocean Blue": "#03719C", + "Coral": "#FC5A50", + "Cream": "#FFFFC2", + "Reddish Brown": "#7F2B0A", + "Burnt Sienna": "#B04E0F", + "Brick": "#A03623", + "Sage": "#87AE73", + "Grey Green": "#789B73", + "White": "#FFFFFF", + "Robin'S Egg Blue": "#98EFF9", + "Moss Green": "#658B38", + "Steel Blue": "#5A7D9A", + "Eggplant": "#380835", + "Light Yellow": "#FFFE7A", + "Leaf Green": "#5CA904", + "Light Grey": "#D8DCD6", + "Puke": "#A5A502", + "Pinkish Purple": "#D648D7", + "Sea Blue": "#047495", + "Pale Purple": "#B790D4", + "Slate Blue": "#5B7C99", + "Blue Grey": "#607C8E", + "Hunter Green": "#0B4008", + "Fuchsia": "#ED0DD9", + "Crimson": "#8C000F", + "Pale Yellow": "#FFFF84", + "Ochre": "#BF9005", + "Mustard Yellow": "#D2BD0A", + "Light Red": "#FF474C", + "Cerulean": "#0485D1", + "Pale Pink": "#FFCFDC", + "Deep Blue": "#040273", + "Rust": "#A83C09", + "Light Teal": "#90E4C1", + "Slate": "#516572", + "Goldenrod": "#FAC205", + "Dark Yellow": "#D5B60A", + "Dark Grey": "#363737", + "Army Green": "#4B5D16", + "Grey Blue": "#6B8BA4", + "Seafoam": "#80F9AD", + "Puce": "#A57E52", + "Spring Green": "#A9F971", + "Dark Orange": "#C65102", + "Sand": "#E2CA76", + "Pastel Green": "#B0FF9D", + "Mint": "#9FFEB0", + "Light Orange": "#FDAA48", + "Bright Pink": "#FE01B1", + "Chartreuse": "#C1F80A", + "Deep Purple": "#36013F", + "Dark Brown": "#341C02", + "Taupe": "#B9A281", + "Pea Green": "#8EAB12", + "Puke Green": "#9AAE07", + "Kelly Green": "#02AB2E", + "Seafoam Green": "#7AF9AB", + "Blue Green": "#137E6D", + "Khaki": "#AAA662", + "Burgundy": "#610023", + "Dark Teal": "#014D4E", + "Brick Red": "#8F1402", + "Royal Purple": "#4B006E", + "Plum": "#580F41", + "Mint Green": "#8FFF9F", + "Gold": "#DBB40C", + "Baby Blue": "#A2CFFE", + "Yellow Green": "#C0FB2D", + "Bright Purple": "#BE03FD", + "Dark Red": "#840000", + "Pale Blue": "#D0FEFE", + "Grass Green": "#3F9B0B", + "Navy": "#01153E", + "Aquamarine": "#04D8B2", + "Burnt Orange": "#C04E01", + "Neon Green": "#0CFF0C", + "Bright Blue": "#0165FC", + "Rose": "#CF6275", + "Light Pink": "#FFD1DF", + "Mustard": "#CEB301", + "Indigo": "#380282", + "Lime": "#AAFF32", + "Sea Green": "#53FCA1", + "Periwinkle": "#8E82FE", + "Dark Pink": "#CB416B", + "Olive Green": "#677A04", + "Peach": "#FFB07C", + "Pale Green": "#C7FDB5", + "Light Brown": "#AD8150", + "Hot Pink": "#FF028D", + "Black": "#000000", + "Lilac": "#CEA2FD", + "Navy Blue": "#001146", + "Royal Blue": "#0504AA", + "Beige": "#E6DAA6", + "Salmon": "#FF796C", + "Olive": "#6E750E", + "Maroon": "#650021", + "Bright Green": "#01FF07", + "Dark Purple": "#35063E", + "Mauve": "#AE7181", + "Forest Green": "#06470C", + "Aqua": "#13EAC9", + "Cyan": "#00FFFF", + "Tan": "#D1B26F", + "Dark Blue": "#00035B", + "Lavender": "#C79FEF", + "Turquoise": "#06C2AC", + "Dark Green": "#033500", + "Violet": "#9A0EEA", + "Light Purple": "#BF77F6", + "Lime Green": "#89FE05", + "Grey": "#929591", + "Sky Blue": "#75BBFD", + "Yellow": "#FFFF14", + "Magenta": "#C20078", + "Light Green": "#96F97B", + "Orange": "#F97306", + "Teal": "#029386", + "Light Blue": "#95D0FC", + "Red": "#E50000", + "Brown": "#653700", + "Pink": "#FF81C0", + "Blue": "#0343DF", + "Green": "#15B01A", + "Purple": "#7E1E9C" +} diff --git a/src/utils/colourUtils.ts b/src/utils/colourUtils.ts new file mode 100644 index 0000000..58adcd2 --- /dev/null +++ b/src/utils/colourUtils.ts @@ -0,0 +1,164 @@ +import { CMYK, HSL, IColourValues, RGB } from "../interfaces"; +import htmlCodes from "./colourCodes/htmlColours.json"; +import xkcdCodes from "./colourCodes/xkcdColours.json"; + +const hexToRgb = (hex: string): RGB => { + hex = hex.replace("#", ""); + + return { + r: parseInt(hex.substring(0, 2), 16), + g: parseInt(hex.substring(2, 4), 16), + b: parseInt(hex.substring(4, 6), 16) + }; +} + +const rgbToHex = (rgb: RGB): string => { + rgb.r = Math.min(255, Math.max(0, rgb.r)); + rgb.g = Math.min(255, Math.max(0, rgb.g)); + rgb.b = Math.min(255, Math.max(0, rgb.b)); + + const hexR = rgb.r.toString(16).padStart(2, "0"); + const hexG = rgb.g.toString(16).padStart(2, "0"); + const hexB = rgb.b.toString(16).padStart(2, "0"); + + return `#${hexR}${hexG}${hexB}`; +} + +const rgbToHSL = (rgb: RGB): HSL => { + const rNormalized = rgb.r / 255; + const gNormalized = rgb.g / 255; + const bNormalized = rgb.b / 255; + + const max = Math.max(rNormalized, gNormalized, bNormalized); + const min = Math.min(rNormalized, gNormalized, bNormalized); + let h = 0, s, l = (max + min) / 2; + + if (max === min) { + h = s = 0; // achromatic + } else { + const d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + + switch (max) { + case rNormalized: + h = (gNormalized - bNormalized) / d + (gNormalized < bNormalized ? 6 : 0); + break; + case gNormalized: + h = (bNormalized - rNormalized) / d + 2; + break; + case bNormalized: + h = (rNormalized - gNormalized) / d + 4; + break; + } + + h /= 6; + } + + return { + h: Math.round(h * 360), + s: Math.round(s * 100), + l: Math.round(l * 100) + }; +} + +const rgbToCMYK = (rgb: RGB): CMYK => { + const rNormalized = rgb.r / 255; + const gNormalized = rgb.g / 255; + const bNormalized = rgb.b / 255; + + const k = 1 - Math.max(rNormalized, gNormalized, bNormalized); + const c = (1 - rNormalized - k) / (1 - k); + const m = (1 - gNormalized - k) / (1 - k); + const y = (1 - bNormalized - k) / (1 - k); + + return { + c: Math.round(c * 100), + m: Math.round(m * 100), + y: Math.round(y * 100), + k: Math.round(k * 100) + }; +} + +const hslToRGB = (hsl: HSL): RGB => { + const hueToRGB = (p: number, q: number, t: number): number => { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + } + + const { h, s, l } = hsl; + const hNormalized = h / 360; + const sNormalized = s / 100; + const lNormalized = l / 100; + + if (sNormalized === 0) { + // Achromatic color (gray) + const grayValue = Math.round(lNormalized * 255); + return { r: grayValue, g: grayValue, b: grayValue }; + } + + const q = lNormalized < 0.5 ? lNormalized * (1 + sNormalized) : lNormalized + sNormalized - lNormalized * sNormalized; + const p = 2 * lNormalized - q; + + const r = Math.round(hueToRGB(p, q, hNormalized + 1 / 3) * 255); + const g = Math.round(hueToRGB(p, q, hNormalized) * 255); + const b = Math.round(hueToRGB(p, q, hNormalized - 1 / 3) * 255); + + return { r, g, b }; +} + +const cmykToRGB = (cmyk: CMYK): RGB => { + const { c, m, y, k } = cmyk; + const cNormalized = c / 100; + const mNormalized = m / 100; + const yNormalized = y / 100; + const kNormalized = k / 100; + + const r = Math.round(255 * (1 - cNormalized) * (1 - kNormalized)); + const g = Math.round(255 * (1 - mNormalized) * (1 - kNormalized)); + const b = Math.round(255 * (1 - yNormalized) * (1 - kNormalized)); + + return { r, g, b }; +} + +const getHTMLColorName = (hexColor: string): string => getColorName(hexColor, htmlCodes); +const getXKCDColorName = (hexColor: string): string => getColorName(hexColor, xkcdCodes); + +const getColorName = (hexColor: string, collective: { [key: string]: string }): string => { + hexColor = hexColor.toUpperCase(); + + for (const colorName in collective) { + if (collective[colorName] === hexColor) { + return colorName; + } + } + + return "Not Defined"; +} + +export const isValidColorString = (str: string) => { + const colorPattern = /^(#)?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/; + return colorPattern.test(str); +} + +export const rgbToAll = (rgb: RGB): IColourValues => { + const hex = rgbToHex(rgb); + return ({ + hex: hex, + rgb: rgb, + cmyk: rgbToCMYK(rgb), + hsl: rgbToHSL(rgb), + htmlCode: getHTMLColorName(hex), + xkcdCode: getXKCDColorName(hex), + oxVar: hex.toUpperCase().replace('#', '0x') + }); +} + +export const hexToAll = (hex: string): IColourValues => rgbToAll(hexToRgb(hex)); + +export const hslToAll = (hsl: HSL): IColourValues => rgbToAll(hslToRGB(hsl)); + +export const cmykToAll = (cmyk: CMYK): IColourValues => rgbToAll(cmykToRGB(cmyk));