setInterval(() => { const buttons = document.querySelectorAll('.smile-trigger:not(.ready)'); buttons.forEach(btn => { btn.classList.add('ready'); btn.addEventListener('mouseenter', triggerSmileOn); btn.addEventListener('mouseleave', triggerSmileOff); btn.addEventListener('touchstart', triggerSmileOn, {passive: true}); btn.addEventListener('touchend', triggerSmileOff, {passive: true}); btn.addEventListener('touchcancel', triggerSmileOff, {passive: true}); }); }, 1000); function updateHeadPosition(clientX, clientY) { if (!card) return; const xPct = clientX / window.innerWidth; const yPct = clientY / window.innerHeight; const rX = (0.5 - yPct) * 20; const rY = (xPct - 0.5) * 20; card.style.transform = "rotateX(" + rX + "deg) rotateY(" + rY + "deg)"; let x = xPct; let y = 1 - yPct; const s = isSmilingState ? 2.5 : 1.1; x = Math.max(0, Math.min(1, (x - 0.5) * s + 0.5)); y = Math.max(0, Math.min(1, (y - 0.5) * s + 0.5)); currentX = x; currentY = y; renderFrame(); } window.addEventListener('mousemove', (e) => { updateHeadPosition(e.clientX, e.clientY); }); window.addEventListener('touchmove', (e) => { if (e.touches && e.touches.length > 0) { updateHeadPosition(e.touches[0].clientX, e.touches[0].clientY); } }, {passive: true}); })(); </script>
setInterval(() => { const buttons = document.querySelectorAll('.smile-trigger:not(.ready)'); buttons.forEach(btn => { btn.classList.add('ready'); btn.addEventListener('mouseenter', triggerSmileOn); btn.addEventListener('mouseleave', triggerSmileOff); btn.addEventListener('touchstart', triggerSmileOn, {passive: true}); btn.addEventListener('touchend', triggerSmileOff, {passive: true}); btn.addEventListener('touchcancel', triggerSmileOff, {passive: true}); }); }, 1000); function updateHeadPosition(clientX, clientY) { if (!card) return; const xPct = clientX / window.innerWidth; const yPct = clientY / window.innerHeight; const rX = (0.5 - yPct) * 20; const rY = (xPct - 0.5) * 20; card.style.transform = "rotateX(" + rX + "deg) rotateY(" + rY + "deg)"; let x = xPct; let y = 1 - yPct; const s = isSmilingState ? 2.5 : 1.1; x = Math.max(0, Math.min(1, (x - 0.5) * s + 0.5)); y = Math.max(0, Math.min(1, (y - 0.5) * s + 0.5)); currentX = x; currentY = y; renderFrame(); } window.addEventListener('mousemove', (e) => { updateHeadPosition(e.clientX, e.clientY); }); window.addEventListener('touchmove', (e) => { if (e.touches && e.touches.length > 0) { updateHeadPosition(e.touches[0].clientX, e.touches[0].clientY); } }, {passive: true}); })(); </script>
setInterval(() => { const buttons = document.querySelectorAll('.smile-trigger:not(.ready)'); buttons.forEach(btn => { btn.classList.add('ready'); btn.addEventListener('mouseenter', triggerSmileOn); btn.addEventListener('mouseleave', triggerSmileOff); btn.addEventListener('touchstart', triggerSmileOn, {passive: true}); btn.addEventListener('touchend', triggerSmileOff, {passive: true}); btn.addEventListener('touchcancel', triggerSmileOff, {passive: true}); }); }, 1000); function updateHeadPosition(clientX, clientY) { if (!card) return; const xPct = clientX / window.innerWidth; const yPct = clientY / window.innerHeight; const rX = (0.5 - yPct) * 20; const rY = (xPct - 0.5) * 20; card.style.transform = "rotateX(" + rX + "deg) rotateY(" + rY + "deg)"; let x = xPct; let y = 1 - yPct; const s = isSmilingState ? 2.5 : 1.1; x = Math.max(0, Math.min(1, (x - 0.5) * s + 0.5)); y = Math.max(0, Math.min(1, (y - 0.5) * s + 0.5)); currentX = x; currentY = y; renderFrame(); } window.addEventListener('mousemove', (e) => { updateHeadPosition(e.clientX, e.clientY); }); window.addEventListener('touchmove', (e) => { if (e.touches && e.touches.length > 0) { updateHeadPosition(e.touches[0].clientX, e.touches[0].clientY); } }, {passive: true}); })(); </script>
setInterval(() => { const buttons = document.querySelectorAll('.smile-trigger:not(.ready)'); buttons.forEach(btn => { btn.classList.add('ready'); btn.addEventListener('mouseenter', triggerSmileOn); btn.addEventListener('mouseleave', triggerSmileOff); btn.addEventListener('touchstart', triggerSmileOn, {passive: true}); btn.addEventListener('touchend', triggerSmileOff, {passive: true}); btn.addEventListener('touchcancel', triggerSmileOff, {passive: true}); }); }, 1000); function updateHeadPosition(clientX, clientY) { if (!card) return; const xPct = clientX / window.innerWidth; const yPct = clientY / window.innerHeight; const rX = (0.5 - yPct) * 20; const rY = (xPct - 0.5) * 20; card.style.transform = "rotateX(" + rX + "deg) rotateY(" + rY + "deg)"; let x = xPct; let y = 1 - yPct; const s = isSmilingState ? 2.5 : 1.1; x = Math.max(0, Math.min(1, (x - 0.5) * s + 0.5)); y = Math.max(0, Math.min(1, (y - 0.5) * s + 0.5)); currentX = x; currentY = y; renderFrame(); } window.addEventListener('mousemove', (e) => { updateHeadPosition(e.clientX, e.clientY); }); window.addEventListener('touchmove', (e) => { if (e.touches && e.touches.length > 0) { updateHeadPosition(e.touches[0].clien
setInterval(() => { const buttons = document.querySelectorAll('.smile-trigger:not(.ready)'); buttons.forEach(btn => { btn.classList.add('ready'); btn.addEventListener('mouseenter', triggerSmileOn); btn.addEventListener('mouseleave', triggerSmileOff); btn.addEventListener('touchstart', triggerSmileOn, {passive: true}); btn.addEventListener('touchend', triggerSmileOff, {passive: true}); btn.addEventListener('touchcancel', triggerSmileOff, {passive: true}); }); }, 1000); function updateHeadPosition(clientX, clientY) { if (!card) return; const xPct = clientX / window.innerWidth; const yPct = clientY / window.innerHeight; const rX = (0.5 - yPct) * 20; const rY = (xPct - 0.5) * 20; card.style.transform = "rotateX(" + rX + "deg) rotateY(" + rY + "deg)"; let x = xPct; let y = 1 - yPct; const s = isSmilingState ? 2.5 : 1.1; x = Math.max(0, Math.min(1, (x - 0.5) * s + 0.5)); y = Math.max(0, Math.min(1, (y - 0.5) * s + 0.5)); currentX = x; currentY = y; renderFrame(); } window.addEventListener('mousemove', (e) => { updateHeadPosition(e.clientX, e.clientY); }); window.addEventListener('touchmove', (e) => { if (e.touches && e.touches.length > 0) { updateHeadPosition(e.touches[0].clientX, e.touches[0].clientY); } }, {passive: true}); })(); </script>
setInterval(() => { const buttons = document.querySelectorAll('.smile-trigger:not(.ready)'); buttons.forEach(btn => { btn.classList.add('ready'); btn.addEventListener('mouseenter', triggerSmileOn); btn.addEventListener('mouseleave', triggerSmileOff); btn.addEventListener('touchstart', triggerSmileOn, {passive: true}); btn.addEventListener('touchend', triggerSmileOff, {passive: true}); btn.addEventListener('touchcancel', triggerSmileOff, {passive: true}); }); }, 1000); function updateHeadPosition(clientX, clientY) { if (!card) return; const xPct = clientX / window.innerWidth; const yPct = clientY / window.innerHeight; const rX = (0.5 - yPct) * 20; const rY = (xPct - 0.5) * 20; card.style.transform = "rotateX(" + rX + "deg) rotateY(" + rY + "deg)"; let x = xPct; let y = 1 - yPct; const s = isSmilingState ? 2.5 : 1.1; x = Math.max(0, Math.min(1, (x - 0.5) * s + 0.5)); y = Math.max(0, Math.min(1, (y - 0.5) * s + 0.5)); currentX = x; currentY = y; renderFrame(); } window.addEventListener('mousemove', (e) => { updateHeadPosition(e.clientX, e.clientY); }); window.addEventListener('touchmove', (e) => { if (e.touches && e.touches.length > 0) { updateHeadPosition(e.touches[0].clientX, e.touches[0].clientY); } }, {passive: true}); })(); </script>
setInterval(() => { const buttons = document.querySelectorAll('.smile-trigger:not(.ready)'); buttons.forEach(btn => { btn.classList.add('ready'); btn.addEventListener('mouseenter', triggerSmileOn); btn.addEventListener('mouseleave', triggerSmileOff); btn.addEventListener('touchstart', triggerSmileOn, {passive: true}); btn.addEventListener('touchend', triggerSmileOff, {passive: true}); btn.addEventListener('touchcancel', triggerSmileOff, {passive: true}); }); }, 1000); function updateHeadPosition(clientX, clientY) { if (!card) return; const xPct = clientX / window.innerWidth; const yPct = clientY / window.innerHeight; const rX = (0.5 - yPct) * 20; const rY = (xPct - 0.5) * 20; card.style.transform = "rotateX(" + rX + "deg) rotateY(" + rY + "deg)"; let x = xPct; let y = 1 - yPct; const s = isSmilingState ? 2.5 : 1.1; x = Math.max(0, Math.min(1, (x - 0.5) * s + 0.5)); y = Math.max(0, Math.min(1, (y - 0.5) * s + 0.5)); currentX = x; currentY = y; renderFrame(); } window.addEventListener('mousemove', (e) => { updateHeadPosition(e.clientX, e.clientY); }); window.addEventListener('touchmove', (e) => { if (e.touches && e.touches.length > 0) { updateHeadPosition(e.touches[0].clientX, e.touches[0].clientY); } }, {passive: true}); })(); </script>
setInterval(() => { const buttons = document.querySelectorAll('.smile-trigger:not(.ready)'); buttons.forEach(btn => { btn.classList.add('ready'); btn.addEventListener('mouseenter', triggerSmileOn); btn.addEventListener('mouseleave', triggerSmileOff); btn.addEventListener('touchstart', triggerSmileOn, {passive: true}); btn.addEventListener('touchend', triggerSmileOff, {passive: true}); btn.addEventListener('touchcancel', triggerSmileOff, {passive: true}); }); }, 1000); function updateHeadPosition(clientX, clientY) { if (!card) return; const xPct = clientX / window.innerWidth; const yPct = clientY / window.innerHeight; const rX = (0.5 - yPct) * 20; const rY = (xPct - 0.5) * 20; card.style.transform = "rotateX(" + rX + "deg) rotateY(" + rY + "deg)"; let x = xPct; let y = 1 - yPct; const s = isSmilingState ? 2.5 : 1.1; x = Math.max(0, Math.min(1, (x - 0.5) * s + 0.5)); y = Math.max(0, Math.min(1, (y - 0.5) * s + 0.5)); currentX = x; currentY = y; renderFrame(); } window.addEventListener('mousemove', (e) => { updateHeadPosition(e.clientX, e.clientY); }); window.addEventListener('touchmove', (e) => { if (e.touches && e.touches.length > 0) { updateHeadPosition(e.touches[0].clientX, e.touches[0].clientY); } }, {passive: true}); })(); </script>