UNPKG

popmotion

Version:

The animator's toolbox

75 lines 2.54 kB
import { __assign, __spreadArrays } from "tslib"; import { color, complex } from "style-value-types"; import { mix } from "./mix"; import { mixColor } from "./mix-color"; import { isNum } from "./inc"; import { pipe } from "./pipe"; import { invariant } from "hey-listen"; function getMixer(origin, target) { if (isNum(origin)) { return function (v) { return mix(origin, target, v); }; } else if (color.test(origin)) { return mixColor(origin, target); } else { return mixComplex(origin, target); } } export var mixArray = function (from, to) { var output = __spreadArrays(from); var numValues = output.length; var blendValue = from.map(function (fromThis, i) { return getMixer(fromThis, to[i]); }); return function (v) { for (var i = 0; i < numValues; i++) { output[i] = blendValue[i](v); } return output; }; }; export var mixObject = function (origin, target) { var output = __assign(__assign({}, origin), target); var blendValue = {}; for (var key in output) { if (origin[key] !== undefined && target[key] !== undefined) { blendValue[key] = getMixer(origin[key], target[key]); } } return function (v) { for (var key in blendValue) { output[key] = blendValue[key](v); } return output; }; }; function analyse(value) { var parsed = complex.parse(value); var numValues = parsed.length; var numNumbers = 0; var numRGB = 0; var numHSL = 0; for (var i = 0; i < numValues; i++) { if (numNumbers || typeof parsed[i] === "number") { numNumbers++; } else { if (parsed[i].hue !== undefined) { numHSL++; } else { numRGB++; } } } return { parsed: parsed, numNumbers: numNumbers, numRGB: numRGB, numHSL: numHSL }; } export var mixComplex = function (origin, target) { var template = complex.createTransformer(target); var originStats = analyse(origin); var targetStats = analyse(target); invariant(originStats.numHSL === targetStats.numHSL && originStats.numRGB === targetStats.numRGB && originStats.numNumbers >= targetStats.numNumbers, "Complex values '" + origin + "' and '" + target + "' too different to mix. Ensure all colors are of the same type."); return pipe(mixArray(originStats.parsed, targetStats.parsed), template); }; //# sourceMappingURL=mix-complex.js.map