87 lines
3.4 KiB
JavaScript
87 lines
3.4 KiB
JavaScript
import { __rest } from "tslib";
|
|
import { detectAnimationFromOptions } from "./utils/detect-animation-from-options";
|
|
import sync, { cancelSync } from "framesync";
|
|
import { interpolate } from "../utils/interpolate";
|
|
import { loopElapsed, reverseElapsed, hasRepeatDelayElapsed, } from "./utils/elapsed";
|
|
const framesync = (update) => {
|
|
const passTimestamp = ({ delta }) => update(delta);
|
|
return {
|
|
start: () => sync.update(passTimestamp, true),
|
|
stop: () => cancelSync.update(passTimestamp),
|
|
};
|
|
};
|
|
export function animate(_a) {
|
|
var _b, _c;
|
|
var { from, autoplay = true, driver = framesync, elapsed = 0, repeat: repeatMax = 0, repeatType = "loop", repeatDelay = 0, onPlay, onStop, onComplete, onRepeat, onUpdate } = _a, options = __rest(_a, ["from", "autoplay", "driver", "elapsed", "repeat", "repeatType", "repeatDelay", "onPlay", "onStop", "onComplete", "onRepeat", "onUpdate"]);
|
|
let { to } = options;
|
|
let driverControls;
|
|
let repeatCount = 0;
|
|
let computedDuration = options.duration;
|
|
let latest;
|
|
let isComplete = false;
|
|
let isForwardPlayback = true;
|
|
let interpolateFromNumber;
|
|
const animator = detectAnimationFromOptions(options);
|
|
if ((_c = (_b = animator).needsInterpolation) === null || _c === void 0 ? void 0 : _c.call(_b, from, to)) {
|
|
interpolateFromNumber = interpolate([0, 100], [from, to], {
|
|
clamp: false,
|
|
});
|
|
from = 0;
|
|
to = 100;
|
|
}
|
|
const animation = animator(Object.assign(Object.assign({}, options), { from, to }));
|
|
function repeat() {
|
|
repeatCount++;
|
|
if (repeatType === "reverse") {
|
|
isForwardPlayback = repeatCount % 2 === 0;
|
|
elapsed = reverseElapsed(elapsed, computedDuration, repeatDelay, isForwardPlayback);
|
|
}
|
|
else {
|
|
elapsed = loopElapsed(elapsed, computedDuration, repeatDelay);
|
|
if (repeatType === "mirror")
|
|
animation.flipTarget();
|
|
}
|
|
isComplete = false;
|
|
onRepeat && onRepeat();
|
|
}
|
|
function complete() {
|
|
driverControls.stop();
|
|
onComplete && onComplete();
|
|
}
|
|
function update(delta) {
|
|
if (!isForwardPlayback)
|
|
delta = -delta;
|
|
elapsed += delta;
|
|
if (!isComplete) {
|
|
const state = animation.next(Math.max(0, elapsed));
|
|
latest = state.value;
|
|
if (interpolateFromNumber)
|
|
latest = interpolateFromNumber(latest);
|
|
isComplete = isForwardPlayback ? state.done : elapsed <= 0;
|
|
}
|
|
onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(latest);
|
|
if (isComplete) {
|
|
if (repeatCount === 0)
|
|
computedDuration !== null && computedDuration !== void 0 ? computedDuration : (computedDuration = elapsed);
|
|
if (repeatCount < repeatMax) {
|
|
hasRepeatDelayElapsed(elapsed, computedDuration, repeatDelay, isForwardPlayback) && repeat();
|
|
}
|
|
else {
|
|
complete();
|
|
}
|
|
}
|
|
}
|
|
function play() {
|
|
onPlay === null || onPlay === void 0 ? void 0 : onPlay();
|
|
driverControls = driver(update);
|
|
driverControls.start();
|
|
}
|
|
autoplay && play();
|
|
return {
|
|
stop: () => {
|
|
onStop === null || onStop === void 0 ? void 0 : onStop();
|
|
driverControls.stop();
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=index.js.map
|