UNPKG

popmotion

Version:

The animator's toolbox

39 lines 1.51 kB
import { mix } from "./mix"; import { hsla, rgba, hex } from "style-value-types"; import { invariant } from "hey-listen"; import { hslaToRgba } from "./hsla-to-rgba"; export const mixLinearColor = (from, to, v) => { const fromExpo = from * from; const toExpo = to * to; return Math.sqrt(Math.max(0, v * (toExpo - fromExpo) + fromExpo)); }; const colorTypes = [hex, rgba, hsla]; const getColorType = (v) => colorTypes.find((type) => type.test(v)); const notAnimatable = (color) => `'${color}' is not an animatable color. Use the equivalent color code instead.`; export const mixColor = (from, to) => { let fromColorType = getColorType(from); let toColorType = getColorType(to); invariant(!!fromColorType, notAnimatable(from)); invariant(!!toColorType, notAnimatable(to)); let fromColor = fromColorType.parse(from); let toColor = toColorType.parse(to); if (fromColorType === hsla) { fromColor = hslaToRgba(fromColor); fromColorType = rgba; } if (toColorType === hsla) { toColor = hslaToRgba(toColor); toColorType = rgba; } const blended = Object.assign({}, fromColor); return (v) => { for (const key in blended) { if (key !== "alpha") { blended[key] = mixLinearColor(fromColor[key], toColor[key], v); } } blended.alpha = mix(fromColor.alpha, toColor.alpha, v); return fromColorType.transform(blended); }; }; //# sourceMappingURL=mix-color.js.map