This website uses cookies to enhance the user experience.

if (hasGyro) { const gyroTiltFactor = 15; // Adjust for sensitivity const gyroRotateY = gyroInput.x * gyroTiltFactor; const gyroRotateX = -gyroInput.y * gyroTiltFactor; // Pitch is often inverted for natural feel const gyroPerspectiveTransform = `perspective(1500px) rotateY(${gyroRotateY}deg) rotateX(${gyroRotateX}deg)`; const activeModalWrapper = document.querySelector('.modal.active .modal-content-wrapper'); if (activeModalWrapper) { activeModalWrapper.style.transform = `${gyroPerspectiveTransform} scale(1)`; } const activeNeuronPopup = document.querySelector('.neuron-popup.active'); if (activeNeuronPopup) { activeNeuronPopup.style.transform = `${gyroPerspectiveTransform} scale(1) translate(-50%, -50%)`; } } // If !hasGyro, the mousemove event will call handleMouseMoveEffect to apply tilt. checkIntersections(); activeDataLabels.forEach(label => { const elapsed = now - label.startTime; const life = elapsed / label.duration; if (life >= 1) { scene.remove(label.line); label.div.remove(); label.toBeRemoved = true; return; } const scrambleDuration = 700; if (now - label.creationTime < scrambleDuration) { label.div.textContent = generateRandomHexString(label.finalText.length); } else { label.div.textContent = label.finalText; } const opacity = Math.min(life / 0.15, (1 - life) / 0.15); label.div.style.opacity = opacity; label.line.material.opacity = opacity; const screenPos = label.anchor.clone().project(camera); label.div.style.left = `${(screenPos.x * 0.5 + 0.5) * window.innerWidth}px`; label.div.style.top = `${(-screenPos.y * 0.5 + 0.5) * window.innerHeight}px`; }); activeDataLabels = activeDataLabels.filter(label => !label.toBeRemoved); composer.render(); } // --- Initialization --- window.addEventListener('resize', onWindowResize, false); document.addEventListener('pointermove', updatePointerPosition); document.addEventListener('pointermove', handleMouseMoveEffect); // Added listener for mouse-based tilt document.addEventListener('pointerdown', onPointerDown); document.addEventListener('touchstart', (e) => { updatePointerPosition(e); onPointerDown(e); }, {passive: false}); init(); loadInitialData(); animate(); setupControls(); setupModalTriggers(); setupMusicTabs(); setupMasteringForm(); setupGdprToast(); setupMainPlayerControls(); updateToggleButtonIcons(); // Hide loader when page is fully loaded window.addEventListener('load', () => { const loader = document.getElementById('page-loader'); if (loader) { loader.classList.add('hidden-loader'); } });