function showProblem() { const problemEl = document.getElementById("problem"); const stepsEl = document.getElementById("equation"); const formatted = formatMath(problemData.problem); problemEl.innerHTML = `\\(${formatted}\\)`; stepsEl.innerHTML = ""; MathJax.typesetPromise(); } function showStep() { if (stepIndex >= problemData.steps.length) { setTimeout(requestNextProblem, 3000); return; } const eqEl = document.getElementById("equation"); const expEl = document.getElementById("explanation"); const step = problemData.steps[stepIndex]; expEl.innerHTML = step.step; // STEP 1: fade out eqEl.classList.remove("fade-in"); eqEl.classList.add("fade-out"); setTimeout(() => { // STEP 2: update content eqEl.innerHTML = `\\(${formatMath(step.after)}\\)`; MathJax.typesetPromise(); // STEP 3: force reflow (CRUCIAL) void eqEl.offsetWidth; // STEP 4: fade back in eqEl.classList.remove("fade-out"); eqEl.classList.add("fade-in"); stepIndex++; setTimeout(showStep, 2000); }, 500); } function startSteps() { stepIndex = 0; showStep(); } function startSequence() { setTimeout(() => { showNextStep(); }, 3000); // thinking time } function showNextStep() { const stepsEl = document.getElementById("steps"); if (stepIndex >= problemData.steps.length) { // finished → request next problem setTimeout(() => { requestNextProblem(); }, 3000); return; } const s = problemData.steps[stepIndex]; const formatted_step_before = formatMath(s.before); const formatted_step_after = formatMath(s.after); const html = `