File Ingestion · Language Support · Printable + Interactive

Activity Studio

Upload a DOCX, PPTX, PDF, TXT, MD, or CSV file—or paste lesson text—and generate a classroom-ready activity pack with large student workspaces, teacher guide, QA gate, and interactive HTML export.

DOCX/PPTX/PDF importPrintable packetInteractive HTMLQA gate

Build Settings

Supported: DOCX, PPTX, PDF, TXT, MD, CSV

Scanned PDFs may need manual paste because they do not contain selectable text.

`; } function build() { const c = cfg(), v = vocab(c), a = acts(c), h = studentHtml(c, v, a); state.out = { summary: summary(c, v, a), packet: packet(c, v, a), guide: guide(c, v, a), html: h, qa: qa(c, v, a), }; $("summary").innerHTML = state.out.summary; $("packet").innerHTML = state.out.packet; $("guide").innerHTML = state.out.guide; $("html").innerHTML = '

Interactive HTML Export

Use the download button above to save this as a student-facing HTML activity.

' +
          esc(h) +
          "
"; $("qa").innerHTML = state.out.qa; tab("summary"); status("status", "Activity pack generated. Review tabs and export."); toast("Activity pack generated"); } function tab(id) { state.tab = id; document .querySelectorAll(".tab") .forEach((b) => b.setAttribute("aria-selected", String(b.dataset.tab === id)), ); document .querySelectorAll(".pane") .forEach((p) => p.classList.toggle("active", p.id === id)); } function save(name, content, type) { const blob = new Blob([content], { type }); const a = document.createElement("a"); a.href = URL.createObjectURL(blob); a.download = name; a.click(); URL.revokeObjectURL(a.href); } function docHtml() { return `${state.out?.packet || ""}`; } $("form").addEventListener("submit", (e) => { e.preventDefault(); build(); }); $("source").addEventListener( "input", () => (state.src = { kind: "typed", name: "Manual source", chars: $("source").value.length, }), ); $("demo").onclick = () => { $("topic").value = "Mean, Median, Mode, and Range"; $("source").value = "Students will review mean, median, mode, and range. They need to sort numbers from least to greatest, identify the middle number, find the number that appears most often, calculate the average, and subtract the smallest value from the largest value. Students should explain their thinking using math vocabulary."; state.src = { kind: "typed", name: "Demo source", chars: $("source").value.length, }; toast("Demo loaded"); }; $("reset").onclick = () => { $("topic").value = ""; $("source").value = ""; $("file").value = ""; state.src = { kind: "typed", name: "Manual source", chars: 0 }; status("status", "Form reset."); }; document .querySelectorAll(".tab") .forEach((b) => (b.onclick = () => tab(b.dataset.tab))); $("copy").onclick = async () => { await navigator.clipboard.writeText($(state.tab).innerText || ""); toast("Copied current tab"); }; $("doc").onclick = () => state.out ? save( "neft-teacher-activity-packet.doc", docHtml(), "application/msword", ) : toast("Generate first"); $("htmlDown").onclick = () => state.out ? save( "neft-teacher-interactive-activity.html", state.out.html, "text/html", ) : toast("Generate first"); $("print").onclick = () => { if (!state.out) return toast("Generate first"); tab("packet"); setTimeout(() => window.print(), 100); }; document.addEventListener("DOMContentLoaded", () => { state.src = { kind: "typed", name: "Manual source", chars: $("source").value.length, }; build(); });