framer-motion
Version:
An open source and production-ready motion library for React on the web
96 lines (86 loc) • 2.12 kB
text/typescript
import {
BoundingBox2D,
TransformPoint2D,
AxisBox2D,
Axis,
BoxDelta,
} from "../../types/geometry"
import { noop } from "../noop"
/**
* Bounding boxes tend to be defined as top, left, right, bottom. For various operations
* it's easier to consider each axis individually. This function returns a bounding box
* as a map of single-axis min/max values.
*/
export function convertBoundingBoxToAxisBox({
top,
left,
right,
bottom,
}: BoundingBox2D): AxisBox2D {
return {
x: { min: left, max: right },
y: { min: top, max: bottom },
}
}
export function convertAxisBoxToBoundingBox({
x,
y,
}: AxisBox2D): BoundingBox2D {
return {
top: y.min,
bottom: y.max,
left: x.min,
right: x.max,
}
}
/**
* Applies a TransformPoint function to a bounding box. TransformPoint is usually a function
* provided by Framer to allow measured points to be corrected for device scaling. This is used
* when measuring DOM elements and DOM event points.
*/
export function transformBoundingBox(
{ top, left, bottom, right }: BoundingBox2D,
transformPoint: TransformPoint2D = noop
): BoundingBox2D {
const topLeft = transformPoint({ x: left, y: top })
const bottomRight = transformPoint({ x: right, y: bottom })
return {
top: topLeft.y,
left: topLeft.x,
bottom: bottomRight.y,
right: bottomRight.x,
}
}
/**
* Calculate the center point of the provided axis
*/
export function calcAxisCenter({ min, max }: Axis) {
return (max - min) / 2 + min
}
/**
* Create an empty axis box of zero size
*/
export function axisBox(): AxisBox2D {
return { x: { min: 0, max: 1 }, y: { min: 0, max: 1 } }
}
export function copyAxisBox(box: AxisBox2D): AxisBox2D {
return {
x: { ...box.x },
y: { ...box.y },
}
}
/**
* Create an empty box delta
*/
const zeroDelta = {
translate: 0,
scale: 1,
origin: 0,
originPoint: 0,
}
export function delta(): BoxDelta {
return {
x: { ...zeroDelta },
y: { ...zeroDelta },
}
}