160 lines
5.5 KiB
JavaScript
160 lines
5.5 KiB
JavaScript
// Smooth scroll to section, ensuring title is visible
|
|
function scrollToSection(sectionId, e) {
|
|
const section = document.getElementById(sectionId);
|
|
if (!section) return;
|
|
|
|
e.preventDefault();
|
|
|
|
// Get header height for offset
|
|
const header = document.querySelector('.header');
|
|
const headerHeight = header ? header.offsetHeight : 0;
|
|
const padding = 40; // Extra padding to ensure title is fully visible
|
|
|
|
// Calculate position to show section with title visible
|
|
const sectionRect = section.getBoundingClientRect();
|
|
const sectionTop = sectionRect.top + window.pageYOffset;
|
|
const viewportHeight = window.innerHeight;
|
|
|
|
// Scroll to position that shows the section title with proper spacing
|
|
// Position section so it starts below header with padding
|
|
const scrollPosition = sectionTop - headerHeight - padding;
|
|
|
|
// Smooth scroll to position
|
|
window.scrollTo({
|
|
top: Math.max(0, scrollPosition),
|
|
behavior: 'smooth'
|
|
});
|
|
}
|
|
|
|
// Smooth scroll to waitlist section, centered on page
|
|
function scrollToWaitlist(e) {
|
|
scrollToSection('waitlist', e);
|
|
}
|
|
|
|
// Loading screen handler
|
|
function initLoadingScreen() {
|
|
const loadingScreen = document.getElementById('loading-screen');
|
|
if (!loadingScreen) return;
|
|
|
|
const skipButton = document.getElementById('skip-loading');
|
|
if (skipButton) {
|
|
skipButton.addEventListener('click', function() {
|
|
loadingScreen.classList.add('hidden');
|
|
setTimeout(function() {
|
|
loadingScreen.remove();
|
|
}, 1200);
|
|
});
|
|
}
|
|
|
|
// Wait for page to fully load
|
|
window.addEventListener('load', function() {
|
|
// Add delay to allow title animation to complete (6s zoom + 4s title = ~6s total)
|
|
setTimeout(function() {
|
|
loadingScreen.classList.add('hidden');
|
|
// Remove from DOM after transition completes
|
|
setTimeout(function() {
|
|
loadingScreen.remove();
|
|
}, 1200);
|
|
}, 6500); // Wait for animations to complete
|
|
});
|
|
}
|
|
|
|
// Waitlist form submission handler and scroll setup
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
// Initialize loading screen
|
|
initLoadingScreen();
|
|
|
|
// Set up scroll handlers for all anchor links
|
|
const waitlistLinks = document.querySelectorAll('a[href="#waitlist"]');
|
|
waitlistLinks.forEach(link => {
|
|
link.addEventListener('click', scrollToWaitlist);
|
|
});
|
|
|
|
const scheduleLinks = document.querySelectorAll('a[href="#schedule"]');
|
|
scheduleLinks.forEach(link => {
|
|
link.addEventListener('click', (e) => scrollToSection('schedule', e));
|
|
});
|
|
|
|
const form = document.getElementById('waitlist-form');
|
|
const emailInput = document.getElementById('waitlist-email');
|
|
const nameInput = document.getElementById('waitlist-name');
|
|
const involvementInput = document.getElementById('waitlist-involvement');
|
|
const messageDiv = document.getElementById('waitlist-message');
|
|
const submitButton = form.querySelector('button[type="submit"]');
|
|
|
|
if (!form) return;
|
|
|
|
form.addEventListener('submit', async function(e) {
|
|
e.preventDefault();
|
|
|
|
// Disable form during submission
|
|
submitButton.disabled = true;
|
|
submitButton.textContent = 'Submitting...';
|
|
messageDiv.textContent = '';
|
|
messageDiv.className = 'waitlist-message';
|
|
|
|
const email = emailInput.value.trim();
|
|
const name = nameInput.value.trim();
|
|
|
|
// Basic email validation
|
|
if (!email || !email.includes('@')) {
|
|
showMessage('Please enter a valid email address.', 'error');
|
|
submitButton.disabled = false;
|
|
submitButton.textContent = 'Submit';
|
|
return;
|
|
}
|
|
|
|
// Name is now required
|
|
if (!name || name.trim() === '') {
|
|
showMessage('Please enter your name.', 'error');
|
|
submitButton.disabled = false;
|
|
submitButton.textContent = 'Submit';
|
|
return;
|
|
}
|
|
|
|
const involvement = involvementInput.value.trim();
|
|
|
|
// Involvement is required
|
|
if (!involvement || involvement === '') {
|
|
showMessage('Please describe your desired involvement.', 'error');
|
|
submitButton.disabled = false;
|
|
submitButton.textContent = 'Submit';
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const response = await fetch('/api/waitlist', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({ email, name, involvement }),
|
|
});
|
|
|
|
const data = await response.json();
|
|
|
|
if (response.ok && data.success) {
|
|
showMessage('Thank you! Your information has been submitted.', 'success');
|
|
form.reset();
|
|
} else {
|
|
showMessage(data.error || 'Something went wrong. Please try again.', 'error');
|
|
}
|
|
} catch (error) {
|
|
console.error('Error submitting form:', error);
|
|
showMessage('Network error. Please check your connection and try again.', 'error');
|
|
} finally {
|
|
submitButton.disabled = false;
|
|
submitButton.textContent = 'Submit';
|
|
}
|
|
});
|
|
|
|
function showMessage(message, type) {
|
|
messageDiv.textContent = message;
|
|
messageDiv.className = `waitlist-message ${type}`;
|
|
|
|
// Scroll message into view if needed
|
|
messageDiv.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
|
}
|
|
});
|
|
|