// 2026 Horizons - Interactive Features document.addEventListener('DOMContentLoaded', function() { // Theme Toggle const themeToggle = document.getElementById('themeToggle'); const themeIcon = themeToggle.querySelector('i'); // Check for saved theme or prefer-color-scheme const savedTheme = localStorage.getItem('theme'); const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; if (savedTheme === 'dark' || (!savedTheme && prefersDark)) { document.documentElement.setAttribute('data-theme', 'dark'); themeIcon.className = 'fas fa-sun'; } themeToggle.addEventListener('click', function() { const currentTheme = document.documentElement.getAttribute('data-theme'); if (currentTheme === 'dark') { document.documentElement.removeAttribute('data-theme'); themeIcon.className = 'fas fa-moon'; localStorage.setItem('theme', 'light'); } else { document.documentElement.setAttribute('data-theme', 'dark'); themeIcon.className = 'fas fa-sun'; localStorage.setItem('theme', 'dark'); } }); // Smooth scroll for navigation links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function(e) { e.preventDefault(); const targetId = this.getAttribute('href'); if (targetId === '#') return; const targetElement = document.querySelector(targetId); if (targetElement) { const headerHeight = document.querySelector('.navbar').offsetHeight; const targetPosition = targetElement.offsetTop - headerHeight - 20; window.scrollTo({ top: targetPosition, behavior: 'smooth' }); } }); }); // Navbar scroll effect const navbar = document.querySelector('.navbar'); let lastScrollTop = 0; window.addEventListener('scroll', function() { const scrollTop = window.pageYOffset || document.documentElement.scrollTop; // Hide/show navbar on scroll if (scrollTop > lastScrollTop && scrollTop > 100) { navbar.style.transform = 'translateY(-100%)'; } else { navbar.style.transform = 'translateY(0)'; } lastScrollTop = scrollTop; // Add shadow when scrolled if (scrollTop > 10) { navbar.style.boxShadow = 'var(--shadow-md)'; } else { navbar.style.boxShadow = 'none'; } }); // Animate elements on scroll const observerOptions = { threshold: 0.1, rootMargin: '0px 0px -50px 0px' }; const observer = new IntersectionObserver(function(entries) { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.classList.add('fade-in'); observer.unobserve(entry.target); } }); }, observerOptions); // Observe elements to animate document.querySelectorAll('.trend-card, .opportunity-card, .challenge-card, .highlight-card').forEach(el => { observer.observe(el); }); // Stats counter animation const stats = document.querySelectorAll('.stat-number'); const statsObserver = new IntersectionObserver(function(entries) { entries.forEach(entry => { if (entry.isIntersecting) { const stat = entry.target; const targetValue = parseInt(stat.textContent); let currentValue = 0; const increment = targetValue / 50; const duration = 1500; const stepTime = Math.floor(duration / 50); const timer = setInterval(() => { currentValue += increment; if (currentValue >= targetValue) { stat.textContent = targetValue; clearInterval(timer); } else { stat.textContent = Math.floor(currentValue); } }, stepTime); statsObserver.unobserve(stat); } }); }, { threshold: 0.5 }); stats.forEach(stat => { statsObserver.observe(stat); }); // Hover effects for cards document.querySelectorAll('.trend-card, .opportunity-card, .challenge-card').forEach(card => { card.addEventListener('mouseenter', function() { this.style.zIndex = '10'; }); card.addEventListener('mouseleave', function() { this.style.zIndex = '1'; }); }); // Current year in footer const currentYear = new Date().getFullYear(); const yearElement = document.querySelector('.copyright p'); if (yearElement) { yearElement.textContent = yearElement.textContent.replace('2026', currentYear); } // Initialize animations setTimeout(() => { document.body.style.opacity = '1'; }, 100); }); // Add CSS for initial load const style = document.createElement('style'); style.textContent = ` body { opacity: 0; transition: opacity 0.5s ease-in; } .fade-in { animation: fadeIn 0.8s ease-out forwards; } @keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } `; document.head.appendChild(style);