diff options
Diffstat (limited to 'static/landing-script.js')
-rw-r--r-- | static/landing-script.js | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/static/landing-script.js b/static/landing-script.js new file mode 100644 index 0000000..1189cd4 --- /dev/null +++ b/static/landing-script.js @@ -0,0 +1,220 @@ +// Smooth scrolling for navigation 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' + }); + } + }); +}); + +// Mobile menu toggle +const hamburger = document.querySelector('.hamburger'); +const navMenu = document.querySelector('.nav-menu'); + +if (hamburger && navMenu) { + hamburger.addEventListener('click', () => { + hamburger.classList.toggle('active'); + navMenu.classList.toggle('active'); + }); + + // Close mobile menu when clicking on a link + document.querySelectorAll('.nav-link').forEach(n => n.addEventListener('click', () => { + hamburger.classList.remove('active'); + navMenu.classList.remove('active'); + })); +} + +// Navbar background on scroll +window.addEventListener('scroll', () => { + const navbar = document.querySelector('.navbar'); + if (window.scrollY > 50) { + navbar.style.background = 'rgba(255, 255, 255, 0.98)'; + } else { + navbar.style.background = 'rgba(255, 255, 255, 0.95)'; + } +}); + +// CTA button handlers +document.querySelectorAll('.btn').forEach(btn => { + btn.addEventListener('click', (e) => { + const buttonText = btn.textContent.toLowerCase(); + + if (buttonText.includes('sign in') || buttonText.includes('login')) { + alert('Redirecting to login page...\n\nThis would navigate to the sign-in form.'); + } else if (buttonText.includes('trial') || buttonText.includes('start')) { + alert('Starting your free trial!\n\nThis would open the registration form with a 14-day trial.'); + } else if (buttonText.includes('demo') || buttonText.includes('watch')) { + alert('Opening demo video...\n\nThis would show a product demonstration or schedule a live demo.'); + } else if (buttonText.includes('contact') || buttonText.includes('sales')) { + alert('Contacting sales team...\n\nThis would open a contact form or calendar booking widget.'); + } + }); +}); + +// Intersection Observer for animations +const observerOptions = { + threshold: 0.1, + rootMargin: '0px 0px -50px 0px' +}; + +const observer = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + entry.target.style.opacity = '1'; + entry.target.style.transform = 'translateY(0)'; + } + }); +}, observerOptions); + +// Observe elements for animation +document.querySelectorAll('.feature-card, .testimonial-card, .pricing-card').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); +}); + +// Hero section animations +window.addEventListener('load', () => { + const heroTitle = document.querySelector('.hero-title'); + const heroSubtitle = document.querySelector('.hero-subtitle'); + const heroButtons = document.querySelector('.hero-buttons'); + const heroStats = document.querySelector('.hero-stats'); + const dashboardMockup = document.querySelector('.dashboard-mockup'); + + [heroTitle, heroSubtitle, heroButtons, heroStats].forEach((element, index) => { + if (element) { + element.style.opacity = '0'; + element.style.transform = 'translateY(30px)'; + element.style.transition = 'opacity 0.8s ease, transform 0.8s ease'; + + setTimeout(() => { + element.style.opacity = '1'; + element.style.transform = 'translateY(0)'; + }, 200 + (index * 200)); + } + }); + + // Dashboard mockup animation + if (dashboardMockup) { + dashboardMockup.style.opacity = '0'; + dashboardMockup.style.transform = 'perspective(1000px) rotateY(-25deg) rotateX(15deg) translateY(50px)'; + dashboardMockup.style.transition = 'opacity 1s ease, transform 1s ease'; + + setTimeout(() => { + dashboardMockup.style.opacity = '1'; + dashboardMockup.style.transform = 'perspective(1000px) rotateY(-15deg) rotateX(10deg) translateY(0)'; + }, 800); + } +}); + +// Pricing card hover effects +document.querySelectorAll('.pricing-card').forEach(card => { + card.addEventListener('mouseenter', () => { + if (!card.classList.contains('featured')) { + card.style.transform = 'translateY(-10px)'; + } + }); + + card.addEventListener('mouseleave', () => { + if (!card.classList.contains('featured')) { + card.style.transform = 'translateY(0)'; + } + }); +}); + +// Company logo hover effects +document.querySelectorAll('.company-logo').forEach(logo => { + logo.addEventListener('mouseenter', () => { + logo.style.opacity = '1'; + logo.style.transform = 'scale(1.1)'; + }); + + logo.addEventListener('mouseleave', () => { + logo.style.opacity = '0.6'; + logo.style.transform = 'scale(1)'; + }); +}); + +// Add mobile menu styles dynamically +const style = document.createElement('style'); +style.textContent = ` + @media (max-width: 768px) { + .nav-menu.active { + display: flex; + position: absolute; + top: 100%; + left: 0; + width: 100%; + background: white; + flex-direction: column; + padding: 1rem 2rem; + box-shadow: var(--shadow); + border-top: 1px solid var(--border); + } + + .hamburger.active span:nth-child(1) { + transform: rotate(-45deg) translate(-5px, 6px); + } + + .hamburger.active span:nth-child(2) { + opacity: 0; + } + + .hamburger.active span:nth-child(3) { + transform: rotate(45deg) translate(-5px, -6px); + } + } +`; +document.head.appendChild(style); + +// Simulate dynamic stats counter +const animateStats = () => { + const statNumbers = document.querySelectorAll('.stat-item strong'); + const targets = ['10,000+', '500K+', '99.9%']; + + statNumbers.forEach((stat, index) => { + const target = targets[index]; + let current = 0; + const increment = target.includes('K') ? 5000 : target.includes('%') ? 1 : 100; + const max = target.includes('K') ? 500000 : target.includes('%') ? 99.9 : 10000; + + const updateStat = () => { + if (current < max) { + current += increment; + if (target.includes('K')) { + stat.textContent = Math.floor(current / 1000) + 'K+'; + } else if (target.includes('%')) { + stat.textContent = (current / 10).toFixed(1) + '%'; + } else { + stat.textContent = current.toLocaleString() + '+'; + } + setTimeout(updateStat, 50); + } else { + stat.textContent = target; + } + }; + + setTimeout(updateStat, 1000 + (index * 200)); + }); +}; + +// Trigger stats animation when hero is visible +const heroObserver = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + animateStats(); + heroObserver.unobserve(entry.target); + } + }); +}); + +const heroSection = document.querySelector('.hero'); +if (heroSection) { + heroObserver.observe(heroSection); +} |