Mission Control Dashboard - Initial implementation
This commit is contained in:
72
node_modules/motion-dom/dist/es/projection/animation/mix-values.mjs
generated
vendored
Normal file
72
node_modules/motion-dom/dist/es/projection/animation/mix-values.mjs
generated
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
import { mixNumber } from '../../utils/mix/number.mjs';
|
||||
import { percent, px } from '../../value/types/numbers/units.mjs';
|
||||
import { progress, circOut, noop } from 'motion-utils';
|
||||
|
||||
const borderLabels = [
|
||||
"borderTopLeftRadius",
|
||||
"borderTopRightRadius",
|
||||
"borderBottomLeftRadius",
|
||||
"borderBottomRightRadius",
|
||||
];
|
||||
const numBorders = borderLabels.length;
|
||||
const asNumber = (value) => typeof value === "string" ? parseFloat(value) : value;
|
||||
const isPx = (value) => typeof value === "number" || px.test(value);
|
||||
function mixValues(target, follow, lead, progress, shouldCrossfadeOpacity, isOnlyMember) {
|
||||
if (shouldCrossfadeOpacity) {
|
||||
target.opacity = mixNumber(0, lead.opacity ?? 1, easeCrossfadeIn(progress));
|
||||
target.opacityExit = mixNumber(follow.opacity ?? 1, 0, easeCrossfadeOut(progress));
|
||||
}
|
||||
else if (isOnlyMember) {
|
||||
target.opacity = mixNumber(follow.opacity ?? 1, lead.opacity ?? 1, progress);
|
||||
}
|
||||
/**
|
||||
* Mix border radius
|
||||
*/
|
||||
for (let i = 0; i < numBorders; i++) {
|
||||
const borderLabel = borderLabels[i];
|
||||
let followRadius = getRadius(follow, borderLabel);
|
||||
let leadRadius = getRadius(lead, borderLabel);
|
||||
if (followRadius === undefined && leadRadius === undefined)
|
||||
continue;
|
||||
followRadius || (followRadius = 0);
|
||||
leadRadius || (leadRadius = 0);
|
||||
const canMix = followRadius === 0 ||
|
||||
leadRadius === 0 ||
|
||||
isPx(followRadius) === isPx(leadRadius);
|
||||
if (canMix) {
|
||||
target[borderLabel] = Math.max(mixNumber(asNumber(followRadius), asNumber(leadRadius), progress), 0);
|
||||
if (percent.test(leadRadius) || percent.test(followRadius)) {
|
||||
target[borderLabel] += "%";
|
||||
}
|
||||
}
|
||||
else {
|
||||
target[borderLabel] = leadRadius;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Mix rotation
|
||||
*/
|
||||
if (follow.rotate || lead.rotate) {
|
||||
target.rotate = mixNumber(follow.rotate || 0, lead.rotate || 0, progress);
|
||||
}
|
||||
}
|
||||
function getRadius(values, radiusName) {
|
||||
return values[radiusName] !== undefined
|
||||
? values[radiusName]
|
||||
: values.borderRadius;
|
||||
}
|
||||
const easeCrossfadeIn = /*@__PURE__*/ compress(0, 0.5, circOut);
|
||||
const easeCrossfadeOut = /*@__PURE__*/ compress(0.5, 0.95, noop);
|
||||
function compress(min, max, easing) {
|
||||
return (p) => {
|
||||
// Could replace ifs with clamp
|
||||
if (p < min)
|
||||
return 0;
|
||||
if (p > max)
|
||||
return 1;
|
||||
return easing(progress(min, max, p));
|
||||
};
|
||||
}
|
||||
|
||||
export { mixValues };
|
||||
//# sourceMappingURL=mix-values.mjs.map
|
||||
1
node_modules/motion-dom/dist/es/projection/animation/mix-values.mjs.map
generated
vendored
Normal file
1
node_modules/motion-dom/dist/es/projection/animation/mix-values.mjs.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user