UNPKG

@kcirtaptrick/framer-motion

Version:

A simple and powerful React animation library

59 lines (56 loc) 2.24 kB
import { mix } from 'popmotion'; import { complex } from 'style-value-types'; import { cssVariableRegex } from '../../render/dom/utils/css-variables-conversion.mjs'; var varToken = "_$css"; var correctBoxShadow = { correct: function (latest, _a) { var treeScale = _a.treeScale, projectionDelta = _a.projectionDelta; var original = latest; /** * We need to first strip and store CSS variables from the string. */ var containsCSSVariables = latest.includes("var("); var cssVariables = []; if (containsCSSVariables) { latest = latest.replace(cssVariableRegex, function (match) { cssVariables.push(match); return varToken; }); } var shadow = complex.parse(latest); // TODO: Doesn't support multiple shadows if (shadow.length > 5) return original; var template = complex.createTransformer(latest); var offset = typeof shadow[0] !== "number" ? 1 : 0; // Calculate the overall context scale var xScale = projectionDelta.x.scale * treeScale.x; var yScale = projectionDelta.y.scale * treeScale.y; shadow[0 + offset] /= xScale; shadow[1 + offset] /= yScale; /** * Ideally we'd correct x and y scales individually, but because blur and * spread apply to both we have to take a scale average and apply that instead. * We could potentially improve the outcome of this by incorporating the ratio between * the two scales. */ var averageScale = mix(xScale, yScale, 0.5); // Blur if (typeof shadow[2 + offset] === "number") shadow[2 + offset] /= averageScale; // Spread if (typeof shadow[3 + offset] === "number") shadow[3 + offset] /= averageScale; var output = template(shadow); if (containsCSSVariables) { var i_1 = 0; output = output.replace(varToken, function () { var cssVariable = cssVariables[i_1]; i_1++; return cssVariable; }); } return output; }, }; export { correctBoxShadow };