diff options
Diffstat (limited to 'static/landing-script.js')
-rw-r--r-- | static/landing-script.js | 220 |
1 files changed, 0 insertions, 220 deletions
diff --git a/static/landing-script.js b/static/landing-script.js deleted file mode 100644 index 1189cd4..0000000 --- a/static/landing-script.js +++ /dev/null @@ -1,220 +0,0 @@ -// 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); -} |