resig.js
Version:
Universal reactive signal library with complete platform features: signals, animations, CRDTs, scheduling, DOM integration. Works identically across React, SolidJS, Svelte, Vue, and Qwik.
294 lines • 25.1 kB
JavaScript
;
/**
* Animation-Signal Integration
* Reactive signals that drive UI updates from animation state changes
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.gestureSignal = exports.loop = exports.sequence = exports.springFromSignal = exports.useAnimatedValue = exports.animatedArray = exports.animatedColor = exports.springNumber = exports.animatedNumber = exports.springSignal = exports.animatedSignal = void 0;
const signal_1 = require("../core/signal");
const core_1 = require("./core");
const scheduler_1 = require("./scheduler");
// Tween signal for simple value interpolation
const animatedSignal = (initial, interpolator, defaultDuration = 300, defaultEasing = core_1.easings.easeInOut) => {
const valueSignal = (0, signal_1.signal)(initial);
const animationSignal = (0, signal_1.signal)(null);
const isAnimatingSignal = (0, signal_1.signal)(false);
const progressSignal = (0, signal_1.signal)(0);
let currentAnimation = null;
const instance = {
...valueSignal,
animation: animationSignal,
isAnimating: isAnimatingSignal,
progress: progressSignal,
animateTo: (target, duration = defaultDuration, easing = defaultEasing) => {
return new Promise((resolve) => {
// Stop current animation if running
if (currentAnimation) {
currentAnimation.stop();
}
const from = valueSignal.value();
const anim = (0, scheduler_1.scheduledAnimation)(from, target, duration, interpolator, easing);
currentAnimation = anim;
animationSignal._set(anim);
isAnimatingSignal._set(true);
// Subscribe to animation updates
const unsubscribeValue = anim.value.subscribe((value) => {
valueSignal._set(value);
});
const unsubscribeProgress = anim.progress.subscribe((progress) => {
progressSignal._set(progress);
});
// Handle completion
const unsubscribeComplete = anim.onComplete((finalValue) => {
unsubscribeValue();
unsubscribeProgress();
unsubscribeComplete();
currentAnimation = null;
animationSignal._set(null);
isAnimatingSignal._set(false);
progressSignal._set(0);
resolve(finalValue);
});
// Start the animation
anim.start();
});
},
setImmediate: (value) => {
if (currentAnimation) {
currentAnimation.stop();
currentAnimation = null;
animationSignal._set(null);
isAnimatingSignal._set(false);
progressSignal._set(0);
}
valueSignal._set(value);
},
stop: () => {
if (currentAnimation) {
currentAnimation.stop();
currentAnimation = null;
animationSignal._set(null);
isAnimatingSignal._set(false);
progressSignal._set(0);
}
},
};
return instance;
};
exports.animatedSignal = animatedSignal;
// Spring physics implementation
const springSignal = (initial, interpolator, config = {
tension: 170,
friction: 26,
mass: 1,
precision: 0.01,
}) => {
const valueSignal = (0, signal_1.signal)(initial);
const configSignal = (0, signal_1.signal)(config);
const velocitySignal = (0, signal_1.signal)(0);
const animationSignal = (0, signal_1.signal)(null);
const isAnimatingSignal = (0, signal_1.signal)(false);
const progressSignal = (0, signal_1.signal)(0);
let currentTarget = initial;
let currentVelocity = 0;
let animationFrameId = null;
const springStep = (currentTime, lastTime) => {
const deltaTime = Math.min(currentTime - lastTime, 16) / 1000; // Cap at 16ms for stability
const currentValue = valueSignal.value();
const springConfig = configSignal.value();
// Spring physics calculation - compute displacement
// For spring physics, we need numeric displacement
const displacement = typeof currentValue === 'number' && typeof currentTarget === 'number'
? currentTarget - currentValue
: 0; // Default to 0 for non-numeric types
const springForce = displacement * springConfig.tension;
const dampingForce = currentVelocity * springConfig.friction;
const acceleration = (springForce - dampingForce) / springConfig.mass;
currentVelocity += acceleration * deltaTime;
// Apply velocity to get new value
const velocityStep = currentVelocity * deltaTime;
const newValue = interpolator(currentValue, currentTarget, velocityStep);
valueSignal._set(newValue);
velocitySignal._set(currentVelocity);
// Check if spring has settled
const isSettled = Math.abs(currentVelocity) < springConfig.precision &&
Math.abs(displacement) < springConfig.precision;
if (isSettled) {
valueSignal._set(currentTarget);
velocitySignal._set(0);
isAnimatingSignal._set(false);
progressSignal._set(1);
animationFrameId = null;
}
else {
animationFrameId = requestAnimationFrame((time) => springStep(time, currentTime));
}
};
const instance = {
...valueSignal,
animation: animationSignal,
isAnimating: isAnimatingSignal,
progress: progressSignal,
config: configSignal,
velocity: velocitySignal,
animateTo: (target) => {
return new Promise((resolve) => {
currentTarget = target;
if (animationFrameId) {
cancelAnimationFrame(animationFrameId);
}
isAnimatingSignal._set(true);
progressSignal._set(0);
const startTime = performance.now();
const checkCompletion = () => {
if (!isAnimatingSignal.value()) {
resolve(valueSignal.value());
}
else {
requestAnimationFrame(checkCompletion);
}
};
animationFrameId = requestAnimationFrame((time) => {
springStep(time, startTime);
checkCompletion();
});
});
},
setImmediate: (value) => {
if (animationFrameId) {
cancelAnimationFrame(animationFrameId);
animationFrameId = null;
}
currentTarget = value;
currentVelocity = 0;
valueSignal._set(value);
velocitySignal._set(0);
isAnimatingSignal._set(false);
progressSignal._set(0);
},
stop: () => {
if (animationFrameId) {
cancelAnimationFrame(animationFrameId);
animationFrameId = null;
}
currentVelocity = 0;
velocitySignal._set(0);
isAnimatingSignal._set(false);
},
setConfig: (newConfig) => {
configSignal._set({ ...configSignal.value(), ...newConfig });
},
};
return instance;
};
exports.springSignal = springSignal;
// Convenience functions for common types
const animatedNumber = (initial, duration, easing) => {
return (0, exports.animatedSignal)(initial, core_1.interpolators.number, duration, easing);
};
exports.animatedNumber = animatedNumber;
const springNumber = (initial, config) => {
return (0, exports.springSignal)(initial, core_1.interpolators.number, {
tension: 170,
friction: 26,
mass: 1,
precision: 0.01,
...config,
});
};
exports.springNumber = springNumber;
const animatedColor = (initial, duration, easing) => {
return (0, exports.animatedSignal)(initial, core_1.interpolators.color, duration, easing);
};
exports.animatedColor = animatedColor;
const animatedArray = (initial, itemInterpolator, duration, easing) => {
return (0, exports.animatedSignal)(initial, (from, to, t) => core_1.interpolators.array(from, to, t, itemInterpolator), duration, easing);
};
exports.animatedArray = animatedArray;
// Reactive animation utilities
const useAnimatedValue = (sourceSignal, interpolator, duration = 300, easing = core_1.easings.easeInOut) => {
const animated = (0, exports.animatedSignal)(sourceSignal.value(), interpolator, duration, easing);
// Subscribe to source changes and animate to new values
sourceSignal.subscribe((newValue) => {
animated.animateTo(newValue, duration, easing);
});
return animated;
};
exports.useAnimatedValue = useAnimatedValue;
const springFromSignal = (sourceSignal, interpolator, config) => {
const defaultConfig = {
tension: 170,
friction: 26,
mass: 1,
precision: 0.01,
};
const mergedConfig = { ...defaultConfig, ...config };
const spring = (0, exports.springSignal)(sourceSignal.value(), interpolator, mergedConfig);
// Subscribe to source changes and spring to new values
sourceSignal.subscribe((newValue) => {
spring.animateTo(newValue);
});
return spring;
};
exports.springFromSignal = springFromSignal;
// Animation sequence utilities
const sequence = (signal, values, duration = 300, easing = core_1.easings.easeInOut) => {
return values.reduce((promise, value) => promise.then(() => signal.animateTo(value, duration, easing)), Promise.resolve(signal.value()));
};
exports.sequence = sequence;
const loop = (signal, values, duration = 300, easing = core_1.easings.easeInOut, iterations = Infinity) => {
let isRunning = true;
let currentIteration = 0;
const runLoop = async () => {
while (isRunning && currentIteration < iterations) {
for (const value of values) {
if (!isRunning)
break;
await signal.animateTo(value, duration, easing);
}
currentIteration++;
}
};
runLoop();
return {
stop: () => {
isRunning = false;
signal.stop();
},
};
};
exports.loop = loop;
// Gesture-based animations
const gestureSignal = (initial, interpolator) => {
const base = (0, exports.animatedSignal)(initial, interpolator);
let gestureStart = initial;
let gestureTarget = initial;
let isGesturing = false;
return {
...base,
startGesture: (target) => {
base.stop();
gestureStart = base.value();
gestureTarget = target;
isGesturing = true;
},
updateGesture: (progress) => {
if (isGesturing) {
const value = interpolator(gestureStart, gestureTarget, progress);
base.setImmediate(value);
}
},
endGesture: (velocity = 0) => {
if (isGesturing) {
isGesturing = false;
// Use velocity to determine final target and duration
// const _currentValue = base.value();
const remainingDistance = Math.abs(velocity); // Simplified
const duration = Math.max(100, Math.min(500, remainingDistance * 100));
base.animateTo(gestureTarget, duration, core_1.easings.easeOut);
}
},
};
};
exports.gestureSignal = gestureSignal;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hbmltYXRpb24vc2lnbmFscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7QUFFSCwyQ0FBZ0Q7QUFDaEQsaUNBTWdCO0FBQ2hCLDJDQUFpRDtBQWdDakQsOENBQThDO0FBQ3ZDLE1BQU0sY0FBYyxHQUFHLENBQzVCLE9BQVUsRUFDVixZQUE2QixFQUM3QixrQkFBMEIsR0FBRyxFQUM3QixnQkFBZ0MsY0FBTyxDQUFDLFNBQVMsRUFDOUIsRUFBRTtJQUNyQixNQUFNLFdBQVcsR0FBRyxJQUFBLGVBQU0sRUFBQyxPQUFPLENBQUMsQ0FBQztJQUNwQyxNQUFNLGVBQWUsR0FBRyxJQUFBLGVBQU0sRUFBc0IsSUFBSSxDQUFDLENBQUM7SUFDMUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFBLGVBQU0sRUFBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxNQUFNLGNBQWMsR0FBRyxJQUFBLGVBQU0sRUFBQyxDQUFDLENBQUMsQ0FBQztJQUVqQyxJQUFJLGdCQUFnQixHQUF3QixJQUFJLENBQUM7SUFFakQsTUFBTSxRQUFRLEdBQXNCO1FBQ2xDLEdBQUcsV0FBVztRQUNkLFNBQVMsRUFBRSxlQUFlO1FBQzFCLFdBQVcsRUFBRSxpQkFBaUI7UUFDOUIsUUFBUSxFQUFFLGNBQWM7UUFFeEIsU0FBUyxFQUFFLENBQ1QsTUFBUyxFQUNULFFBQVEsR0FBRyxlQUFlLEVBQzFCLE1BQU0sR0FBRyxhQUFhLEVBQ1YsRUFBRTtZQUNkLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDN0Isb0NBQW9DO2dCQUNwQyxJQUFJLGdCQUFnQixFQUFFLENBQUM7b0JBQ3JCLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO2dCQUMxQixDQUFDO2dCQUVELE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxJ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