/**
* Lumerel — 3D Homepage · main.js
*
* Responsibilities:
* 1. Spline 3D scene pointer-events toggle
* 2. Navbar scroll backdrop blur
* 3. Background video autoplay fallback (iOS Safari)
* 4. Waitlist button click hooks
*/
/* ── 1. Spline / 3D Layer Integration ────────────────────────
*
* When your Spline scene is ready:
*
* A) Open index.html and find the .hero__3d-placeholder div.
* B) Delete that entire div.
* C) In its place, paste:
*
*
*
* D) If the scene needs mouse/touch interaction, call:
* window.Lumerel.enableSpline()
*
* The web component is already loaded via CDN
* in the of index.html — no extra imports needed.
*
─────────────────────────────────────────────────────────── */
const splineLayer = document.getElementById('spline-layer');
/** Allow pointer events on the 3D layer (for interactive Spline scenes). */
function enableSpline() {
if (splineLayer) splineLayer.style.pointerEvents = 'auto';
}
/** Block pointer events on the 3D layer (default — keeps UI clickable). */
function disableSpline() {
if (splineLayer) splineLayer.style.pointerEvents = 'none';
}
// Auto-detect spline-viewer load and log confirmation
if (splineLayer) {
const viewer = splineLayer.querySelector('spline-viewer');
if (viewer) {
viewer.addEventListener('load', () => {
console.log('[Lumerel] ✓ Spline scene loaded.');
// Uncomment to enable 3D mouse interaction after load:
// enableSpline();
});
}
}
/* ── 2. Navbar Scroll Backdrop ───────────────────────────── */
const navbar = document.querySelector('.navbar');
function updateNavbar() {
if (!navbar) return;
if (window.scrollY > 24) {
navbar.style.background = 'rgba(0, 0, 0, 0.45)';
navbar.style.backdropFilter = 'blur(16px)';
navbar.style.webkitBackdropFilter = 'blur(16px)';
} else {
navbar.style.background = 'transparent';
navbar.style.backdropFilter = 'none';
navbar.style.webkitBackdropFilter = 'none';
}
}
window.addEventListener('scroll', updateNavbar, { passive: true });
updateNavbar(); // run on load
/* ── 3. Background Video Fallback ────────────────────────── */
const heroVideo = document.querySelector('.hero__video');
if (heroVideo) {
// Gradient fallback if video fails to load
heroVideo.addEventListener('error', () => {
console.warn('[Lumerel] Background video failed to load — using gradient fallback.');
const wrap = document.querySelector('.hero__video-wrap');
if (wrap) {
wrap.style.background = 'linear-gradient(135deg, #0a0a0a 0%, #111 100%)';
}
});
// iOS Safari sometimes requires a user interaction to trigger autoplay
document.addEventListener('touchstart', () => {
if (heroVideo.paused) heroVideo.play().catch(() => {});
}, { once: true });
}
/* ── 4. Waitlist Button Hooks ────────────────────────────── */
document.querySelectorAll('.btn-pill').forEach(btn => {
btn.addEventListener('click', () => {
// TODO: wire up your waitlist modal, form, or redirect here
console.log('[Lumerel] Join Waitlist clicked.');
// Examples:
// openWaitlistModal();
// window.location.href = '/waitlist';
});
});
/* ── Global API ──────────────────────────────────────────── */
window.Lumerel = {
enableSpline,
disableSpline,
};