Initial AI-generated site
This commit is contained in:
@@ -0,0 +1,153 @@
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
// Check for reduced motion preference
|
||||
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
||||
|
||||
// Reveal on scroll
|
||||
function initRevealOnScroll() {
|
||||
if (prefersReducedMotion) {
|
||||
// If reduced motion is preferred, show all elements immediately
|
||||
document.querySelectorAll('.reveal').forEach(el => {
|
||||
el.classList.add('revealed');
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
const revealElements = document.querySelectorAll('.reveal');
|
||||
|
||||
const observerOptions = {
|
||||
root: null,
|
||||
rootMargin: '0px 0px -10% 0px',
|
||||
threshold: 0.1
|
||||
};
|
||||
|
||||
const observer = new IntersectionObserver((entries) => {
|
||||
entries.forEach(entry => {
|
||||
if (entry.isIntersecting) {
|
||||
entry.target.classList.add('revealed');
|
||||
observer.unobserve(entry.target);
|
||||
}
|
||||
});
|
||||
}, observerOptions);
|
||||
|
||||
revealElements.forEach(el => observer.observe(el));
|
||||
}
|
||||
|
||||
// Smooth scroll for anchor links
|
||||
function initSmoothScroll() {
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener('click', function(e) {
|
||||
const targetId = this.getAttribute('href');
|
||||
if (targetId === '#') return;
|
||||
|
||||
const targetElement = document.querySelector(targetId);
|
||||
if (!targetElement) return;
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
targetElement.scrollIntoView({
|
||||
behavior: prefersReducedMotion ? 'auto' : 'smooth',
|
||||
block: 'start'
|
||||
});
|
||||
|
||||
// Update focus for accessibility
|
||||
targetElement.setAttribute('tabindex', '-1');
|
||||
targetElement.focus();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Header background on scroll
|
||||
function initHeaderScroll() {
|
||||
const header = document.querySelector('.site-header');
|
||||
if (!header) return;
|
||||
|
||||
let ticking = false;
|
||||
|
||||
function updateHeader() {
|
||||
const scrollY = window.scrollY;
|
||||
|
||||
if (scrollY > 100) {
|
||||
header.style.background = 'rgba(245, 240, 232, 0.95)';
|
||||
header.style.backdropFilter = 'blur(10px)';
|
||||
header.style.boxShadow = '0 2px 20px rgba(139, 109, 76, 0.1)';
|
||||
} else {
|
||||
header.style.background = 'linear-gradient(to bottom, var(--color-cream) 0%, rgba(245, 240, 232, 0) 100%)';
|
||||
header.style.backdropFilter = 'none';
|
||||
header.style.boxShadow = 'none';
|
||||
}
|
||||
|
||||
ticking = false;
|
||||
}
|
||||
|
||||
window.addEventListener('scroll', () => {
|
||||
if (!ticking) {
|
||||
requestAnimationFrame(updateHeader);
|
||||
ticking = true;
|
||||
}
|
||||
}, { passive: true });
|
||||
}
|
||||
|
||||
// Parallax effect for hero shapes
|
||||
function initParallax() {
|
||||
if (prefersReducedMotion) return;
|
||||
|
||||
const shapes = document.querySelectorAll('.floating-shape');
|
||||
if (!shapes.length) return;
|
||||
|
||||
let ticking = false;
|
||||
|
||||
function updateParallax() {
|
||||
const scrollY = window.scrollY;
|
||||
const windowHeight = window.innerHeight;
|
||||
|
||||
if (scrollY < windowHeight) {
|
||||
shapes.forEach((shape, index) => {
|
||||
const speed = 0.1 + (index * 0.05);
|
||||
const yOffset = scrollY * speed;
|
||||
shape.style.transform = `translateY(${yOffset}px)`;
|
||||
});
|
||||
}
|
||||
|
||||
ticking = false;
|
||||
}
|
||||
|
||||
window.addEventListener('scroll', () => {
|
||||
if (!ticking) {
|
||||
requestAnimationFrame(updateParallax);
|
||||
ticking = true;
|
||||
}
|
||||
}, { passive: true });
|
||||
}
|
||||
|
||||
// Badge rotation pause on hover
|
||||
function initBadgeInteraction() {
|
||||
const badge = document.querySelector('.hero-badge');
|
||||
if (!badge) return;
|
||||
|
||||
badge.addEventListener('mouseenter', () => {
|
||||
badge.style.animationPlayState = 'paused';
|
||||
});
|
||||
|
||||
badge.addEventListener('mouseleave', () => {
|
||||
badge.style.animationPlayState = 'running';
|
||||
});
|
||||
}
|
||||
|
||||
// Initialize all
|
||||
function init() {
|
||||
initRevealOnScroll();
|
||||
initSmoothScroll();
|
||||
initHeaderScroll();
|
||||
initParallax();
|
||||
initBadgeInteraction();
|
||||
}
|
||||
|
||||
// Run on DOM ready
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', init);
|
||||
} else {
|
||||
init();
|
||||
}
|
||||
})();
|
||||
Reference in New Issue
Block a user