Plugins

February 2, 2015 ยท View on GitHub

Color Spaces

Color Space Plugins are dead simple (for now). Here's the XYZ plugin in it's entirty. This also happens to be the bare minimum needed to have a valid color space plugin.

alchemist.use({ name: 'xyz', to: {} })

This obviously isn't going to get you very far, as it doesn't define any relationships with any other color spaces. Let's create our own version of RGB that has a 0:1 scale rather than 0:255.

alchemist.use({
  name: 'myrgb',
    to: {
    'rgb': function (mR, mG, mB) {
      var R = mR * 255
      var G = mG * 255
      var B = mB * 255
      return [R, G, B]
    }
  }
})

That's it! Now just include alchemist-rgb and let's try it out.

  var rgb = require('alchemist-rgb')
  alchemist.use(rgb())

  alchemist.myrgb(0, .5, 1).rgb() // => [0, 127.5, 255]

Nice! What happens when we try to convert from rgb to myrgb?

  alchemist.rgb(255, 255, 255).myrgb() // Error! Alchemist does not know how to convert from rgb to myrgb

Error?? Looks like we need to shout at the alchemist-rgb guys becuase they haven't implemented a conversion to the best color space in the world!

...or

Again, we can define our own conversion.

  alchemist.use({
  name: 'myrgb',
  to: {
    'rgb': function (mR, mG, mB) {
      var R = mR * 255
      var G = mG * 255
      var B = mB * 255
      return [R, G, B]
    }
  },
  from: {
    'rgb': function (R, G, B) {
      var mR = R / 255
      var mG = G / 255
      var mB = B / 255
      return [mR, mG, mB]
    }
  }
})

alchemist.rgb(255, 255, 255).myrgb() // [1, 1, 1]

If you ever need to know things like "what reference white are we using?" you can pass .use() a function that returns your plugin instead. This will expose Alchemist and all of it's properties as the first argument of the passed function.

alchemist.use(function (alchemist) {
  alchemist.white //=> { X: 0.9505, Y: 1, Z: 1.089}

  return {
    name: 'rgb',
    to: {
      //...
    }
  }
})

Color Methods

Color Methods are a recent addition to alchemist plugins. More documentation is coming later, but to get you started, here is an example method. This method will set the lighteness of a color when used as a method of that color (e.g. color.lightness(50)), and will measure the lightness when used as a global (e.g. alchemist.lightness(color))

alchemist.use({
  name: 'lightness',
  methods: {
    // is attached to each color
    color: function (amount) {
      var lab = color.as('lab')
      lab[0] = amount
      return lab
    },
    // is attached to alchemist itself
    global: function (color) {
      return color.as('lab')[0]
    }
  }
})