npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

colorizr

v3.0.1

Published

Manipulate colors like a boss

Downloads

2,285

Readme

Colorizr

NPM version npm bundle size CI Quality Gate Status Coverage

Color conversion, generation, manipulation, comparison, and analysis.

Highlights

  • 🏖 Easy to use: Works with Hex, HSL, OkLab, OkLCH, and RGB.
  • ♿️ Accessibility: WCAG analysis and comparison.
  • 🛠 Small: 7kB (gzipped) and tree-shakable.
  • 🟦 Modern: Written in Typescript.

Setup

Install

npm i colorizr

Usage

You can use all the functions standalone:

import { luminance } from 'colorizr';

const lux = luminance('#ff0044'); // 0.2168

Or you can create an instance to use all the methods for the same color:

import Colorizr from 'Colorizr';

const colorInstance = new Colorizr('#ff0044');
colorInstance.luminance; // 0.2168
colorInstance.chroma; // 1
colorInstance.opacity; // 1

API

String inputs accept css values: hex, hsl, oklab, oklch, rgb, and named colors.

Info

chroma(input: string): number
Get the chroma of a color.

import { chroma } from 'colorizr';

chroma('#ff0044'); // 1
chroma('#ffc0cb'); // 0.2471

luminance(input: string): number
Get the relative brightness according to the WCAG definition.
Normalized to 0 for black and 1 for white.

import { luminance } from 'colorizr';

luminance('#ff0044'); // 0.2168

name(input: string): string
Get the name of a color. Return the hex code if it can't be named.

import { name } from 'colorizr';

name('#ffc0cb'); // pink
name('rgb(176 224 230)'); // 'powderblue'
name('hsl(344 100 50)'); // #ff0044

opacity(input: string): string
Get the opacity of a color.

import { opacity } from 'colorizr';

opacity('#ff0044'); // 1
opacity('rgb(255 0 68 / 90%)'); // 0.9
opacity('hsl(344 100 50 / 60%)'); // 0.6

Manipulators

lighten(input: string, amount: number): string
Get a color with increased lightness.

import { lighten } from 'colorizr';

lighten('#ff0044', 10); // #ff3369
lighten('hsl(136 100% 50%)', 10); // hsl(136 100% 60%)

darken(input: string, amount: number): string
Get a color with decreased lightness.

import { darken } from 'colorizr';

darken('#ff0044', 10); // #cc0036
darken('oklch(47.642% 0.29956 274.93693)', 10); // oklch(40.377% 0.25281 275.46794)

saturate(input: string, amount: number): string
Get a color with increased saturation.

import { saturate } from 'colorizr';

saturate('#ff0044', 10); // #ff0044 (already at the maximum)
saturate('pink', 10); // #ffc0cb

desaturate(input: string, alpha: number): string
Get a color with decreased saturation.

import { desaturate } from 'colorizr';

desaturate('#ff0044', 10); // #f20d4a
desaturate('oklab(70.622% 0.1374 0.14283)', 10); // oklab(69.021% 0.12176 0.13721)

invert(input: string): string
Invert the color.

import { invert } from 'colorizr';

invert('#07e'); // '#0077ee'
invert('#f058'); // '#ff005588'

rotate(input: string, degrees: number): string
Get a color with a hue rotated by the specified degrees.

import { rotate } from 'colorizr';

rotate('#ff0044', 30); // #ff3b00

opacify(input: string, alpha: number, format?: ColorType): string
Add opacity to a color

import { opacify } from 'colorizr';

opacify('hsl(344, 100, 50)', 0.9); // hsl(344 100 50 / 90%)
opacify('#ff0044', 0.8); // #ff0044cc

transparentize(input: string, alpha: number, format?: ColorType): string
Increase/decrease the color opacity.

import { transparentize } from 'colorizr';

transparentize('hsl(344, 100, 50)', 10); // hsl(344 100 50 / 90%)
transparentize('#ff0044', 50, 'hsl'); // #ff004480

Comparison

brightnessDifference(left: string, right: string): number
Get the brightness difference between the two colors.

