/** * AI Creative Studio - Scroll Animations * Using Intersection Observer API (High Performance) */ (function() { 'use strict'; /** * Array of animation target classes */ const animationClasses = [ 'is-style-aics-fade-in', 'is-style-aics-fade-up', 'is-style-aics-fade-down', 'is-style-aics-slide-left', 'is-style-aics-slide-right', 'is-style-aics-zoom-in', 'is-style-aics-rotate-in', 'is-style-aics-bounce-in' ]; /** * Detect and initialize animation target elements */ function aicsInitAnimationElements() { const elements = []; animationClasses.forEach(function(className) { const found = document.querySelectorAll('.' + className); found.forEach(function(element, index) { if (!element.classList.contains('aics-animation-ready')) { // Add hidden class as initial state element.classList.add('aics-animation-pending'); element.classList.add('aics-animation-ready'); // Set delay time for same page (100ms increments) element.dataset.animationDelay = index * 100; elements.push(element); } }); }); return elements; } /** * Intersection Observer callback */ function aicsHandleIntersection(entries, observer) { entries.forEach(function(entry) { if (entry.isIntersecting) { const element = entry.target; const delay = parseInt(element.dataset.animationDelay) || 0; // Start animation with delay setTimeout(function() { element.classList.remove('aics-animation-pending'); element.classList.add('aics-animation-active'); }, delay); // Stop observing after execution (performance optimization) observer.unobserve(element); } }); } /** * Initialize scroll animations */ function aicsInitScrollAnimations() { // Disable if user prefers reduced motion if (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) { // Show all elements immediately const elements = aicsInitAnimationElements(); elements.forEach(function(element) { element.classList.remove('aics-animation-pending'); element.classList.add('aics-animation-active'); }); return; } // Check Intersection Observer API support if (!('IntersectionObserver' in window)) { console.warn('Intersection Observer not supported. Showing all animations immediately.'); const elements = aicsInitAnimationElements(); elements.forEach(function(element) { element.classList.remove('aics-animation-pending'); element.classList.add('aics-animation-active'); }); return; } // Observer configuration const observerOptions = { root: null, // viewport rootMargin: '0px 0px -50px 0px', // Trigger 50px before bottom threshold: 0.1 // Trigger when 10% visible }; // Create Observer const observer = new IntersectionObserver(aicsHandleIntersection, observerOptions); // Get animation elements and start observing const elements = aicsInitAnimationElements(); elements.forEach(function(element) { observer.observe(element); }); console.log('AICS Scroll Animations initialized:', elements.length, 'elements'); } /** * Initialize after DOM loaded */ if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', aicsInitScrollAnimations); } else { aicsInitScrollAnimations(); } })();