Spaces:
Sleeping
Sleeping
| document.addEventListener('DOMContentLoaded', function() { | |
| const navbar = document.querySelector('.navbar'); | |
| const navLinks = document.querySelectorAll('.nav-link'); | |
| const hamburger = document.querySelector('.hamburger'); | |
| const navLinksContainer = document.querySelector('.nav-links'); | |
| navLinks.forEach(link => { | |
| link.addEventListener('click', function(e) { | |
| const href = this.getAttribute('href'); | |
| if (href.startsWith('#')) { | |
| e.preventDefault(); | |
| const targetId = href.substring(1); | |
| const targetElement = document.getElementById(targetId); | |
| if (targetElement) { | |
| navLinks.forEach(l => l.classList.remove('active')); | |
| this.classList.add('active'); | |
| targetElement.scrollIntoView({ | |
| behavior: 'smooth', | |
| block: 'start' | |
| }); | |
| } | |
| } | |
| }); | |
| }); | |
| window.addEventListener('scroll', function() { | |
| const scrollPosition = window.scrollY + 100; | |
| if (window.scrollY > 50) { | |
| navbar.style.background = 'rgba(10, 10, 10, 0.98)'; | |
| } else { | |
| navbar.style.background = 'rgba(10, 10, 10, 0.95)'; | |
| } | |
| const sections = ['home', 'features', 'endpoints']; | |
| sections.forEach(sectionId => { | |
| const section = document.getElementById(sectionId); | |
| if (section) { | |
| const sectionTop = section.offsetTop - 100; | |
| const sectionBottom = sectionTop + section.offsetHeight; | |
| if (scrollPosition >= sectionTop && scrollPosition < sectionBottom) { | |
| navLinks.forEach(link => { | |
| link.classList.remove('active'); | |
| if (link.getAttribute('href') === `#${sectionId}`) { | |
| link.classList.add('active'); | |
| } | |
| }); | |
| } | |
| } | |
| }); | |
| }); | |
| hamburger.addEventListener('click', function() { | |
| navLinksContainer.classList.toggle('active'); | |
| this.classList.toggle('active'); | |
| }); | |
| const typedTextSpan = document.querySelector('.typed-text'); | |
| const textArray = [ | |
| 'Explore the Universe', | |
| 'Discover Space Data', | |
| 'Access NASA Images', | |
| 'Learn About Planets', | |
| 'Meet Astronauts', | |
| 'Study Telescopes' | |
| ]; | |
| const typingDelay = 100; | |
| const erasingDelay = 50; | |
| const newTextDelay = 2000; | |
| let textArrayIndex = 0; | |
| let charIndex = 0; | |
| function type() { | |
| if (charIndex < textArray[textArrayIndex].length) { | |
| typedTextSpan.textContent += textArray[textArrayIndex].charAt(charIndex); | |
| charIndex++; | |
| setTimeout(type, typingDelay); | |
| } else { | |
| setTimeout(erase, newTextDelay); | |
| } | |
| } | |
| function erase() { | |
| if (charIndex > 0) { | |
| typedTextSpan.textContent = textArray[textArrayIndex].substring(0, charIndex - 1); | |
| charIndex--; | |
| setTimeout(erase, erasingDelay); | |
| } else { | |
| textArrayIndex++; | |
| if (textArrayIndex >= textArray.length) textArrayIndex = 0; | |
| setTimeout(type, typingDelay + 1100); | |
| } | |
| } | |
| if (typedTextSpan) { | |
| setTimeout(type, newTextDelay + 250); | |
| } | |
| const observerOptions = { | |
| threshold: 0.1, | |
| rootMargin: '0px 0px -50px 0px' | |
| }; | |
| const observer = new IntersectionObserver(function(entries) { | |
| entries.forEach(entry => { | |
| if (entry.isIntersecting) { | |
| entry.target.style.opacity = '1'; | |
| entry.target.style.transform = 'translateY(0)'; | |
| } | |
| }); | |
| }, observerOptions); | |
| const animatedElements = document.querySelectorAll('.feature-card, .endpoint-category'); | |
| animatedElements.forEach(el => { | |
| el.style.opacity = '0'; | |
| el.style.transform = 'translateY(30px)'; | |
| el.style.transition = 'opacity 0.6s ease, transform 0.6s ease'; | |
| observer.observe(el); | |
| }); | |
| const cards = document.querySelectorAll('.feature-card, .endpoint-category'); | |
| cards.forEach(card => { | |
| card.addEventListener('mouseenter', function() { | |
| this.style.transform = 'translateY(-10px) scale(1.02)'; | |
| }); | |
| card.addEventListener('mouseleave', function() { | |
| this.style.transform = 'translateY(0) scale(1)'; | |
| }); | |
| }); | |
| const endpointItems = document.querySelectorAll('.endpoint-item'); | |
| endpointItems.forEach(item => { | |
| item.addEventListener('click', function() { | |
| const code = this.querySelector('code'); | |
| if (code) { | |
| const endpoint = code.textContent; | |
| navigator.clipboard.writeText(`${window.location.origin}${endpoint}`).then(() => { | |
| const originalText = code.textContent; | |
| code.textContent = 'Copied!'; | |
| code.style.background = 'rgba(16, 185, 129, 0.2)'; | |
| code.style.color = '#10b981'; | |
| setTimeout(() => { | |
| code.textContent = originalText; | |
| code.style.background = 'rgba(99, 102, 241, 0.1)'; | |
| code.style.color = '#6366f1'; | |
| }, 1000); | |
| }); | |
| } | |
| }); | |
| }); | |
| window.addEventListener('scroll', function() { | |
| const scrolled = window.pageYOffset; | |
| const parallaxElements = document.querySelectorAll('.planet-system'); | |
| parallaxElements.forEach(element => { | |
| const speed = 0.5; | |
| const yPos = -(scrolled * speed); | |
| element.style.transform = `translateY(${yPos}px)`; | |
| }); | |
| }); | |
| window.addEventListener('load', function() { | |
| const heroContent = document.querySelector('.hero-content'); | |
| if (heroContent) { | |
| heroContent.style.opacity = '0'; | |
| heroContent.style.transform = 'translateY(30px)'; | |
| setTimeout(() => { | |
| heroContent.style.transition = 'opacity 1s ease, transform 1s ease'; | |
| heroContent.style.opacity = '1'; | |
| heroContent.style.transform = 'translateY(0)'; | |
| setTimeout(() => { | |
| const statsSection = document.querySelector('.hero-stats'); | |
| if (statsSection) { | |
| const numbers = statsSection.querySelectorAll('.stat-number'); | |
| numbers.forEach(number => { | |
| const originalText = number.getAttribute('data-original') || number.textContent; | |
| const numMatch = originalText.match(/\d+/); | |
| if (numMatch) { | |
| const finalValue = parseInt(numMatch[0]); | |
| const hasPlus = originalText.includes('+'); | |
| number.textContent = '0'; | |
| animateValue(number, 0, finalValue, 2000, hasPlus); | |
| } | |
| }); | |
| } | |
| }, 500); | |
| }, 100); | |
| } | |
| }); | |
| function animateValue(element, start, end, duration, hasPlus = false) { | |
| const range = end - start; | |
| let current = start; | |
| const increment = end > start ? 1 : -1; | |
| const stepTime = Math.abs(Math.floor(duration / range)); | |
| const timer = setInterval(() => { | |
| current += increment; | |
| element.textContent = current; | |
| if (current === end) { | |
| clearInterval(timer); | |
| element.textContent = hasPlus ? end + '+' : end; | |
| } | |
| }, stepTime); | |
| } | |
| const statsObserver = new IntersectionObserver(function(entries) { | |
| entries.forEach(entry => { | |
| if (entry.isIntersecting) { | |
| const numbers = entry.target.querySelectorAll('.stat-number'); | |
| numbers.forEach(number => { | |
| const originalText = number.getAttribute('data-original') || number.textContent; | |
| const numMatch = originalText.match(/\d+/); | |
| if (numMatch) { | |
| const finalValue = parseInt(numMatch[0]); | |
| const hasPlus = originalText.includes('+'); | |
| number.textContent = '0'; | |
| animateValue(number, 0, finalValue, 2000, hasPlus); | |
| } | |
| }); | |
| statsObserver.unobserve(entry.target); | |
| } | |
| }); | |
| }, { threshold: 0.3 }); | |
| const statsSection = document.querySelector('.hero-stats'); | |
| if (statsSection) { | |
| statsObserver.observe(statsSection); | |
| setTimeout(() => { | |
| const numbers = statsSection.querySelectorAll('.stat-number'); | |
| numbers.forEach((number, index) => { | |
| if (number.textContent === '0') { | |
| const statItems = statsSection.querySelectorAll('.stat-item .stat-number'); | |
| if (statItems[index]) { | |
| const originalElement = statItems[index]; | |
| const originalText = originalElement.getAttribute('data-original') || originalElement.textContent; | |
| number.textContent = originalText; | |
| } | |
| } | |
| }); | |
| }, 3000); | |
| } | |
| function createFloatingParticle() { | |
| const particle = document.createElement('div'); | |
| particle.style.position = 'fixed'; | |
| particle.style.width = Math.random() * 4 + 1 + 'px'; | |
| particle.style.height = particle.style.width; | |
| particle.style.background = `hsl(${Math.random() * 60 + 200}, 70%, 60%)`; | |
| particle.style.borderRadius = '50%'; | |
| particle.style.left = Math.random() * window.innerWidth + 'px'; | |
| particle.style.top = window.innerHeight + 'px'; | |
| particle.style.pointerEvents = 'none'; | |
| particle.style.opacity = Math.random() * 0.5 + 0.3; | |
| particle.style.zIndex = '-1'; | |
| document.body.appendChild(particle); | |
| const animation = particle.animate([ | |
| { transform: 'translateY(0px)', opacity: particle.style.opacity }, | |
| { transform: `translateY(-${window.innerHeight + 100}px)`, opacity: 0 } | |
| ], { | |
| duration: Math.random() * 3000 + 2000, | |
| easing: 'linear' | |
| }); | |
| animation.onfinish = () => particle.remove(); | |
| } | |
| setInterval(createFloatingParticle, 2000); | |
| }); | |
| if ('requestIdleCallback' in window) { | |
| requestIdleCallback(() => { | |
| console.log('🚀 Space API loaded successfully!'); | |
| }); | |
| } |