import { brightnessDifference } from 'colorizr';

brightnessDifference('#fff', 'rgb(255, 0, 68)'); // 171.003

colorDifference(left: string, right: string): number
Get the color difference between the two colors.

import { colorDifference } from 'colorizr';

colorDifference('hsl(0 0% 100%)', '#f04'); // 442

compare(left: string, right: string): Analysis
Get the WCAG analysis between two colors.

import { compare } from 'colorizr';

compare('#ff0044', '#fff');

({
  "brightnessDifference": 171.003,
  "colorDifference": 442,
  "compliant": 1,
  "contrast": 3.94,
  "largeAA": true,
  "largeAAA": false,
  "normalAA": false,
  "normalAAA": false,
})

contrast(left: string, right: string): number
Get the WCAG contrast ratio between two colors.

import { contrast } from 'colorizr';

contrast('hsl(0 0% 100%)', 'rgb(255 0 68)'); // 3.94

Generators

palette(input: string, options?: PaletteOptions): string[]
Generate a palette of colors.

import { palette } from 'colorizr';

palette('#ff0044');
// ['#ff0044', '#ff7700', '#88ff00', '#00ff77', '#0088ff', '#7700ff'];

palette('#ff0044', { type: 'monochromatic' });
// ['#ff99b4', '#ff5582', '#ff1150', '#cc0036', '#880024', '#440012']

scheme(input: string, type: Scheme): string[]
Get a color scheme.

import { scheme } from 'colorizr';

const complementary = scheme('rgb(255 0 68)'); // ['#ff0044', '#00ffbb']
const triadic = scheme('#ff0044', 'triadic'); // ['#ff0044', '#44ff00', '#0044ff']

swatch(input: string, variant?: 'up' | 'down'): string[]
Generate a color swatch with ten shades.
The variant can be used to generate a lighter or darker swatch.

import { swatch } from 'colorizr';

const colors = swatch('#ff0044');
/* [
  "#ffccda",
  "#ff99b4",
  "#ff668f",
  "#ff3369",
  "#ff0044",
  "#cc0036",
  "#990029",
  "#66001b",
  "#33000e",
  "#1a0007",
] */

Converters

convert(input: string, format: ColorType): string
Convert a color string to another format.

import { convert } from 'colorizr';

convert('#ff0044', 'hsl') // hsl(344 100% 50%)
convert('rgb(255 0 68)', 'oklch') // oklch(63.269% 0.25404 19.90218)

hex2hsl(input: string): HSL
Convert HEX to HSL.

import { hex2hsl } from 'colorizr';

hex2hsl('#ff0044'); // { h: 344, s: 100, l: 50 }

hex2oklab(input: string, precision?: number): LAB
Convert HEX to OKLAB.

import { hex2oklab } from 'colorizr';

hex2oklab('#ff0044'); // { l: 0.63269, a: 0.23887, b: 0.08648 }

hex2oklch(input: string, precision?: number): LCH
Convert HEX to OKLCH.

import { hex2oklch } from 'colorizr';

hex2oklch('#ff0044'); // { l: 0.63269, c: 0.25404, h: 19.90218 }

hex2rgb(input: string): RGB
Convert HEX to RGB.

import { hex2rgb } from 'colorizr';

hex2rgb('#ff0044'); // { r: 255, g: 0, b: 68 }

hsl2hex(input: HSL | ColorTuple): string
Convert HSL to HEX.

import { hsl2hex } from 'colorizr';

hsl2hex({ h: 344, s: 100, l: 50 }); // '#ff0044'
hsl2hex([344, 100, 50]); // '#ff0044'

hsl2oklab(input: HSL | ColorTuple, precision?: number): LAB
Convert HSL to OKLAB.

import { hsl2oklab } from 'colorizr';

hsl2oklab({ h: 344, s: 100, l: 50 }); // { l: 0.63269, a: 0.23887, b: 0.08648 }
hsl2oklab([344, 100, 50]); // { l: 0.63269, a: 0.23887, b: 0.08648 }

