interpolate

Using an input range of sequential numbers, and an output range of numbers or colors, interpolate will create a function that maps a number from the input range to the output.

Import

import { interpolate } from '@popmotion/popcorn';

Usage

interpolate can map from an input array of sequential numbers like this:

[0, 1, 2]

To an array of either numbers, colors, or strings containing one or more numbers or colors.

The two arrays must be the same length.

Numbers

const mapper = interpolate(
  [-100, -50, 50, 100],
  [0, 1, 1, 0]
);

mapper(-200); // 0
mapper(-75); // 0.5
mapper(50); // 1

Colors

interpolate can map to hex, RGB(A) or HSL(A) colors.

Note: Hex numbers will be output as RGBA.

const mapper = interpolate(
  [0, 50, 100],
  ['#fff', '#f00', '#000']
);

mapper(25); // rgba(255, 128, 128, 1)
mapper(50); // rgba(255, 0, 0, 1)
mapper(75); // rgba(128, 0, 0, 1)

Strings

interpolate can maps to complex value types that include multiple numbers or colors.

Every string in the output range must be of the exact same format.

const mapper = interpolate(
  [0, 1, 2],
  [
    '20px, rgba(0, 0, 0, 0)',
    '10px, rgba(255, 255, 255, 1)',
    '40px, rgba(100, 100, 100, 0.5)'
  ]
);

mapper(0.5); // '15px, rgba(128, 128, 128, 0.5)'

Options

interpolate takes an optional third argument, options. This is an object that may contain the following configurations:

Clamp

Clamp values to within the provided ranges.

Default: true.

interpolate([0, 1], [0, 100])(2) // 100
interpolate([0, 1], [0, 100], { clamp: false })(2) // 200

Ease

Default: linear

An easing function, or list of easing functions, to apply to every transition.

If defined as an array, it must be the input.length - 1, as it applies to the transitions between the defined values.

interpolate(
  [0, 100, 200],
  ['#fff', '#500', '#000'],
  { ease: [linear, easeOut] }
)

Types

interpolate(
  input: number[],
  output: string[] | number[],
  options: InterpolateOptions
): string | number;

type InterpolateOptions = {
  clamp?: boolean = true,
  ease?: Easing | Easing[]
};

type Easing = v => v;