{"version":3,"file":"unit-conversion.mjs","sources":["../../../../../src/animation/keyframes/utils/unit-conversion.ts"],"sourcesContent":["import type { Box } from \"motion-utils\"\nimport { parseValueFromTransform } from \"../../../render/dom/parse-transform\"\nimport { transformPropOrder } from \"../../../render/utils/keys-transform\"\nimport { MotionValue } from \"../../../value\"\nimport { number } from \"../../../value/types/numbers\"\nimport { px } from \"../../../value/types/numbers/units\"\nimport { ValueType } from \"../../../value/types/types\"\nimport { AnyResolvedKeyframe } from \"../../types\"\nimport { WithRender } from \"../types\"\n\nexport const isNumOrPxType = (v?: ValueType): v is ValueType =>\n    v === number || v === px\n\n/**\n * Measures a positional value in pixels from an element's computed style.\n * The bounding box is only measured on demand as it forces layout and is\n * affected by transforms.\n */\ntype GetActualMeasurementInPixels = (\n    computedStyle: Partial<CSSStyleDeclaration>,\n    measureBox: () => Box\n) => number\n\nconst transformKeys = new Set([\"x\", \"y\", \"z\"])\nconst nonTranslationalTransformKeys = /* @__PURE__ */ transformPropOrder.filter(\n    (key) => !transformKeys.has(key)\n)\n\ntype RemovedTransforms = [string, AnyResolvedKeyframe][]\n\n/**\n * Reset any bounding box-changing transforms so the element can be\n * measured. Returns the values to restore. Values already at their\n * default don't change the box, so they're left alone: an element with\n * only `rotate: 0` doesn't need to be re-rendered before measuring.\n */\nexport function removeNonTranslationalTransform(visualElement: WithRender) {\n    const removedTransforms: RemovedTransforms = []\n\n    nonTranslationalTransformKeys.forEach((key) => {\n        const value: MotionValue<AnyResolvedKeyframe> | undefined =\n            visualElement.getValue(key)\n        if (value !== undefined) {\n            const current = value.get()\n            const reset = key.startsWith(\"scale\") ? 1 : 0\n\n            if (current === reset) return\n\n            removedTransforms.push([key, current])\n            value.set(reset)\n        }\n    })\n\n    return removedTransforms\n}\n\n/**\n * Values that can only be measured from the bounding box. Elements with\n * these values need bounding box-changing transforms removed first.\n */\nexport const boxDependentValues = new Set([\"bottom\", \"right\"])\n\n/**\n * Computed width/height is already in pixels and unaffected by\n * transforms. It's \"auto\" for elements without a layout box (e.g. inline),\n * in which case we fall back to measuring the bounding box.\n */\nfunction measureDimension(\n    computed: string | undefined,\n    measureBox: () => Box,\n    axis: \"x\" | \"y\",\n    paddingStart: string,\n    paddingEnd: string,\n    boxSizing?: string\n) {\n    const px = parseFloat(computed as string)\n    if (!isNaN(px)) return px\n\n    const { min, max } = measureBox()[axis]\n    const size = max - min\n    return boxSizing === \"border-box\"\n        ? size\n        : size - parseFloat(paddingStart) - parseFloat(paddingEnd)\n}\n\nconst transformX: GetActualMeasurementInPixels = ({ transform }) =>\n    parseValueFromTransform(transform, \"x\")\nconst transformY: GetActualMeasurementInPixels = ({ transform }) =>\n    parseValueFromTransform(transform, \"y\")\n\nexport const positionalValues: { [key: string]: GetActualMeasurementInPixels } =\n    {\n        // Dimensions\n        width: (\n            { width, paddingLeft = \"0\", paddingRight = \"0\", boxSizing },\n            measureBox\n        ) =>\n            measureDimension(\n                width,\n                measureBox,\n                \"x\",\n                paddingLeft,\n                paddingRight,\n                boxSizing\n            ),\n        height: (\n            { height, paddingTop = \"0\", paddingBottom = \"0\", boxSizing },\n            measureBox\n        ) =>\n            measureDimension(\n                height,\n                measureBox,\n                \"y\",\n                paddingTop,\n                paddingBottom,\n                boxSizing\n            ),\n\n        top: ({ top }) => parseFloat(top as string),\n        left: ({ left }) => parseFloat(left as string),\n        bottom: ({ top }, measureBox) => {\n            const { y } = measureBox()\n            return parseFloat(top as string) + (y.max - y.min)\n        },\n        right: ({ left }, measureBox) => {\n            const { x } = measureBox()\n            return parseFloat(left as string) + (x.max - x.min)\n        },\n\n        // Transform, including translate longform names\n        x: transformX,\n        y: transformY,\n        translateX: transformX,\n        translateY: transformY,\n    }\n"],"names":[],"mappings":"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"}