import { renderLatex, renderMathInContainer } from "@ofb/katex"; import { createEffect, createMemo, createSignal } from "solid-js"; function formatNum(n: number) { return String(n); } function AreaModel() { const [a, setA] = createSignal(2); const [b, setB] = createSignal(3); const [c, setC] = createSignal(1); const [d, setD] = createSignal(4); const ac = createMemo(() => a() * c()); const ad = createMemo(() => a() * d()); const bc = createMemo(() => b() * c()); const bd = createMemo(() => b() * d()); const total = createMemo(() => ac() + ad() + bc() + bd()); const expansionHtml = createMemo(() => renderLatex( `(${formatNum(a())}+${formatNum(b())})(${formatNum(c())}+${formatNum(d())}) = ${ac()} + ${ad()} + ${bc()} + ${bd()} = ${total()}` ) ); let captionRef: HTMLElement | undefined; createEffect(() => { a(); b(); c(); d(); expansionHtml(); if (captionRef) renderMathInContainer(captionRef); }); return (

Area model for expansion

setA(Number(e.currentTarget.value))} />
setB(Number(e.currentTarget.value))} />
setC(Number(e.currentTarget.value))} />
setD(Number(e.currentTarget.value))} />
{ captionRef = el; if (el) renderMathInContainer(el); }} > A rectangle of side \((a+b)\) by \((c+d)\) splits into regions \(ac\), \(ad\), \(bc\), \(bd\).
); } export default AreaModel;