Significant changes to the shades package are laid out below for each release.

===============================================================================

VERSION 1.5.0

- Names and dimnames are now supported for shade objects and can be set using
  the usual accessor functions. Names are initialised from standard colours
  where these are specified rather than a hex code, propagated through
  operations like concatenation and shown by swatch() as labels on each box.
  Dimnames are set automatically when a matrix is created by updating
  colour properties on a vector, and are shown by swatch() as axis labels.
- The new shades() convenience function is a variant of shade() that combines
  construction of shade objects with concatenation. It supports inline colour
  naming using standard argument names, and creating shade objects from source
  objects of different types.
- New colour property accessor function luminance() has been added,
  as has the contrast() function for (W3C) colour contrast.
- There is now full support for the Oklab colour space.
- Empty shade vectors are now allowed and can be created with shade().
- The swatch() function gains extra parameters for controlling additional
  aspects of the plot.
- The argument to function objects created by gradient() is now called n rather
  than steps, for compatibility with tinyplot.
- The tinytest package is now used for testing.
- The README now includes an example of using shades with tinyplot, as well as
  ggplot2.
- A small roxygen issue has been fixed (#9).

===============================================================================

VERSION 1.4.0

- The package now handles missing values, patching up some of the limitations
  of the underlying core graphics functions. In particular, shade vectors may
  contain NAs, and will propagate them through manipulations, while NAs are
  accepted as pass-through values when updating colour properties.

===============================================================================

VERSION 1.3.1

- A fix has been made for compatibility with changes in the next annual release
  of R and its core packages.

===============================================================================

VERSION 1.3.0

- It is now possible to manipulate palette functions and ggplot2 scales using
  the colour manipulation functions in this package (#5, #7). When passed one
  of these objects, a modified wrapper object is returned. This allows colour
  tweaks to be made to standard scales in ggplot2 plots. See the README for a
  visual example.
- The gradient() function now returns a function if its second argument is
  missing or NULL. This change is complementary to the one above, allowing
  palette functions to be created.
- Conversions from HSV to RGB coordinates are now more precise.

===============================================================================

VERSION 1.2.0

- There is now support for transparency, which can be queried or modified
  through the new opacity() function, which functions just like the other
  colour property functions (#4). Opacity (alpha) values are stored as an
  attribute with shade objects, and reflected in the RGB hex representation
  only when less than 1.
- The scalefac() functional has been added, which multiplies its argument just
  as delta() adds it. Both functions now accept, and concatenate, multiple
  arguments for convenience.
- The usual behaviour of the colour property manipulation functions, which
  vectorise over both arguments, can be suppressed by wrapping replacement
  values with the recycle() function, which reverts to a standard R
  "recycling" scheme with final dimensions matching the original.

===============================================================================

VERSION 1.1.0

- The dichromat() function now offers a pass-through (normal colour vision)
  option, and is also vectorised over its second argument (#3). Some of the
  coefficients it uses internally are now pre-calculated and cached for
  efficiency.
- There is now a print method for vectors of class shade.
- An empty shade vector is now explicitly an error.
- The README now includes an example of using shades with ggplot2 (#2), as
  well as links to several related packages.

===============================================================================

VERSION 1.0.0

- Support for two new colour spaces has been added: LMS, a direct
  representation of the response levels of each of the three colour receptor
  types in the eye; and LCh, a polar representation of Lab space.
- The new dichromat() function can be used to simulate colour blindness.
- The gradient() function now additionally supports predefined colour maps from
  matplotlib and ColorBrewer. Its second argument is now interpreted a little
  differently.
- The hueshift() function has been removed, in favour of the more general
  combination of hue() and delta(). hue(x, delta(y)) is the equivalent of the
  old hueshift(x,y), and delta() can also be used with other colour properties.
- New colour property functions lightness() and chroma() have been added.
- Dimensions are now set when two or more colour properties are changed, and
  the swatch() visualisation function plots multidimensional shades in a grid.
- There is now a rev() method for shades.
- The all.equal() method for shades now passes on its ellipsis argument when
  checking colour coordinates.

===============================================================================

VERSION 0.2.0

- The package has been reworked to use functions from base R to warp colour
  coordinates between spaces and so on. It therefore no longer depends on the
  "colorspace" package, but the list of supported colour spaces has changed
  somewhat as a result.
- The warp() function has been added for colour space conversions.
- New function complement() returns complementary colours, while addmix() and
  submix(), plus infix shorthands, implement additive and subtractive colour
  mixing.
- The new distance() function can be used to calculate a standardised measure
  of the perceptual "distance" between colours.
- The shade class gains indexing and equality operators, plus methods for c(),
  rep() and all.equal().
- There are now accessor functions space() and coords(), for obtaining the
  current space and coordinates of colour vectors.
- The swatch() function now draws grey borders around colour boxes, to make
  the delineation of near-white colours clearer.

===============================================================================

VERSION 0.1.0

- First public release.

===============================================================================
