const channelToken = new URLSearchParams(window.location.hash.slice(1)).get('channelToken'); function notify(type, payload = {}) { window.parent.postMessage({ type, token: channelToken, ...payload }, '*'); } const arena = document.getElementById('arena'); const svg = document.getElementById('pathSvg'); const banner = document.getElementById('successBanner'); const width = arena.clientWidth; const height = arena.clientHeight; svg.setAttribute('viewBox', `0 0 ${width} ${height}`); let started = false; let onPath = true; let progress = 0; const TARGET_PROGRESS = 90; notify('started'); // Create curved path const pathData = `M 50,${height/2} Q ${width/4},${height/4} ${width/2},${height/2} T ${width-50},${height/2}`; // Background path (wider, gray) const bgPath = document.createElementNS('http://www.w3.org/2000/svg', 'path'); bgPath.setAttribute('d', pathData); bgPath.setAttribute('stroke', '#e5e7eb'); bgPath.setAttribute('stroke-width', '120'); bgPath.setAttribute('fill', 'none'); bgPath.setAttribute('stroke-linecap', 'round'); svg.appendChild(bgPath); // Progress path (green) const progressPath = document.createElementNS('http://www.w3.org/2000/svg', 'path'); progressPath.setAttribute('d', pathData); progressPath.setAttribute('stroke', '#22c55e'); progressPath.setAttribute('stroke-width', '100'); progressPath.setAttribute('fill', 'none'); progressPath.setAttribute('stroke-linecap', 'round'); progressPath.setAttribute('stroke-dasharray', '1000'); progressPath.setAttribute('stroke-dashoffset', '1000'); svg.appendChild(progressPath); // Start point with pulse animation const startCircle = document.createElementNS('http://www.w3.org/2000/svg', 'circle'); startCircle.setAttribute('cx', '50'); startCircle.setAttribute('cy', height/2); startCircle.setAttribute('r', '30'); startCircle.setAttribute('fill', '#ef4444'); startCircle.setAttribute('cursor', 'pointer'); startCircle.classList.add('pulse-circle'); svg.appendChild(startCircle); // Pulse ring for extra visibility const pulseRing = document.createElementNS('http://www.w3.org/2000/svg', 'circle'); pulseRing.setAttribute('cx', '50'); pulseRing.setAttribute('cy', height/2); pulseRing.setAttribute('r', '30'); pulseRing.setAttribute('fill', 'none'); pulseRing.setAttribute('stroke', '#ef4444'); pulseRing.setAttribute('stroke-width', '3'); svg.appendChild(pulseRing); // Animate pulse ring const animatePulseRing = () => { pulseRing.innerHTML = ''; }; animatePulseRing(); // Add "Click here" text const startText = document.createElementNS('http://www.w3.org/2000/svg', 'text'); startText.setAttribute('x', '50'); startText.setAttribute('y', height/2 + 60); startText.setAttribute('text-anchor', 'middle'); startText.setAttribute('fill', '#ef4444'); startText.setAttribute('font-size', '16'); startText.setAttribute('font-weight', 'bold'); startText.textContent = 'Clique aqui'; svg.appendChild(startText); // Add click to start startCircle.addEventListener('click', () => { if (!started) { started = true; startCircle.setAttribute('fill', '#22c55e'); startCircle.classList.remove('pulse-circle'); pulseRing.remove(); // Remove o anel pulsante startText.remove(); // Remove o texto notify('running', { progress: 0 }); } }); // End point const endCircle = document.createElementNS('http://www.w3.org/2000/svg', 'circle'); endCircle.setAttribute('cx', width - 50); endCircle.setAttribute('cy', height/2); endCircle.setAttribute('r', '30'); endCircle.setAttribute('fill', '#22c55e'); svg.appendChild(endCircle); // Track mouse movement svg.addEventListener('mousemove', (e) => { if (!started) return; // Só processa se a atividade foi iniciada const rect = svg.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; // Check if on path (simplified: check distance from path) const pathLength = bgPath.getTotalLength(); let minDist = Infinity; for (let i = 0; i < pathLength; i += 10) { const point = bgPath.getPointAtLength(i); const dist = Math.sqrt((x - point.x) ** 2 + (y - point.y) ** 2); if (dist < minDist) minDist = dist; } if (minDist < 60) { // On path const progressPercent = (x / width) * 100; if (progressPercent > progress) { progress = progressPercent; const offset = 1000 - (progress / 100) * 1000; progressPath.setAttribute('stroke-dashoffset', offset); notify('running', { progress: Math.floor(progress) }); if (progress >= TARGET_PROGRESS) { finishActivity(); } } } }); function finishActivity() { arena.classList.add('hidden'); banner.classList.remove('hidden'); lucide.createIcons(); notify('success', { score: 100 }); notify('completed', { score: 100 }); }