usmanxd's picture
Initial DeepSite commit
9d85c13 verified
Raw
History Blame Contribute Delete
10.8 kB
// ==================== INITIALIZE LUCIDE ICONS ====================
lucide.createIcons();
// ==================== PRELOADER ====================
window.addEventListener('load', () => {
const preloader = document.getElementById('preloader');
setTimeout(() => {
preloader.style.opacity = '0';
setTimeout(() => {
preloader.style.display = 'none';
}, 700);
}, 1500);
});
// ==================== IMAGE LAZY LOADING ====================
document.querySelectorAll('img').forEach(img => {
if (img.complete) {
img.classList.add('loaded');
} else {
img.addEventListener('load', () => {
img.classList.add('loaded');
});
img.addEventListener('error', () => {
img.classList.add('loaded');
});
}
});
// ==================== NAVBAR SCROLL EFFECT ====================
const navbar = document.getElementById('navbar');
let lastScroll = 0;
window.addEventListener('scroll', () => {
const currentScroll = window.pageYOffset;
if (currentScroll > 80) {
navbar.classList.add('scrolled');
} else {
navbar.classList.remove('scrolled');
}
lastScroll = currentScroll;
});
// ==================== MOBILE MENU ====================
const mobileMenuBtn = document.getElementById('mobileMenuBtn');
const mobileMenu = document.getElementById('mobileMenu');
mobileMenuBtn.addEventListener('click', () => {
mobileMenu.classList.toggle('hidden');
});
// Close mobile menu when clicking a link
mobileMenu.querySelectorAll('a').forEach(link => {
link.addEventListener('click', () => {
mobileMenu.classList.add('hidden');
});
});
// ==================== SCROLL ANIMATIONS ====================
const observerOptions = {
threshold: 0.15,
rootMargin: '0px 0px -50px 0px'
};
const scrollObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const delay = entry.target.getAttribute('data-delay') || 0;
setTimeout(() => {
entry.target.classList.add('animated');
}, parseInt(delay));
scrollObserver.unobserve(entry.target);
}
});
}, observerOptions);
document.querySelectorAll('.animate-on-scroll').forEach(el => {
scrollObserver.observe(el);
});
// ==================== PARALLAX EFFECT ====================
const heroParallax = document.querySelector('.hero-parallax');
window.addEventListener('scroll', () => {
if (heroParallax) {
const scrolled = window.pageYOffset;
if (scrolled < window.innerHeight) {
heroParallax.style.transform = `translateY(${scrolled * 0.4}px)`;
}
}
});
// ==================== TESTIMONIALS SLIDER ====================
const testimonialTrack = document.getElementById('testimonialTrack');
const prevBtn = document.getElementById('prevBtn');
const nextBtn = document.getElementById('nextBtn');
const sliderDots = document.querySelectorAll('.slider-dot');
let currentSlide = 0;
let slidesToShow = 3;
let totalSlides = 5;
let autoSlideInterval;
function updateSlidesToShow() {
if (window.innerWidth < 768) {
slidesToShow = 1;
} else if (window.innerWidth < 1024) {
slidesToShow = 2;
} else {
slidesToShow = 3;
}
}
function getMaxSlide() {
return Math.max(0, totalSlides - slidesToShow);
}
function updateSlider() {
const slideWidth = 100 / slidesToShow;
testimonialTrack.style.transform = `translateX(-${currentSlide * slideWidth}%)`;
// Update dots
const maxSlide = getMaxSlide();
const dotCount = sliderDots.length;
sliderDots.forEach((dot, index) => {
dot.classList.remove('active');
dot.style.backgroundColor = '';
dot.style.width = '';
});
const activeDotIndex = maxSlide > 0 ? Math.round((currentSlide / maxSlide) * (dotCount - 1)) : 0;
sliderDots[activeDotIndex].classList.add('active');
}
function nextSlide() {
const maxSlide = getMaxSlide();
currentSlide = currentSlide >= maxSlide ? 0 : currentSlide + 1;
updateSlider();
}
function prevSlide() {
const maxSlide = getMaxSlide();
currentSlide = currentSlide <= 0 ? maxSlide : currentSlide - 1;
updateSlider();
}
function startAutoSlide() {
autoSlideInterval = setInterval(nextSlide, 5000);
}
function stopAutoSlide() {
clearInterval(autoSlideInterval);
}
nextBtn.addEventListener('click', () => {
stopAutoSlide();
nextSlide();
startAutoSlide();
});
prevBtn.addEventListener('click', () => {
stopAutoSlide();
prevSlide();
startAutoSlide();
});
// Initialize slider
updateSlidesToShow();
updateSlider();
startAutoSlide();
window.addEventListener('resize', () => {
updateSlidesToShow();
if (currentSlide > getMaxSlide()) {
currentSlide = getMaxSlide();
}
updateSlider();
});
// ==================== GALLERY LIGHTBOX ====================
const lightbox = document.getElementById('lightbox');
const lightboxImg = document.getElementById('lightboxImg');
const closeLightbox = document.getElementById('closeLightbox');
document.querySelectorAll('.gallery-item').forEach(item => {
item.addEventListener('click', () => {
const img = item.querySelector('img');
lightboxImg.src = img.src;
lightboxImg.alt = img.alt;
lightbox.classList.add('active');
document.body.style.overflow = 'hidden';
});
});
function closeLightboxFn() {
lightbox.classList.remove('active');
document.body.style.overflow = '';
}
closeLightbox.addEventListener('click', closeLightboxFn);
lightbox.addEventListener('click', (e) => {
if (e.target === lightbox) {
closeLightboxFn();
}
});
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && lightbox.classList.contains('active')) {
closeLightboxFn();
}
});
// ==================== ADD TO CART TOAST ====================
const cartToast = document.getElementById('cartToast');
document.querySelectorAll('.add-to-cart-btn').forEach(btn => {
btn.addEventListener('click', (e) => {
e.preventDefault();
// Show toast
cartToast.classList.add('cart-toast-show');
// Update cart count
const cartCount = document.querySelector('.bg-terracotta-500');
if (cartCount) {
const currentCount = parseInt(cartCount.textContent);
cartCount.textContent = currentCount + 1;
// Animate cart count
cartCount.style.transform = 'scale(1.3)';
setTimeout(() => {
cartCount.style.transform = 'scale(1)';
}, 200);
}
// Button feedback
const originalText = btn.textContent;
btn.textContent = '✓ Added';
btn.style.backgroundColor = '#E8B94E';
btn.style.color = '#2A1F14';
setTimeout(() => {
btn.textContent = originalText;
btn.style.backgroundColor = '';
btn.style.color = '';
}, 2000);
setTimeout(() => {
cartToast.classList.remove('cart-toast-show');
}, 2500);
});
});
// ==================== NEWSLETTER FORM ====================
const newsletterForm = document.getElementById('newsletterForm');
const emailInput = document.getElementById('emailInput');
const formMessage = document.getElementById('formMessage');
newsletterForm.addEventListener('submit', (e) => {
e.preventDefault();
const email = emailInput.value.trim();
if (!email) {
formMessage.textContent = 'Please enter your email address.';
formMessage.className = 'mt-4 text-sm text-terracotta-400';
formMessage.classList.remove('hidden');
return;
}
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
formMessage.textContent = 'Please enter a valid email address.';
formMessage.className = 'mt-4 text-sm text-terracotta-400';
formMessage.classList.remove('hidden');
return;
}
// Success
formMessage.textContent = '✨ Welcome to the Multani Heritage family! Check your inbox for a special surprise.';
formMessage.className = 'mt-4 text-sm text-gold-400';
formMessage.classList.remove('hidden');
emailInput.value = '';
// Hide after 5 seconds
setTimeout(() => {
formMessage.classList.add('hidden');
}, 5000);
});
// ==================== BACK TO TOP BUTTON ====================
const backToTop = document.getElementById('backToTop');
window.addEventListener('scroll', () => {
if (window.pageYOffset > 600) {
backToTop.style.opacity = '1';
backToTop.style.transform = 'translateY(0)';
} else {
backToTop.style.opacity = '0';
backToTop.style.transform = 'translateY(16px)';
}
});
backToTop.addEventListener('click', () => {
window.scrollTo({ top: 0, behavior: 'smooth' });
});
// ==================== 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' });
}
});
});
// ==================== COUNTER ANIMATION ====================
function animateCounters() {
const counters = document.querySelectorAll('[data-count]');
counters.forEach(counter => {
const target = parseInt(counter.getAttribute('data-count'));
const duration = 2000;
const step = target / (duration / 16);
let current = 0;
const timer = setInterval(() => {
current += step;
if (current >= target) {
counter.textContent = target;
clearInterval(timer);
} else {
counter.textContent = Math.floor(current);
}
}, 16);
});
}
// ==================== WISHLIST HEART TOGGLE ====================
document.querySelectorAll('.product-card button').forEach(btn => {
if (btn.querySelector('[data-lucide="heart"]')) {
btn.addEventListener('click', (e) => {
e.stopPropagation();
const icon = btn.querySelector('svg');
if (icon) {
const isFilled = icon.getAttribute('fill') !== 'none' && icon.getAttribute('fill') !== '';
if (isFilled) {
icon.setAttribute('fill', 'none');
btn.classList.remove('bg-terracotta-500');
} else {
icon.setAttribute('fill', 'currentColor');
btn.classList.add('bg-terracotta-500');
}
}
});
}
});
// ==================== TOUCH SWIPE FOR TESTIMONIALS ====================
let touchStartX = 0;
let touchEndX = 0;
const sliderEl = document.getElementById('testimonialSlider');
sliderEl.addEventListener('touchstart', (e) => {
touchStartX = e.changedTouches[0].screenX;
stopAutoSlide();
}, { passive: true });
sliderEl.addEventListener('touchend', (e) => {
touchEndX = e.changedTouches[0].screenX;
const diff = touchStartX - touchEndX;
if (Math.abs(diff) > 50) {
if (diff > 0) {
nextSlide();
} else {
prevSlide();
}
}
startAutoSlide();
}, { passive: true });
// ==================== RE-INIT LUCIDE ON DYNAMIC CHANGES ====================
setTimeout(() => {
lucide.createIcons();
}, 100);