UNPKG

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
"use strict"; /** * 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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