/** * Lumerel — 3D Homepage · main.js * * Responsibilities: * 1. Spline 3D scene pointer-events toggle + runtime loader * 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, choose one of three methods: * * ── Method A (HTML — recommended) ────────────────────────────────── * Open index.html → find #spline-layer → delete .spline-placeholder * → paste in: * * * * ── Method B (JavaScript runtime) ────────────────────────────────── * Call from console or your code: * window.Lumerel.loadSplineScene('https://prod.spline.design/…') * * ── Method C (Interactive scenes) ────────────────────────────────── * After scene loads, enable pointer events: * 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'; } /** * Programmatically load a Spline scene URL at runtime. * Removes the placeholder orbs and inserts a . * @param {string} url - The full Spline scene URL * @param {boolean} [interactive=false] - Enable pointer events for interactive scenes */ function loadSplineScene(url, interactive = false) { if (!splineLayer) return; // Remove placeholder if present const placeholder = splineLayer.querySelector('.spline-placeholder'); if (placeholder) placeholder.remove(); // Create and configure the viewer const viewer = document.createElement('spline-viewer'); viewer.setAttribute('url', url); viewer.setAttribute('events-target', 'global'); viewer.style.cssText = 'width:100%;height:100%;display:block;'; viewer.addEventListener('load', () => { console.log('[Lumerel] ✓ Spline scene loaded:', url); if (interactive) enableSpline(); }); splineLayer.appendChild(viewer); console.log('[Lumerel] Loading Spline scene…'); } // Auto-detect if a was placed directly in index.html 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 scene loads: // 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 once 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 — 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 gesture 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 / redirect here // Example: window.location.href = '/waitlist' console.log('[Lumerel] Waitlist button clicked.'); }); }); /* ── 5. Public API ────────────────────────────────────────────────── */ window.Lumerel = { enableSpline, disableSpline, loadSplineScene, }; console.log('[Lumerel] Ready. Use window.Lumerel.loadSplineScene(url) to add your 3D scene.');