hsl2oklch(input: HSL | ColorTuple, precision?: number): LCH
Convert HSL to OKLCH.

import { hsl2oklch } from 'colorizr';

hsl2oklch({ h: 344, s: 100, l: 50 }); // { l: 0.63269, c: 0.25404, h: 19.90218 }
hsl2oklch([344, 100, 50]); // { l: 0.63269, c: 0.25404, h: 19.90218 }

hsl2rgb(input: HSL | ColorTuple): RGB
Convert HSL to RGB.

import { hsl2rgb } from 'colorizr';

hsl2rgb({ h: 344, s: 100, l: 50 }); // { r: 255, g: 0, b: 68 }
hsl2rgb([344, 100, 50]); // { r: 255, g: 0, b: 68 }

oklab2hex(input: LAB | ColorTuple): string
Convert OKLAB to HEX.

import { oklab2hex } from 'colorizr';

oklab2hex({ l: 0.63269, a: 0.23887, b: 0.08648 }); // '#ff0044'
oklab2hex([0.63269, 0.23887, 0.08648]); // '#ff0044'

oklab2hsl(input: LAB | ColorTuple): HSL
Convert OKLAB to HSL.

import { oklab2hsl } from 'colorizr';

oklab2hsl({ l: 0.63269, a: 0.23887, b: 0.08648 }); // { h: 344, s: 100, l: 50 }
oklab2hsl([0.63269, 0.23887, 0.08648]); // { h: 344, s: 100, l: 50 }

oklab2oklch(input: LAB | ColorTuple, precision?: number): LCH
Convert OKLAB to OKLCH.

import { oklab2oklch } from 'colorizr';

oklab2oklch({ l: 0.63269, a: 0.23887, b: 0.08648 }); // { l: 0.63269, c: 0.25404, h: 19.90218 }
oklab2oklch([0.63269, 0.23887, 0.08648]); // { l: 0.63269, c: 0.25404, h: 19.90218 }

oklab2rgb(input: LAB | ColorTuple, precision: number = 0): RGB
Convert OKLAB to RGB.

import { oklab2rgb } from 'colorizr';

oklab2rgb({ l: 0.63269, a: 0.23887, b: 0.08648 }); // { r: 255, g: 0, b: 68 }
oklab2rgb([0.63269, 0.23887, 0.08648]); // { r: 255, g: 0, b: 68 }

oklch2hex(input: LCH | ColorTuple): string
Convert OKLCH to HEX.

import { oklch2hex } from 'colorizr';

oklch2hex({ l: 0.63269, c: 0.25404, h: 19.90218 }); // '#ff0044'
oklch2hex([0.63269, 0.25404, 19.90218]); // '#ff0044'

oklch2hsl(input: LCH | ColorTuple): HSL
Convert OKLCH to HSL.

import { oklch2hsl } from 'colorizr';

oklch2hsl({ l: 0.63269, c: 0.25404, h: 19.90218 }); // { h: 344, s: 100, l: 50 }
oklch2hsl([0.63269, 0.25404, 19.90218]); // { h: 344, s: 100, l: 50 }

oklch2oklab(input: LCH | ColorTuple, precision?: number): LAB
Convert OKLCH to OKLAB.

import { oklch2oklab } from 'colorizr';

oklch2oklab({ l: 0.63269, c: 0.25404, h: 19.90218 }); // { l: 0.63269, a: 0.23887, b: 0.08648 }
oklch2oklab([0.63269, 0.25404, 19.90218]); // { l: 0.63269, a: 0.23887, b: 0.08648 }

oklch2rgb(input: LCH | ColorTuple, precision: number = 0): RGB
Convert OKLCH to RGB.

import { oklch2rgb } from 'colorizr';

oklch2rgb({ l: 0.63269, c: 0.25404, h: 19.90218 }); // { r: 255, g: 0, b: 68 }
oklch2rgb([0.63269, 0.25404, 19.90218]); // { r: 255, g: 0, b: 68 }

rgb2hex(input: RGB | ColorTuple): string
Convert RGB to HEX.

import { rgb2hex } from 'colorizr';

