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

matisse

v1.0.9

Published

JavaScript library for mutable colour conversion and manipulation 🎨

Downloads

18

Readme

matisse

matisse is a JavaScript library for performing colour manipulations with support for CSS color strings. Mutable colour entities allow for implicit conversion between RGB, HSV, HSL, CMYK, and HWB colour spaces. Mixing, toning, tinting, shading, and blending operations are also supported including a variety of different blend modes. matisse contains functionality for performing colour measurements as well as functionality for validating and correcting colours to comply with the WCAG standards for contrast. In addition, this library allows for palette generation for different colour harmonies according to colour theory principles.

This project was originally developed as a team project for McMaster University's SFWRENG 3XA3: Software Project Management course in collaboration with Isra Zahid and Samia Anwar.

Installation

$ npm install matisse

Usage

import Colour, * as matisse from "matisse";

Constructors

Traditional constructors are available for CSS colour strings and HEX codes as well as static factory contructors for RGB, HSV, HSL, CMYK, and HWB colour models. When the Colour object is initialized using a constructor, all other colour attributes from the other colour spaces are implicitly calculated and stored.

const colour = new Colour("rgba(32, 122, 166, 0.5)");
const colour = new Colour("#207AA680");
const colour = Colour.RGB(32, 122, 166, 0.5);
const colour = Colour.HSV(200, 0.81, 0.65, 0.5);
const colour = Colour.HSL(200, 0.69, 0.39, 0.5);
const colour = Colour.CMYK(0.81, 0.27, 0, 0.35, 0.5);
const colour = Colour.HWB(200, 0.12, 0.35, 0.5);

Getters & Setters

Getters and setters for the Colour class are defined using ES6 get and set properties. The following properties of Colour instances can be accessed and mutated: red, green, blue, hue, saturationv, value, saturationl, light, cyan, magenta, yellow, white, black, alpha. Error handling and useful range constants are also built in to support usability.

const colour = Colour.RGB(18, 64, 188);
console.log(colour.hue);
colour.hue = 69;
colour.hue = Colour.hueMax + 1; // throws an error!

Measurements & Manipulations

matisse contains several static methods for colour measurements, calculations, and operations.

const x = new Colour("#59396E");
const y = new Colour("#A5B828");

const x_inverse = matisse.negate(x); // #A6C691
const y_complement = matisse.rotate(y, 180); // #3C28B8
const x_grayscale = matisse.grayscale(x); // #484848
const y_colourfulness = matisse.colourfulness(y); // 40.75
const x_luminosity = matisse.luminosity(x); // 0.06
const y_temp = matisse.temperature(y); // 2812.14
const contrast = matisse.contrast(x, y); // 4.24

Mixing & Blending

Mixing and blending operations with different blend modes can be perfomed with a given base colour and a blend colour.

const baseColour = Colour.CMYK(0.00, 0.95, 0.86, 0.38); // #9E0816
const blendColour = Colour.HWB(285, 0.32, 0.65); // #58525A

matisse.mix(baseColour, blendColour, 0.69); // #6D3A44
matisse.normal(baseColour, blendColour); // #575159
matisse.multiply(baseColour, blendColour); // #360308
matisse.screen(baseColour, blendColour); // #BF5667
matisse.overlay(baseColour, blendColour); // #7F050F
matisse.darken(baseColour, blendColour); // #570816
matisse.lighten(baseColour, blendColour); // #9E5159
matisse.colourDodge(baseColour, blendColour); // #F00C22
matisse.colourBurn(baseColour, blendColour); // #000000
matisse.hardLight(baseColour, blendColour); // #6C050F
matisse.softLight(baseColour, blendColour); // #8B0510
matisse.difference(baseColour, blendColour); // #474943
matisse.exclusion(baseColour, blendColour); // #895460

Similarly, tones, tints, and shades can be produced from a given base colour.

const baseColour = Colour.HSV(277, 1.00, 0.50); // #4F0080

matisse.tone(baseColour, 0.50); // #684080
matisse.tint(baseColour, 0.50); // #A780C0
matisse.shade(baseColour, 0.50); // #280040

Colour Palettes

Colour palettes can be generated according to various colour harmonies.

const colour = Colour.RGB(235, 64, 52); // #EB4034

matisse.analogous(colour); // [#EB33A1, #EB4034, #EBBA33]
matisse.complementary(colour); // [#EB4034, #33DFEB]
matisse.splitComplementary(colour); // [#EB4034, #33EBBA, #33A1EB]
matisse.triadic(colour); // [#EB4034, #33EB3F, ##3F33EB]
matisse.tetradic(colour); // [#EB4034, #33EB3F, #33DFEB, #3F33EB]
matisse.square(colour); // [#EB4034, #83EB33, #33DFEB, #9B33EB]

Monochromatic colour palettes can also be generated for a given length.

const baseColour = Colour.HSV(277, 1.00, 0.50); // #4F0080

matisse.tones(baseColour, 5); // [#4F0080, #5B2080, #684080, #746080, #808080]
matisse.tints(baseColour, 5); // [#4F0080, #7B40A0, #A780C0, #D3BFDF, #FFFFFF]
matisse.shades(baseColour, 5); // [#4F0080, #3B0060, #280040, #140020, #000000]

You can also generate a palette of random colours.

matisse.randoms(10);

Accessibility

matisse has the ability to check if a pair of colours have sufficient contrast according to the WCAG standards. It can also be configured to compare enhanced and large text colours.

const textColour = new Colour("#520404");
const backgroundColour = new Colour("#D010EE");

matisse.validateContrast(textColour, backgroundColour); // false
matisse.validateContrast(textColour, backgroundColour, true); // true
matisse.validateContrast(textColour, backgroundColour, false, true); // false
matisse.validateContrast(textColour, backgroundColour, true, true); // false

A colour combination with insufficient contrast can be fixed as well. This works by whitening the lighter colour and blackening the darker colour!

const textColour = new Colour("#FFDD00"); // #FFDD00
const backgroundColour = new Colour("#1F8BFF"); // #1F8BFF

matisse.fixContrast(textColour, backgroundColour); // [#FFE644, #1866BC]

For detailed documentation, refer to the project's Module Interface Specification (MIS).

Sources

matisse was inspired by and makes use of the following: