UNPKG

suryajs-animfx

Version:

SuryaJS - A powerful JavaScript animation library with 20+ image, text, and advanced 3D effects

254 lines (218 loc) 8.13 kB
import ImageEffects from './effects/imageEffects.js'; import TextEffects from './effects/textEffects.js'; import AdvancedEffects from './effects/advancedEffects.js'; import './styles/animations.css'; class AnimFX { constructor() { this.imageEffects = new ImageEffects(); this.textEffects = new TextEffects(); this.advancedEffects = new AdvancedEffects(); this.init(); } init() { // Auto-initialize when DOM is ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => this.autoInit()); } else { this.autoInit(); } } autoInit() { // Auto-detect and apply effects based on data attributes this.detectAndApplyEffects(); } detectAndApplyEffects() { // Detect image effects const imageElements = document.querySelectorAll('[data-image-effect]'); imageElements.forEach(element => { const effectNumber = parseInt(element.getAttribute('data-image-effect')); this.imageEffect(effectNumber, element); }); // Detect text effects const textElements = document.querySelectorAll('[data-text-effect]'); textElements.forEach(element => { const effectNumber = parseInt(element.getAttribute('data-text-effect')); this.textEffect(effectNumber, element); }); } // Public API methods imageEffect(effectNumber, target = null) { const elements = target ? (Array.isArray(target) ? target : [target]) : Array.from(document.querySelectorAll('img, .image-container, .demo-image, .effect-target')); // Debug logging console.log(`AnimFX: Running image effect ${effectNumber} on ${elements.length} elements`); // Filter out any null/undefined elements const validElements = elements.filter(el => el && el.style); if (validElements.length === 0) { console.warn(`AnimFX: No valid elements found for image effect ${effectNumber}`); return this; } switch(effectNumber) { case 1: this.imageEffects.fadeInScale(validElements); break; case 2: this.imageEffects.slideInRotate(validElements); break; case 3: this.imageEffects.zoomBlur(validElements); break; case 4: this.imageEffects.flipReveal(validElements); break; case 5: this.imageEffects.glitchEffect(validElements); break; default: console.warn(`Image effect ${effectNumber} not found. Available effects: 1-5`); } return this; } textEffect(effectNumber, target = null) { const elements = target ? (Array.isArray(target) ? target : [target]) : Array.from(document.querySelectorAll('.text-animate, h1, h2, h3, p')); switch(effectNumber) { case 1: this.textEffects.typeWriter(elements); break; case 2: this.textEffects.fadeInUp(elements); break; case 3: this.textEffects.letterSpacing(elements); break; case 4: this.textEffects.colorWave(elements); break; case 5: this.textEffects.splitReveal(elements); break; default: console.warn(`Text effect ${effectNumber} not found. Available effects: 1-5`); } return this; } getElements(target, selectors) { const elements = target ? (Array.isArray(target) ? target : [target]) : Array.from(document.querySelectorAll(selectors)); return elements.filter(el => el && el.style); } // Advanced Effects API mouseFollower(target = null, options = {}) { const elements = this.getElements(target, '.mouse-follower, .effect-target, img, div'); this.advancedEffects.mouseFollower(elements, options); return this; } mouseMagnet(target = null, options = {}) { const elements = this.getElements(target, '.mouse-magnet, .effect-target, img, div'); this.advancedEffects.mouseMagnet(elements, options); return this; } magneticPull(target = null, options = {}) { const elements = this.getElements(target, '.magnetic-pull, .effect-target, img, div'); this.advancedEffects.magneticPull(elements, options); return this; } tilt3D(target = null, options = {}) { const elements = this.getElements(target, '.tilt-3d, .effect-target, img, div'); this.advancedEffects.tilt3D(elements, options); return this; } parallax3D(target = null, options = {}) { const elements = this.getElements(target, '.parallax-3d, .effect-target, img, div'); this.advancedEffects.parallax3D(elements, options); return this; } liquidDistortion(target = null, options = {}) { const elements = this.getElements(target, '.liquid-distortion, .effect-target, img, div'); this.advancedEffects.liquidDistortion(elements, options); return this; } floatingAnimation(target = null, options = {}) { const elements = this.getElements(target, '.floating-animation, .effect-target, img, div'); this.advancedEffects.floatingAnimation(elements, options); return this; } morphingShape(target = null, options = {}) { const elements = this.getElements(target, '.morphing-shape, .effect-target, img, div'); this.advancedEffects.morphingShape(elements, options); return this; } // New Advanced 3D Effects (SheryJS-like) card3DFlip(target = null, options = {}) { const elements = this.getElements(target, '.card-3d-flip, .effect-target, img, div'); this.advancedEffects.card3DFlip(elements, options); return this; } cube3DRotation(target = null, options = {}) { const elements = this.getElements(target, '.cube-3d-rotation, .effect-target, img, div'); this.advancedEffects.cube3DRotation(elements, options); return this; } depth3DLayers(target = null, options = {}) { const elements = this.getElements(target, '.depth-3d-layers, .effect-target, img, div'); this.advancedEffects.depth3DLayers(elements, options); return this; } hover3DLift(target = null, options = {}) { const elements = this.getElements(target, '.hover-3d-lift, .effect-target, img, div'); this.advancedEffects.hover3DLift(elements, options); return this; } perspective3DShift(target = null, options = {}) { const elements = this.getElements(target, '.perspective-3d-shift, .effect-target, img, div'); this.advancedEffects.perspective3DShift(elements, options); return this; } ripple3DWave(target = null, options = {}) { const elements = this.getElements(target, '.ripple-3d-wave, .effect-target, img, div'); this.advancedEffects.ripple3DWave(elements, options); return this; } // Cleanup method cleanup() { this.advancedEffects.cleanup(); return this; } // Utility methods addHoverEffect(selector, effectType, effectNumber) { const elements = document.querySelectorAll(selector); elements.forEach(element => { element.addEventListener('mouseenter', () => { if (effectType === 'image') { this.imageEffect(effectNumber, element); } else if (effectType === 'text') { this.textEffect(effectNumber, element); } }); }); return this; } addScrollEffect(selector, effectType, effectNumber, options = {}) { const elements = document.querySelectorAll(selector); const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { if (effectType === 'image') { this.imageEffect(effectNumber, entry.target); } else if (effectType === 'text') { this.textEffect(effectNumber, entry.target); } } }); }, { threshold: options.threshold || 0.1, rootMargin: options.rootMargin || '0px' }); elements.forEach(element => observer.observe(element)); return this; } } // Auto-initialize const animFX = new AnimFX(); // Export for different module systems if (typeof module !== 'undefined' && module.exports) { module.exports = AnimFX; } if (typeof window !== 'undefined') { window.AnimFX = AnimFX; window.animFX = animFX; } export default AnimFX;