rgb2hex({ r: 255, g: 0, b: 68 }); // '#ff0044'
rgb2hex([255, 0, 68]); // '#ff0044'

rgb2hsl(input: RGB | ColorTuple): HSL
Convert RGB to HSL.

import { rgb2hsl } from 'colorizr';

rgb2hsl({ r: 255, g: 0, b: 68 }); // { h: 344, s: 100, l: 50 }
rgb2hsl([255, 0, 68]); // { h: 344, s: 100, l: 50 }

rgb2oklab(input: RGB | ColorTuple, precision: number): LAB
Convert RGB to OKLAB.

import { rgb2oklab } from 'colorizr';

rgb2oklab({ r: 255, g: 0, b: 68 }); // { l: 0.63269, a: 0.23887, b: 0.08648 }
rgb2oklab([255, 0, 68]); // { l: 0.63269, a: 0.23887, b: 0.08648 }

rgb2oklch(input: RGB | ColorTuple, precision: number): LCH
Convert RGB to OKLCH.

import { rgb2oklch } from 'colorizr';

rgb2oklch({ r: 255, g: 0, b: 68 }); // { l: 0.63269, c: 0.25404, h: 19.90218 }
rgb2oklch([255, 0, 68]); // { l: 0.63269, c: 0.25404, h: 19.90218 }

Utilities

addAlphaToHex(input: string, alpha: number): string
Add an alpha value to a hex string

import { addAlphaToHex } from 'colorizr';

addAlphaToHex('#ff0044', 0.9); // '#ff0044e6'
addAlphaToHex('#ff0044cc', 0.9); // '#ff0044e6'

convertAlphaToHex(input: number): string
Convert an alpha value to a hex value.

import { convertAlphaToHex } from 'colorizr';

convertAlphaToHex(0.5); // '80'

extractAlphaFromHex(input: string): number
Extract the alpha value from a hex string

import { extractAlphaFromHex } from 'colorizr';

convertAlphaToHex('#ff004480'); // 0.5

extractColorParts(input: string): ExtractColorPartsReturn
Extract the color parts from a CSS color string. Hex colors are not supported.

type ExtractColorPartsReturn = {
  alpha?: number;
  model: 'hsl' | 'oklab' | 'oklch' | 'rgb';
} & Record<string, number>;

extractColorParts('rgb(255 0 68)') // { model: 'rgb', r: 255, g: 0, b: 68 }
extractColorParts('hsl(344 100% 50% / 90%)') // { alpha: 0.9, model: 'hsl', h: 344, g: 100, l: 50 }

formatCSS(input: HSL | RGB, options?: FormatOptions): string
Get a css string from a color object.

import { formatCSS } from 'colorizr';

formatCSS({ h: 344, s: 100, l: 50 }, { format: 'rgb' }); // 'rgb(255, 0, 68)'
formatCSS({ r: 255, g: 0, b: 68 }, { alpha: 0.5, format: 'hsl' }); // 'hsla(344, 100%, 50%, 0.5)'

formatHex(input: string): string
Format a short hex string of 3 (or 4) digits into 6 (or 8) digits.

import { formatHex } from 'colorizr';

formatHex('#07e'); // '#0077ee'
formatHex('#f058'); // '#ff005588'

getOkLCHMaxChroma(input: string | LCH, precision?: number): number
Get the maximum chroma for a given lightness and hue in the OkLCH color space.

import { getOkLCHMaxChroma } from 'colorizr';

getOkLCHMaxChroma({ l: 0.63269, c: 0.25404, h: 19.90218 }); // 0.28643
getOkLCHMaxChroma('#00ff44'); // 0.30921 

getP3Color(input: string | LCH): string
Get a OkLCH color in the P3 color space.

import { getP3Color } from 'colorizr';

getP3Color({ l: 0.63269, c: 0.25404, h: 19.90218 }); // oklch(0.63269 0.28643 19.90218)
getP3Color('#00ff44'); // oklch(0.86876 0.30921 144.65534) 

