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:
2025-07-02 11:49:22 -06:00
parent 78cdec51f5
commit 0d3ecb6e1c
94 changed files with 19491 additions and 360 deletions

View File

@@ -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