motion-v
Version:
<h1 align="center"> <img width="35" height="35" alt="Motion logo" src="https://github.com/user-attachments/assets/00d6d1c3-72c4-4c2f-a664-69da13182ffc" /><br />Motion for Vue</h1>
68 lines (67 loc) • 2.78 kB
JavaScript
import { calcLength, mixNumber } from "motion-dom";
import { clamp, progress } from "motion-utils";
function applyConstraints(point, { min, max }, elastic) {
if (min !== void 0 && point < min) point = elastic ? mixNumber(min, point, elastic.min) : Math.max(point, min);
else if (max !== void 0 && point > max) point = elastic ? mixNumber(max, point, elastic.max) : Math.min(point, max);
return point;
}
const defaultElastic = .35;
function calcRelativeConstraints(layoutBox, { top, left, bottom, right }) {
return {
x: calcRelativeAxisConstraints(layoutBox.x, left, right),
y: calcRelativeAxisConstraints(layoutBox.y, top, bottom)
};
}
function calcRelativeAxisConstraints(axis, min, max) {
return {
min: min !== void 0 ? axis.min + min : void 0,
max: max !== void 0 ? axis.max + max - (axis.max - axis.min) : void 0
};
}
function resolveDragElastic(dragElastic = defaultElastic) {
if (dragElastic === false) dragElastic = 0;
else if (dragElastic === true) dragElastic = defaultElastic;
return {
x: resolveAxisElastic(dragElastic, "left", "right"),
y: resolveAxisElastic(dragElastic, "top", "bottom")
};
}
function resolveAxisElastic(dragElastic, minLabel, maxLabel) {
return {
min: resolvePointElastic(dragElastic, minLabel),
max: resolvePointElastic(dragElastic, maxLabel)
};
}
function resolvePointElastic(dragElastic, label) {
return typeof dragElastic === "number" ? dragElastic : dragElastic[label] || 0;
}
function rebaseAxisConstraints(layout, constraints) {
const relativeConstraints = {};
if (constraints.min !== void 0) relativeConstraints.min = constraints.min - layout.min;
if (constraints.max !== void 0) relativeConstraints.max = constraints.max - layout.min;
return relativeConstraints;
}
function calcViewportConstraints(layoutBox, constraintsBox) {
return {
x: calcViewportAxisConstraints(layoutBox.x, constraintsBox.x),
y: calcViewportAxisConstraints(layoutBox.y, constraintsBox.y)
};
}
function calcViewportAxisConstraints(layoutAxis, constraintsAxis) {
let min = constraintsAxis.min - layoutAxis.min;
let max = constraintsAxis.max - layoutAxis.max;
if (constraintsAxis.max - constraintsAxis.min < layoutAxis.max - layoutAxis.min) [min, max] = [max, min];
return {
min,
max
};
}
function calcOrigin(source, target) {
let origin = .5;
const sourceLength = calcLength(source);
const targetLength = calcLength(target);
if (targetLength > sourceLength) origin = progress(target.min, target.max - sourceLength, source.min);
else if (sourceLength > targetLength) origin = progress(source.min, source.max - targetLength, target.min);
return clamp(0, 1, origin);
}
export { applyConstraints, calcOrigin, calcRelativeConstraints, calcViewportConstraints, defaultElastic, rebaseAxisConstraints, resolveDragElastic };