Add splash page and improve user registration views.
This commit is contained in:
125
static/js/splash.js
Normal file
125
static/js/splash.js
Normal file
@@ -0,0 +1,125 @@
|
||||
// Splash Page Interactive Elements
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// Observer options for animations
|
||||
const observerOptions = {
|
||||
threshold: 0.5,
|
||||
rootMargin: '0px'
|
||||
};
|
||||
|
||||
// Parallax effect for hero section
|
||||
const hero = document.querySelector('.splash-hero');
|
||||
if (hero) {
|
||||
window.addEventListener('scroll', () => {
|
||||
const scrolled = window.pageYOffset;
|
||||
const parallaxSpeed = 0.5;
|
||||
hero.style.transform = `translateY(${scrolled * parallaxSpeed}px)`;
|
||||
});
|
||||
}
|
||||
|
||||
// Add hover effects to feature cards
|
||||
const featureCards = document.querySelectorAll('.feature-card');
|
||||
featureCards.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)';
|
||||
});
|
||||
});
|
||||
|
||||
// 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 stagger animation to feature cards
|
||||
const featureObserver = new IntersectionObserver((entries) => {
|
||||
entries.forEach((entry, index) => {
|
||||
if (entry.isIntersecting) {
|
||||
setTimeout(() => {
|
||||
entry.target.style.opacity = '1';
|
||||
entry.target.style.transform = 'translateY(0)';
|
||||
}, index * 100);
|
||||
featureObserver.unobserve(entry.target);
|
||||
}
|
||||
});
|
||||
}, observerOptions);
|
||||
|
||||
featureCards.forEach(card => {
|
||||
card.style.opacity = '0';
|
||||
card.style.transform = 'translateY(20px)';
|
||||
card.style.transition = 'all 0.6s ease';
|
||||
featureObserver.observe(card);
|
||||
});
|
||||
|
||||
// Testimonial cards animation
|
||||
const testimonialCards = document.querySelectorAll('.testimonial-card');
|
||||
const testimonialObserver = new IntersectionObserver((entries) => {
|
||||
entries.forEach((entry, index) => {
|
||||
if (entry.isIntersecting) {
|
||||
setTimeout(() => {
|
||||
entry.target.style.opacity = '1';
|
||||
entry.target.style.transform = 'translateX(0)';
|
||||
}, index * 150);
|
||||
testimonialObserver.unobserve(entry.target);
|
||||
}
|
||||
});
|
||||
}, observerOptions);
|
||||
|
||||
testimonialCards.forEach((card, index) => {
|
||||
card.style.opacity = '0';
|
||||
card.style.transform = index % 2 === 0 ? 'translateX(-30px)' : 'translateX(30px)';
|
||||
card.style.transition = 'all 0.8s ease';
|
||||
testimonialObserver.observe(card);
|
||||
});
|
||||
|
||||
// Pricing cards hover effect
|
||||
const pricingCards = document.querySelectorAll('.pricing-card');
|
||||
pricingCards.forEach(card => {
|
||||
card.addEventListener('mouseenter', function() {
|
||||
if (!this.classList.contains('featured')) {
|
||||
this.style.transform = 'translateY(-10px)';
|
||||
this.style.boxShadow = '0 15px 40px rgba(0,0,0,0.12)';
|
||||
}
|
||||
});
|
||||
|
||||
card.addEventListener('mouseleave', function() {
|
||||
if (!this.classList.contains('featured')) {
|
||||
this.style.transform = 'translateY(0)';
|
||||
this.style.boxShadow = '0 5px 20px rgba(0,0,0,0.08)';
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Add ripple effect to buttons
|
||||
const buttons = document.querySelectorAll('.btn-primary, .btn-secondary, .btn-pricing');
|
||||
buttons.forEach(button => {
|
||||
button.addEventListener('click', function(e) {
|
||||
const ripple = document.createElement('span');
|
||||
const rect = this.getBoundingClientRect();
|
||||
const size = Math.max(rect.width, rect.height);
|
||||
const x = e.clientX - rect.left - size / 2;
|
||||
const y = e.clientY - rect.top - size / 2;
|
||||
|
||||
ripple.style.width = ripple.style.height = size + 'px';
|
||||
ripple.style.left = x + 'px';
|
||||
ripple.style.top = y + 'px';
|
||||
ripple.classList.add('ripple');
|
||||
|
||||
this.appendChild(ripple);
|
||||
|
||||
setTimeout(() => ripple.remove(), 600);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user