Spaces:
Running
Running
| // Initialize tooltips and interactive elements | |
| document.addEventListener('DOMContentLoaded', () => { | |
| // Smooth scroll 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) { | |
| target.scrollIntoView({ behavior: 'smooth', block: 'start' }); | |
| } | |
| }); | |
| }); | |
| // Add active state to navigation items | |
| const sections = document.querySelectorAll('section[id]'); | |
| const navLinks = document.querySelectorAll('nav a[href^="#"]'); | |
| function highlightNav() { | |
| const scrollY = window.pageYOffset; | |
| sections.forEach(section => { | |
| const sectionHeight = section.offsetHeight; | |
| const sectionTop = section.offsetTop - 100; | |
| const sectionId = section.getAttribute('id'); | |
| if (scrollY > sectionTop && scrollY <= sectionTop + sectionHeight) { | |
| navLinks.forEach(link => { | |
| link.classList.remove('text-purple-400'); | |
| link.classList.add('text-gray-300'); | |
| }); | |
| document.querySelector(`nav a[href*="${sectionId}"]`)?.classList.add('text-purple-400'); | |
| } | |
| }); | |
| } | |
| window.addEventListener('scroll', highlightNav); | |
| highlightNav(); | |
| // Animate elements on scroll | |
| const observerOptions = { | |
| threshold: 0.1, | |
| rootMargin: '0px 0px -50px 0px' | |
| }; | |
| const observer = new IntersectionObserver((entries) => { | |
| entries.forEach(entry => { | |
| if (entry.isIntersecting) { | |
| entry.target.classList.add('animate-fade-in'); | |
| } | |
| }); | |
| }, observerOptions); | |
| // Observe all feature cards and sections | |
| document.querySelectorAll('.bg-gray-800, .bg-gray-900').forEach(el => { | |
| observer.observe(el); | |
| }); | |
| }); | |
| // Add fade-in animation | |
| const style = document.createElement('style'); | |
| style.textContent = ` | |
| @keyframes fade-in { | |
| from { opacity: 0; transform: translateY(20px); } | |
| to { opacity: 1; transform: translateY(0); } | |
| } | |
| .animate-fade-in { | |
| animation: fade-in 0.6s ease-out forwards; | |
| } | |
| `; | |
| document.head.appendChild(style); |