Alchemist accepts two types of plugins: Color Spaces Plugin and Color Methods Plugin.
A Color Space Plugin will tell Alchemist how to convert to and from a specific color space (e.g. "rgb", "hsl")
A Color Method Plugin will attach a method to all of it's colors. These method will usually manipulate a color in some way, such as lighten()
, or measure a part of the color, such as luminance()
, or possibly even both.
// we'll use hypothetical "rgb", "hsl", and "luminance" plugins
alchemist.use(rgb())
alchemist.use(hsl())
alchemist.use(luminance())
var white = alchemist.rgb(255, 255, 255)
white.hsl() // => [0, 1, 1]
white.luminance() // => 1
The use()
function also accepts an array of plugins. If you use alchemist-common
you've already used one of these plugin bundles.
alchemist.use([rgb(), hsl(), luminance()])
var common = alchemist.common() // => [rgb, hsl, lab ...]
alchemist.use(common)
When a Color Space Plugin is used, it creates a function on Alchemist
that creates colors based on that color space.
alchemist.rgb // => undefined
alchemist.use(rgb())
alchemist.rgb // => function () {...}
var red = alchemist.rgb(255, 0, 0)
red.space // => 'rgb'
Creates a new alchemist
object with the given config
options.
The reference white that will be used by the xyz color space and it's conversions. The default is the D65 illuminant. Note I plan to move this as an option to the XYZ color space itself in the near future.
Each color space has the ability to set a limits for the given the values passed in. For example the rgb color space requires a minimum value of 0
and a maximum value of 255
. Alchemist gives the user a choice on what to do when these limits are broken. There are three options for handling broken limits:
nullify
– returnsnull
when a limit is broken.clip
– returns the limit itself when the limit is broken. (e.g. [265, 75, -25] will be clipped to [255, 75, 0]strict
– throws an error if the limit is broken
var Alchemist = require('alchemist')
// default config
var alchemist = Alchemist.create({
white: { X: 0.95047, Y: 1, Z: 1.08883 },
limits: 'nullify'
})
var clippy = Alchemist.create({ limits: 'clip' })
var bossy = Alchemist.create({ limits: 'strict' })
alchemist.use(alchemist.common())
clippy.use(clippy.common())
bossy.use(strict_mode.common())
alchemist.rgb(265, 70 -20).value //=> null
clippy.rgb(265, 70, -20).value //=> [255, 75, 0]
bossy.rgb(265, 70, -20) // Error: Expected 265 to be less than 255
The value for the current color. In most cases this will be an array of numbers like [255, 255, 255]
, but it could also be a single value like "#ffffff"
in the case of a hexidecimal.
var white = alchemist.rgb(255, 255, 255)
white.value //=> [255, 255, 255]
The color space of the color
var black = alchlemist.rgb(0, 0, 0)
black.space //=> 'rgb'
This function will attempt to convert to the the target_space
and return the resulting color's value. If a path cannot be found or the target_space
does not exist, it will throw an Error.
How precise the rounded value will be. Pass null
to receive the raw value.
var color = alchemist.rgb(150, 70, 180)
color.to('hsl') //=> [283, 0.44, 0.49]
color.to('unknown') // Error: Could not find 'unknown' color space
All plugins will have a color method named after their color space that serve as a shorcut to the color.to()
variant. For example: If you use the alchemist-hsl
plugin, your colors will now have a color.hsl([options])
method that is essentially to color.to('hsl'[, options]).
alchemist.rgb(150, 70, 180).hsl() //=> [283, 0.44, 0.49]
Does the same Color.to()
, but will return the resulting Color
rather than it's value.
var color = alchemist.rgb(150, 70, 180)
new_color = color.as('hsl')
new_color.space //=> 'hsl'
new_color.value //=> [283, 0.44, 0.49]
Returns the rounded value of the color. If the precision option was passed via alchemist.create()
, alchemist will use that precision to round, otherwise, it defaults to a precision of 9. You can override this value by passing the desired precision directly to round()
.
grey = alchemist.rgb(150, 150, 150)
grey.value //=> [ 0.2898812924040048, 0.3049873445686177, 0.33207933717871424 ]
grey.round() //=> [ 0.289881292, 0.304987345, 0.332079337 ]
grey.round(3) //=> [ 0.290, 0.305, 0.332 ]
var alchemist = require('alchemist').create({ precision: 5 })
grey = alchemist.rgb(150, 150, 150)
grey.round() //=> [ 0.28988, 0.30499, 0.33208 ]