a tonne of improvements! We got maps updaTed, a tonne of documentaiton done, and several small upgrades to hook logic and other things. Fixed the looping problem for mkdocs and claude is not integrated with coder; if people wanna have a ai anyway
This commit is contained in:
@@ -68,8 +68,8 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
});
|
||||
}, observerOptions);
|
||||
|
||||
// Observe all grid cards
|
||||
document.querySelectorAll('.grid-card').forEach((card, index) => {
|
||||
// Observe all grid cards (exclude site-card and stat-card which have their own observer)
|
||||
document.querySelectorAll('.grid-card:not(.site-card):not(.stat-card)').forEach((card, index) => {
|
||||
card.style.opacity = '0';
|
||||
card.style.transform = 'translateY(20px)';
|
||||
card.style.transition = 'opacity 0.5s ease, transform 0.5s ease';
|
||||
@@ -109,7 +109,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
});
|
||||
});
|
||||
|
||||
// Animated counter for stats
|
||||
// Animated counter for hero stats (the smaller stat grid)
|
||||
const animateValue = (element, start, end, duration) => {
|
||||
const range = end - start;
|
||||
const increment = range / (duration / 16);
|
||||
@@ -125,8 +125,8 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
}, 16);
|
||||
};
|
||||
|
||||
// Animate stat numbers on scroll
|
||||
const statObserver = new IntersectionObserver((entries) => {
|
||||
// Animate hero stat numbers on scroll (only for .stat-item, not .stat-card)
|
||||
const heroStatObserver = new IntersectionObserver((entries) => {
|
||||
entries.forEach(entry => {
|
||||
if (entry.isIntersecting) {
|
||||
const statNumber = entry.target.querySelector('.stat-number');
|
||||
@@ -138,13 +138,129 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
animateValue(statNumber, 0, value, 1000);
|
||||
}
|
||||
}
|
||||
statObserver.unobserve(entry.target);
|
||||
heroStatObserver.unobserve(entry.target);
|
||||
}
|
||||
});
|
||||
}, observerOptions);
|
||||
|
||||
document.querySelectorAll('.stat-item').forEach(stat => {
|
||||
statObserver.observe(stat);
|
||||
heroStatObserver.observe(stat);
|
||||
});
|
||||
|
||||
// Animated counter for proof stats - improved version
|
||||
const proofStatObserver = new IntersectionObserver((entries) => {
|
||||
entries.forEach(entry => {
|
||||
if (entry.isIntersecting) {
|
||||
const statCard = entry.target;
|
||||
const counter = statCard.querySelector('.stat-counter');
|
||||
const statValue = statCard.getAttribute('data-stat');
|
||||
|
||||
if (counter && statValue && !counter.hasAttribute('data-animated')) {
|
||||
counter.setAttribute('data-animated', 'true');
|
||||
|
||||
// Add counting class for visual effect
|
||||
counter.classList.add('counting');
|
||||
|
||||
// Special handling for different stat types
|
||||
if (statValue === '1') {
|
||||
// AI Ready - just animate the text
|
||||
counter.style.opacity = '0';
|
||||
counter.style.transform = 'scale(0.5)';
|
||||
setTimeout(() => {
|
||||
counter.style.transition = 'all 0.8s ease';
|
||||
counter.style.opacity = '1';
|
||||
counter.style.transform = 'scale(1)';
|
||||
}, 200);
|
||||
} else if (statValue === '30' || statValue === '2') {
|
||||
// Time values like "30min", "2hr"
|
||||
const originalText = counter.textContent;
|
||||
counter.textContent = '0';
|
||||
counter.style.opacity = '0';
|
||||
setTimeout(() => {
|
||||
counter.style.transition = 'all 0.8s ease';
|
||||
counter.style.opacity = '1';
|
||||
counter.textContent = originalText;
|
||||
}, 200);
|
||||
} else {
|
||||
// Numeric values - animate the counting
|
||||
const value = parseInt(statValue);
|
||||
const originalText = counter.textContent;
|
||||
counter.textContent = '0';
|
||||
|
||||
// Simple counting animation
|
||||
let current = 0;
|
||||
const increment = value / 30; // 30 steps
|
||||
const timer = setInterval(() => {
|
||||
current += increment;
|
||||
if (current >= value) {
|
||||
current = value;
|
||||
clearInterval(timer);
|
||||
// Restore original formatted text
|
||||
setTimeout(() => {
|
||||
counter.textContent = originalText;
|
||||
}, 200);
|
||||
} else {
|
||||
counter.textContent = Math.floor(current).toLocaleString();
|
||||
}
|
||||
}, 50);
|
||||
}
|
||||
}
|
||||
proofStatObserver.unobserve(entry.target);
|
||||
}
|
||||
});
|
||||
}, {
|
||||
threshold: 0.3,
|
||||
rootMargin: '0px 0px -20px 0px'
|
||||
});
|
||||
|
||||
// Observe proof stat cards (only those with data-stat attribute)
|
||||
document.querySelectorAll('.stat-card[data-stat]').forEach(stat => {
|
||||
proofStatObserver.observe(stat);
|
||||
});
|
||||
|
||||
// Site card hover effects
|
||||
document.querySelectorAll('.site-card').forEach(card => {
|
||||
card.addEventListener('mouseenter', function() {
|
||||
const icon = this.querySelector('.site-icon');
|
||||
if (icon) {
|
||||
icon.style.animation = 'none';
|
||||
setTimeout(() => {
|
||||
icon.style.animation = 'site-float 3s ease-in-out infinite';
|
||||
}, 10);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Staggered animation for proof cards - improved
|
||||
const proofCardObserver = new IntersectionObserver((entries) => {
|
||||
entries.forEach((entry) => {
|
||||
if (entry.isIntersecting) {
|
||||
const container = entry.target.closest('.sites-grid, .stats-grid');
|
||||
if (container) {
|
||||
const allCards = Array.from(container.children);
|
||||
const index = allCards.indexOf(entry.target);
|
||||
|
||||
setTimeout(() => {
|
||||
entry.target.style.opacity = '1';
|
||||
entry.target.style.transform = 'translateY(0)';
|
||||
}, index * 150); // Slightly longer delay for better effect
|
||||
}
|
||||
|
||||
proofCardObserver.unobserve(entry.target);
|
||||
}
|
||||
});
|
||||
}, {
|
||||
threshold: 0.2,
|
||||
rootMargin: '0px 0px -30px 0px'
|
||||
});
|
||||
|
||||
// Observe site cards and stat cards for stagger animation
|
||||
document.querySelectorAll('.site-card, .stat-card').forEach((card) => {
|
||||
// Set initial state
|
||||
card.style.opacity = '0';
|
||||
card.style.transform = 'translateY(30px)';
|
||||
card.style.transition = 'opacity 0.8s ease, transform 0.8s ease';
|
||||
proofCardObserver.observe(card);
|
||||
});
|
||||
|
||||
// Add parallax effect to hero section
|
||||
|
||||
Reference in New Issue
Block a user