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.
299 lines • 27.2 kB
JavaScript
;
/**
* DOM Animation Adapter
* Extends DOM adapter with animation capabilities for CSS properties and transforms
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.animateOnScroll = exports.animateElements = exports.bounce = exports.shake = exports.rotate = exports.scale = exports.slideOut = exports.slideIn = exports.fadeOut = exports.fadeIn = exports.animatedElement = void 0;
const core_1 = require("./core");
const signals_1 = require("./signals");
// CSS property interpolators
const cssInterpolators = {
length: (from, to, t) => {
const fromValue = parseFloat(from);
const toValue = parseFloat(to);
const unit = from.replace(/[\d.-]/g, '') || to.replace(/[\d.-]/g, '') || 'px';
const value = fromValue + (toValue - fromValue) * t;
return `${value}${unit}`;
},
color: core_1.interpolators.color,
number: (from, to, t) => {
const fromNum = typeof from === 'number' ? from : parseFloat(from);
const toNum = typeof to === 'number' ? to : parseFloat(to);
return String(fromNum + (toNum - fromNum) * t);
},
transform: (from, to, t) => {
const result = {};
const properties = [
'translateX',
'translateY',
'translateZ',
'scaleX',
'scaleY',
'scaleZ',
'rotateX',
'rotateY',
'rotateZ',
'skewX',
'skewY',
];
properties.forEach((prop) => {
const fromVal = from[prop] ?? 0;
const toVal = to[prop] ?? 0;
result[prop] = fromVal + (toVal - fromVal) * t;
});
return result;
},
};
// Transform to CSS string converter
const transformToCSS = (transform) => {
const parts = [];
if (transform.translateX !== undefined ||
transform.translateY !== undefined ||
transform.translateZ !== undefined) {
const x = transform.translateX ?? 0;
const y = transform.translateY ?? 0;
const z = transform.translateZ ?? 0;
parts.push(`translate3d(${x}px, ${y}px, ${z}px)`);
}
if (transform.scaleX !== undefined ||
transform.scaleY !== undefined ||
transform.scaleZ !== undefined) {
const x = transform.scaleX ?? 1;
const y = transform.scaleY ?? 1;
const z = transform.scaleZ ?? 1;
parts.push(`scale3d(${x}, ${y}, ${z})`);
}
if (transform.rotateX !== undefined)
parts.push(`rotateX(${transform.rotateX}deg)`);
if (transform.rotateY !== undefined)
parts.push(`rotateY(${transform.rotateY}deg)`);
if (transform.rotateZ !== undefined)
parts.push(`rotateZ(${transform.rotateZ}deg)`);
if (transform.skewX !== undefined)
parts.push(`skewX(${transform.skewX}deg)`);
if (transform.skewY !== undefined)
parts.push(`skewY(${transform.skewY}deg)`);
return parts.join(' ');
};
// Create animated DOM element
const animatedElement = (element) => {
// Initialize transform signal
const transformSignal = (0, signals_1.animatedSignal)({}, cssInterpolators.transform, 300, core_1.easings.easeInOut);
// Initialize opacity signal
const opacitySignal = (0, signals_1.animatedSignal)(parseFloat(getComputedStyle(element).opacity) || 1, core_1.interpolators.number, 300, core_1.easings.easeInOut);
// Initialize visibility signal
const visibilitySignal = (0, signals_1.animatedSignal)(getComputedStyle(element).visibility !== 'hidden', core_1.interpolators.boolean, 0);
// Style property signals cache
const styleSignals = {};
// Subscribe to transform changes
transformSignal.subscribe((transform) => {
element.style.transform = transformToCSS(transform);
});
// Subscribe to opacity changes
opacitySignal.subscribe((opacity) => {
element.style.opacity = String(opacity);
});
// Subscribe to visibility changes
visibilitySignal.subscribe((visible) => {
element.style.visibility = visible ? 'visible' : 'hidden';
});
const getStyleSignal = (property) => {
if (!styleSignals[property]) {
const currentValue = getComputedStyle(element)[property] || '0';
const interpolator = property.includes('color')
? cssInterpolators.color
: /^(width|height|top|left|right|bottom|margin|padding)/.test(property)
? cssInterpolators.length
: cssInterpolators.number;
const signal = (0, signals_1.animatedSignal)(currentValue, interpolator);
signal.subscribe((value) => {
element.style[property] = value;
});
styleSignals[property] = signal;
}
return styleSignals[property];
};
const instance = {
element,
get style() {
return new Proxy({}, {
get: (_, property) => getStyleSignal(property),
});
},
transform: transformSignal,
opacity: opacitySignal,
visibility: visibilitySignal,
animate: async (config) => {
const signal = getStyleSignal(config.property);
await signal.animateTo(config.unit ? `${config.to}${config.unit}` : config.to, config.duration, config.easing);
},
animateTransform: async (to, duration = 300, easing = core_1.easings.easeInOut) => {
const current = transformSignal.value();
const target = { ...current, ...to };
await transformSignal.animateTo(target, duration, easing);
},
fadeIn: async (duration = 300) => {
visibilitySignal.setImmediate(true);
await opacitySignal.animateTo(1, duration, core_1.easings.easeOut);
},
fadeOut: async (duration = 300) => {
await opacitySignal.animateTo(0, duration, core_1.easings.easeIn);
visibilitySignal.setImmediate(false);
},
slideIn: async (direction, duration = 300) => {
const rect = element.getBoundingClientRect();
const startTransform = {};
switch (direction) {
case 'left':
startTransform.translateX = -rect.width;
break;
case 'right':
startTransform.translateX = rect.width;
break;
case 'up':
startTransform.translateY = -rect.height;
break;
case 'down':
startTransform.translateY = rect.height;
break;
}
transformSignal.setImmediate({
...transformSignal.value(),
...startTransform,
});
visibilitySignal.setImmediate(true);
await instance.animateTransform({
translateX: 0,
translateY: 0,
}, duration, core_1.easings.easeOut);
},
slideOut: async (direction, duration = 300) => {
const rect = element.getBoundingClientRect();
const endTransform = {};
switch (direction) {
case 'left':
endTransform.translateX = -rect.width;
break;
case 'right':
endTransform.translateX = rect.width;
break;
case 'up':
endTransform.translateY = -rect.height;
break;
case 'down':
endTransform.translateY = rect.height;
break;
}
await instance.animateTransform(endTransform, duration, core_1.easings.easeIn);
visibilitySignal.setImmediate(false);
},
scale: async (to, duration = 300) => {
await instance.animateTransform({
scaleX: to,
scaleY: to,
}, duration, core_1.easings.easeInOut);
},
rotate: async (to, duration = 300) => {
await instance.animateTransform({
rotateZ: to,
}, duration, core_1.easings.easeInOut);
},
shake: async (intensity = 10, duration = 600) => {
const originalTransform = transformSignal.value();
const shakeCount = 6;
const shakeDuration = duration / shakeCount;
for (let i = 0; i < shakeCount; i++) {
const direction = i % 2 === 0 ? 1 : -1;
const amount = intensity * direction * (1 - i / shakeCount);
await instance.animateTransform({
...originalTransform,
translateX: amount,
}, shakeDuration, core_1.easings.easeInOut);
}
await instance.animateTransform(originalTransform, shakeDuration, core_1.easings.easeOut);
},
bounce: async (intensity = 20, duration = 600) => {
const originalTransform = transformSignal.value();
const bounceCount = 3;
const bounceDuration = duration / (bounceCount * 2);
for (let i = 0; i < bounceCount; i++) {
const amount = intensity * (1 - i / bounceCount);
// Up
await instance.animateTransform({
...originalTransform,
translateY: -amount,
}, bounceDuration, core_1.easings.easeOut);
// Down
await instance.animateTransform(originalTransform, bounceDuration, core_1.easings.easeIn);
}
},
};
return instance;
};
exports.animatedElement = animatedElement;
// Utility functions for common DOM animations
const fadeIn = (element, duration = 300) => {
return (0, exports.animatedElement)(element).fadeIn(duration);
};
exports.fadeIn = fadeIn;
const fadeOut = (element, duration = 300) => {
return (0, exports.animatedElement)(element).fadeOut(duration);
};
exports.fadeOut = fadeOut;
const slideIn = (element, direction, duration = 300) => {
return (0, exports.animatedElement)(element).slideIn(direction, duration);
};
exports.slideIn = slideIn;
const slideOut = (element, direction, duration = 300) => {
return (0, exports.animatedElement)(element).slideOut(direction, duration);
};
exports.slideOut = slideOut;
const scale = (element, to, duration = 300) => {
return (0, exports.animatedElement)(element).scale(to, duration);
};
exports.scale = scale;
const rotate = (element, to, duration = 300) => {
return (0, exports.animatedElement)(element).rotate(to, duration);
};
exports.rotate = rotate;
const shake = (element, intensity = 10, duration = 600) => {
return (0, exports.animatedElement)(element).shake(intensity, duration);
};
exports.shake = shake;
const bounce = (element, intensity = 20, duration = 600) => {
return (0, exports.animatedElement)(element).bounce(intensity, duration);
};
exports.bounce = bounce;
// Batch animation utilities
const animateElements = async (elements, animation, stagger = 0) => {
const promises = elements.map((element, index) => {
return new Promise((resolve) => {
setTimeout(async () => {
await animation((0, exports.animatedElement)(element));
resolve();
}, index * stagger);
});
});
await Promise.all(promises);
};
exports.animateElements = animateElements;
// Intersection observer for scroll-triggered animations
const animateOnScroll = (element, animation, options = { threshold: 0.1 }) => {
let hasAnimated = false;
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting && !hasAnimated) {
hasAnimated = true;
animation((0, exports.animatedElement)(element));
}
});
}, options);
observer.observe(element);
return () => {
observer.unobserve(element);
observer.disconnect();
};
};
exports.animateOnScroll = animateOnScroll;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FuaW1hdGlvbi9kb20udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7O0FBRUgsaUNBQWdFO0FBQ2hFLHVDQUdtQjtBQXlEbkIsNkJBQTZCO0FBQzdCLE1BQU0sZ0JBQWdCLEdBQUc7SUFDdkIsTUFBTSxFQUFFLENBQUMsSUFBWSxFQUFFLEVBQVUsRUFBRSxDQUFTLEVBQVUsRUFBRTtRQUN0RCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sSUFBSSxHQUNSLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQztRQUNuRSxNQUFNLEtBQUssR0FBRyxTQUFTLEdBQUcsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sR0FBRyxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELEtBQUssRUFBRSxvQkFBYSxDQUFDLEtBQUs7SUFFMUIsTUFBTSxFQUFFLENBQUMsSUFBcUIsRUFBRSxFQUFtQixFQUFFLENBQVMsRUFBVSxFQUFFO1FBQ3hFLE1BQU0sT0FBTyxHQUFHLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkUsTUFBTSxLQUFLLEdBQUcsT0FBTyxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLEdB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