Spaces:
Running
Running
| // Smooth scrolling for anchor links | |
| document.querySelectorAll('a[href^="#"]').forEach(anchor => { | |
| anchor.addEventListener('click', function (e) { | |
| e.preventDefault(); | |
| const target = document.querySelector(this.getAttribute('href')); | |
| if (target) { | |
| window.scrollTo({ | |
| top: target.offsetTop - 80, | |
| behavior: 'smooth' | |
| }); | |
| } | |
| }); | |
| }); | |
| // Simple animation on scroll | |
| const observerOptions = { | |
| root: null, | |
| rootMargin: '0px', | |
| threshold: 0.1 | |
| }; | |
| const observer = new IntersectionObserver((entries) => { | |
| entries.forEach(entry => { | |
| if (entry.isIntersecting) { | |
| entry.target.classList.add('animate-fade-in-up'); | |
| } | |
| }); | |
| }, observerOptions); | |
| document.querySelectorAll('.animate-on-scroll').forEach(el => { | |
| observer.observe(el); | |
| }); | |
| // Add animation classes to elements | |
| document.addEventListener('DOMContentLoaded', function() { | |
| // Add animation classes to feature cards | |
| document.querySelectorAll('.grid > div').forEach((card, index) => { | |
| card.classList.add('animate-on-scroll'); | |
| card.style.transitionDelay = `${index * 0.1}s`; | |
| }); | |
| // Add animation to how-it-works steps | |
| document.querySelectorAll('.flex .flex-shrink-0').forEach((step, index) => { | |
| step.parentElement.classList.add('animate-on-scroll'); | |
| step.parentElement.style.transitionDelay = `${index * 0.2}s`; | |
| }); | |
| }); | |
| // Animation CSS (added dynamically) | |
| const style = document.createElement('style'); | |
| style.textContent = ` | |
| @keyframes fadeInUp { | |
| from { | |
| opacity: 0; | |
| transform: translateY(30px); | |
| } | |
| to { | |
| opacity: 1; | |
| transform: translateY(0); | |
| } | |
| } | |
| .animate-fade-in-up { | |
| animation: fadeInUp 0.6s ease-out forwards; | |
| } | |
| .animate-on-scroll { | |
| opacity: 0; | |
| } | |
| `; | |
| document.head.appendChild(style); |