=total&&total>0){var pillsWrap=bar.querySelector('.engagement-progress-pills');pillsWrap.classList.remove('is-complete');void pillsWrap.offsetWidth;pillsWrap.classList.add('is-complete');}}
function injectPrediction(blockEl,pred){var output=blockEl.querySelector('.webr-output');if(!output)return;if(output.querySelector('.engagement-prediction'))return;var wrap=document.createElement('div');wrap.className='engagement-prediction';wrap.setAttribute('aria-hidden','true');var badge=document.createElement('span');badge.className='engagement-prediction-badge';badge.textContent=pred.type;var content=document.createElement('div');content.className='engagement-prediction-content';if(pred.kind==='svg')content.innerHTML=pred.content;else content.textContent=pred.content;var hint=document.createElement('div');hint.className='engagement-prediction-hint';hint.textContent='Guess, then reveal';wrap.appendChild(badge);wrap.appendChild(content);wrap.appendChild(hint);output.appendChild(wrap);}
function revealPrediction(blockEl){var wrap=blockEl.querySelector('.engagement-prediction');if(!wrap)return;wrap.classList.add('is-revealing');setTimeout(function(){if(wrap.parentNode)wrap.parentNode.removeChild(wrap);},400);}
function buildCompletionCard(total){var card=document.createElement('div');card.className='engagement-completion';card.setAttribute('role','status');card.setAttribute('aria-live','polite');var h1El=document.querySelector('#content h1')||document.querySelector('h1');var h1Text=(h1El&&h1El.textContent?h1El.textContent:'this tutorial').trim();var next=discoverNextTutorial();var ctaHtml=next?''
+'Continue with '+escapeHtml(next.title)+''
+'\u2192':'';card.innerHTML=''+'Tutorial Complete
'+'You finished '+escapeHtml(h1Text)+'
'+''+total+' blocks run · Great work
'+
ctaHtml;card.querySelector('.engagement-completion-dismiss').addEventListener('click',function(){card.classList.remove('is-visible');setTimeout(function(){if(card.parentNode)card.parentNode.removeChild(card);},450);});return card;}
function init(){var blocks=getVisibleBlocks();var total=blocks.length;if(total===0)return;var state=STORAGE.load();var ranIndices=state.ran.filter(function(i){return i=total)return;if(ranMap[idx])return;if(seenPredictions[idx])return;injectPrediction(blocks[idx],PREDICTIONS[idx]);});var outputIndex=new WeakMap();var outputs=[];for(var oi=0;oi=0&&!seenPredictions[blockIdx]){seenPredictions[blockIdx]=true;persist();}},true);function persist(){var ranList=[];Object.keys(ranMap).forEach(function(k){ranList.push(Number(k));});var seenList=[];Object.keys(seenPredictions).forEach(function(k){seenList.push(Number(k));});STORAGE.save({ran:ranList,predictionsSeen:seenList,celebrated:state.celebrated});}
function markRun(idx){if(ranMap[idx])return;ranMap[idx]=true;var ranList=[];Object.keys(ranMap).forEach(function(k){ranList.push(Number(k));});persist();updateProgressBar(bar,ranList,total,idx);if(ranList.length>=total&&!state.celebrated){state.celebrated=true;persist();showCompletion(total);}}
function showCompletion(total){var card=buildCompletionCard(total);document.body.appendChild(card);requestAnimationFrame(function(){requestAnimationFrame(function(){card.classList.add('is-visible');});});}}
function scheduleInit(){if(window.requestIdleCallback){requestIdleCallback(init,{timeout:2000});}else{setTimeout(init,200);}}
if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',scheduleInit);}else{scheduleInit();}})();