Reveal Math Student Tool

Evidence Studio

Pick a lesson, study the model, then write a clear claim with evidence, reasoning, and a reflection.

Classroom Home

Model Inspector

Model

What to Look For

    What mathematical idea can you state from this lesson?

    What numbers, labels, model parts, or patterns support it?

    Explain how the evidence proves or supports your claim.

    What do you understand better, or what question remains?

    Finish

    " + ""; var blob = new Blob(["\ufeff" + docHtml], { type: "application/msword", }); var url = URL.createObjectURL(blob); var a = document.createElement("a"); a.href = url; a.download = "Math_CER_Blueprint_" + normalizeId(lessonNumber(state.lesson)) + "_" + new Date().toISOString().slice(0, 10) + ".doc"; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); setStatus("Lesson blueprint document generated successfully!"); } function setStatus(message) { els.status.textContent = message; if (message) { window.clearTimeout(setStatus.timer); setStatus.timer = window.setTimeout(function () { els.status.textContent = ""; }, 3500); } } // Sidebar parallax: the lesson picker drifts slightly as the page // scrolls while main content stays put. Transform-only, rAF-coalesced. function setupSidebarParallax() { var sidebar = document.querySelector(".selector"); if (!sidebar) return; var ticking = false; function update() { ticking = false; if (prefersReducedMotion()) { sidebar.style.transform = ""; return; } // Cap the drift so the sticky panel never leaves its column. var drift = Math.max(-14, Math.min(14, window.scrollY * 0.035)); sidebar.style.transform = "translate3d(0, " + drift + "px, 0)"; } window.addEventListener( "scroll", function () { if (ticking) return; ticking = true; window.requestAnimationFrame(update); }, { passive: true }, ); update(); } // Form polish: focus pulse + label scale, plus a typing indicator on // the three CER fields and a one-shot success glow on final submit. var typingTimers = {}; function setupFormPolish() { var fields = [els.claim, els.evidence, els.reasoning, els.reflection]; fields.forEach(function (field) { if (!field) return; var card = field.closest(".field-card"); if (!card) return; field.addEventListener("focus", function () { card.classList.add("is-focused"); }); field.addEventListener("blur", function () { card.classList.remove("is-focused"); }); }); // Typing indicator on Claim / Evidence / Reasoning. [els.claim, els.evidence, els.reasoning].forEach(function (field) { if (!field) return; var card = field.closest(".field-card"); if (!card || !card.querySelector(".typing-dot")) return; var key = field.id; field.addEventListener("input", function () { card.classList.add("is-typing"); window.clearTimeout(typingTimers[key]); typingTimers[key] = window.setTimeout(function () { card.classList.remove("is-typing"); }, 900); }); }); } function flashSubmitGlow() { var status = els.status; if (!status || prefersReducedMotion()) return; status.classList.remove("submit-glow"); void status.offsetWidth; status.classList.add("submit-glow"); window.clearTimeout(flashSubmitGlow.timer); flashSubmitGlow.timer = window.setTimeout(function () { status.classList.remove("submit-glow"); }, 1500); } function init() { state.lessons = asArray(window.REVEAL_MATH_LESSONS); state.units = asArray(window.REVEAL_MATH_UNITS); state.clusters = asArray(window.REVEAL_MATH_CLUSTERS); state.lessons.sort(function (a, b) { return lessonNumber(a).localeCompare(lessonNumber(b), undefined, { numeric: true, sensitivity: "base", }); }); renderLessonPicker(); els.lessonSelect.addEventListener("change", function () { setLesson(Number(els.lessonSelect.value)); }); els.saveDraft.addEventListener("click", function () { saveDraft(true); flashSubmitGlow(); }); els.downloadDocx.addEventListener("click", function () { downloadWordBlueprint(); flashSubmitGlow(); }); els.copyCard.addEventListener("click", copyCard); els.printCard.addEventListener("click", function () { saveDraft(false); window.print(); }); els.clearDraft.addEventListener("click", clearDraft); els.form.addEventListener("input", function () { saveDraft(false); }); setupSidebarParallax(); setupFormPolish(); } init(); })();