1.2.1 • Published 4 years ago

@lost-types/color v1.2.1

Weekly downloads
13
License
MIT
Repository
github
Last release
4 years ago

Color

Greatly missed Color type for JavaScript. Doesn’t rely on browsers to parse color strings and therefore could be used in any environment. Parses color from all supported formats, including RGB and HSL functional notation, #-hexadecimal string, named color with additional formats like RGB array or Color object.

Usage

In the terminal:

% npm install @lost-types/color

Then in the module:

// JavaScript modules
import Color from '@lost-types/color';

// CommonJS
const Color = require('@lost-types/color');

const red = new Color('red');

Motivation

Consider this example, you've assigned the color of the HTML element with hsl() notation, let's say hsl(314, 86%, 49%). After that there is absolutely no way to get this value back and you will receive something like rgb(232, 17, 182) if you try. “But I needed hue?!!” And in general, it’s rather strange that we have Date Picker and Date type, but Color Picker doesn’t have Color type.

Speaking of Date type, it became an architectural blueprint for Color class, just like Date, Color’s sole purpose is to parse color, store the most valuable information about this color for other libraries to use and output it in different formats. As simple as is. If you're looking for library of function to adjust color, check Colorista library from @lost-types collection.

const color = new Color('rgb(232, 17, 182)');
color.hue; // 314
color.toHslString(); // hsl(314, 86%, 49%) Hooray!

API

Constructor

Creates a new Color instance.

ParameterTypeDefault valueNotes
coloranyColor in any supported format, or as rgba array
new Color('#ff0');
/* 
Color{
  red: 255,
  green: 255,
  blue: 0,
  hue: 60,
  saturation: 1,
  lightness: 0.5,
  alpha: 1,
  brightness: 0.9278,
  hueGroup: 2,
  hueGroupOffset: 15,
  name: 'yellow'
}
*/

Properties

Color.name

Returns color name if color is one of CSS-supported named colors.

const crimson = new Color([220, 20 ,60]);
crimson.name; // "crimson"

const transparent = new Color('transparent');
transparent.toRgbString(); // "rgba(0, 0, 0, 0)"
// NOTE: Name property ignores alpha value
transparent.name; // "black"

Color.red

Color.green

Color.blue

Return red, green and blue values of the color identifying a point in the sRGB color space. Output is a number in 0...255 range:

// Color input is case-insensitive
const white = new Color('WhItE');
white.red; // 255
white.green; // 255
white.blue; // 255

const royalblue = new Color('#4169E1');
royalblue.red; // 65
royalblue.green; // 105
royalblue.blue; // 225

Color.hue

Returns the hue angle of the color on the color wheel in degrees. Number in 0...359 range, where 0 is red.

const darkgreen = new Color('hsl(120deg 100% 25%)');
darkgreen.hue; // 120

const darkmagenta = new Color('hsla(-45, 65%, 35%)');
darkmagenta.hue; // 315

Color.saturation

Returns the color saturation value of HSL representation as number. Number in 0...1 range, where 0 is completely desaturated color and 1 - fully saturated color.

const gold = new Color('#fc9');
gold.saturation; // 1
gold.toHslString(); // "hsl(30, 100%, 80%)"

const slateGray = new Color('slategray');
slateGray.saturation; // 0.13

Color.lightness

Returns the color lightness value of HSL representation as number. Number in 0...1 range, where 0 is completely dark color (black) and 1 - fully light color (white).

const deepSkyBlue = new Color('rgb(0 191 255)');
deepSkyBlue.lightness; // 0.5
deepSkyBlue.toHslString(); // "hsl(195, 100%, 50%)"

const black = new Color('#2a2e2f');
black.lightness; // 0.17

Color.alpha

Returns the value of the alpha-channel of the color. Number in 0...1 range, where 0 is completely transparent and 1 - has full opacity.

const blue = new Color('#23f');
blue.alpha; // 1

const semiTransparent = new Color('#23f4');
semiTransparent.alpha; // 0.2667

const transparent = new Color('transparent');
transparent.alpha; // 0

Color.brightness

Returns relative brightness of the color of any point in a colorspace, normalized to 0 for darkest black and 1 for lightest white. Number in 0...1 range. Relative brightness is used for calculating color contrast.

const royalblue = new Color('#4169e1');
royalblue.brightness; // 0.1666

const violet = new Color('violet');
violet.brightness; // 0.4032

// Calculate contrast ratio
(violet.brightness + 0.05) / (royalblue.brightness + 0.05); // 2.092336103416436

Color.hueGroup

Color.hueGroupOffset

Returns index of the color group of the color's hue on color wheel. Color groups: | hueGroup index | Group name | Hue range | |--------------------|-----------------|---------------| | 0 | Red-Violet | 315 ... 344 | | 1 | Red | 345 ... 14 | | 2 | Orange | 15 ... 44 | | 3 | Yellow | 45 ... 74 | | 4 | Yellow-Green | 75 ... 104 | | 5 | Green | 105 ... 134 | | 6 | Green-Cyan | 135 ... 164 | | 7 | Cyan | 165 ... 194 | | 8 | Blue-Cyan | 195 ... 224 | | 9 | Blue | 225 ... 254 | | 10 | Blue-Violet | 255 ... 284 | | 11 | Violet | 285 ... 314 |

Property Color.hueGroupOffset returns hue offset within color's group. Number in 0...29 range.

const fire = new Color('#fd4523');
fire.hue; // 9
fire.hueGroup; // 0
fire.hueGroupOffset; // 24

const coolNavy = new Color('rgb(60, 20, 220)');
coolNavy.hue; // 252
coolNavy.hueGroup; // 8
coolNavy.hueGroupOffset; // 27

Even though color warmth is hugely subjective, you can can presume color groups 0 - 5 as warm colors and 6 - 11 as cool, that's actually the main reason why group indexation shifted back.

NOTE: The central color of each group will have Color.hueGroupOffset equal to 15, not 0.

Methods

Color.prototype.toRgbString()

Color.prototype.toHexString()

Color.prototype.toHslString()

Returns string representation of the color in either RGB, #-hexadecomal or HSL format.

const pink = new Color('pink');
pink.alpha; // 1
pink.toHexString(); // "#ffc0cb"
pink.toRgbString(); // "rgb(255, 192, 203)"
pink.toHslString(); // "hsl(350, 100%, 88%)"

const mint = new Color('#56FF7876');
mint.alpha; // 0.4627
mint.toHexString(); // "#56ff7876"
mint.toRgbString(); // "rgba(86, 255, 120, 0.4627)"
mint.toHslString(); // "hsla(132, 100%, 67%, 0.4627)"
1.2.1

4 years ago

1.2.0

4 years ago

1.1.0

4 years ago

1.0.2

4 years ago

1.0.1

4 years ago

1.0.0

4 years ago

0.3.2

4 years ago

0.3.1

4 years ago