parseCSS(input: string, format?: ColorType): string | HSL | RGB
Parse a css string to hex, HSL, OKLAB, OKLCH, or RGB.
If the format isn't set, it will return the same format as the input.

import { parseCSS } from 'colorizr';

parseCSS('hsl(344 100% 50%)'); // { h: 344, l: 50, s: 100 }
parseCSS('#ff0044', 'hsl'); // { h: 344, l: 50, s: 100 }

random(type: ColorType = 'hex'): string
Get a random color.

import { random } from 'colorizr';

random(); // '#b385e0'
random('oklch') // oklab(86.876% -0.22518 0.1597)

removeAlphaFromHex(input: string): string
Remove the alpha value from a hex string

import { removeAlphaFromHex } from 'colorizr';

removeAlphaFromHex('#ff0044cc'); // '#ff0044'

textColor(input: string): string
Get a contrasting color (black or white) for the input color.

import { textColor } from 'colorizr';

textColor('#ff0044'); // #ffffff
textColor('#fff800'); // #000000

Validators

isValidColor(input: any): boolean
Check if the input is a valid color.

import { isValidColor } from 'colorizr';

isValidColor('#ff0044'); // true
isValidColor('#ff004400'); // true
isValidColor('hsl(136 100% 50%)'); // true
isValidColor('hsla(344, 100%, 50%, 0.4)'); // true
isValidColor('oklab(70.622% 0.1374 0.14283)'); // true
isValidColor('oklch(47.642% 0.29956 274.93693)'); // true
isValidColor('rgb(255 230 109)'); // true
isValidColor('blue'); // true
isValidColor('aliceblue'); // true
isValidColor('#mmff00'); // false
isValidColor('blue-ish'); // false

isHex(input: unknown): boolean
Check if the input is a valid hex color.

import { isHex } from 'colorizr';

isHex('#f04'); // true
isHex('#ff0044'); // true
isHex('#ff0044cc'); // true

isHSL(input: unknown): boolean
Check if the input is a valid HSL object.

import { isHSL } from 'colorizr';

isHSL({ h: 344, s: 100, l: 50 }); // true

isLAB(input: unknown): boolean
Check if the input is a valid LAB color.

import { isLAB } from 'colorizr';

isLAB({ l: 0.63269, a: 0.23887, b: 0.08648 }); // true

isLHC(input: unknown): boolean
Check if the input is a valid LCH color.

import { isLHC } from 'colorizr';

isLHC({ l: 0.63269, c: 0.25404, h: 19.90218 }); // true

isRGB(input: unknown): boolean
Check if the input is a valid RGB color.

import { isRGB } from 'colorizr';

isRGB({ r: 255, g: 0, b: 68 }); // true

Class

import Colorizr from 'Colorizr';

const colorizr = new Colorizr('#ff0044');

colorizr.hex; // #ff0044
colorizr.hsl; // { h: 344, s: 100, l: 50 };
colorizr.rgb; // { r: 255, g: 0, b: 68 };

Getters

colorizr.hex
Get the hex code.

colorizr.hsl
Get the HSL object.

colorizr.oklab
Get the OKLAB object.

colorizr.oklch
Get the OKLCH object.

colorizr.rgb
Get the RGB object.

colorizr.hue
Get the hue (0-360).

colorizr.saturation
Get the saturation (0-100).

colorizr.lightness
Get the lightness (0-100).

colorizr.red
Get the red level (0-255).

colorizr.green
Get the green level (0-255).

colorizr.blue
Get the blue level (0-255).

colorizr.chroma Get the chroma (0-1).

colorizr.luminance
Get the luminance (0-1).

colorizr.opacity
Get the opacity (0-1).

colorizr.css
Get the css string of the same type as the input.

colorizr.textColor Get a contrasting color (black or white).

Methods

colorizr.format(type: ColorType, precision?: number)
Returns the formatted color with the type

...

Also, all the manipulators and comparison utilities.

Credits / References

color.js
chroma-js
calculating-color-contrast
Colour Contrast Check
Contrast Checker
Converting Color Spaces in typescript
A perceptual color space for image processing