import { createEffect, createSignal, onCleanup, onMount } from "solid-js"; import { MathVisualizer } from "./lib/math-visualizer"; type Op = "+" | "-" | "*" | "/"; const DEFAULT_NUMBERS = "27\n59"; function VerticalArithmeticWorkbench() { let rootRef!: HTMLElement; let canvasRef!: HTMLCanvasElement; let canvasWrapRef!: HTMLDivElement; let visualizer: MathVisualizer | undefined; const [operation, setOperation] = createSignal("+"); const [numbersInput, setNumbersInput] = createSignal(DEFAULT_NUMBERS); const [message, setMessage] = createSignal("Enter numbers and click Generate"); const [isError, setIsError] = createSignal(false); const [stepCurrent, setStepCurrent] = createSignal(0); const [stepTotal, setStepTotal] = createSignal(0); const [playing, setPlaying] = createSignal(false); const [speed, setSpeed] = createSignal(800); const progress = () => stepTotal() > 0 ? (stepCurrent() / stepTotal()) * 100 : 0; onMount(() => { visualizer = new MathVisualizer({ canvas: canvasRef, wrapper: canvasWrapRef, themeRoot: rootRef, }); visualizer.onMessage = (msg, err) => { setMessage(msg); setIsError(!!err); }; visualizer.onStep = (current, total) => { setStepCurrent(current); setStepTotal(total); }; visualizer.onPlayState = setPlaying; const resize = () => visualizer?.resizeCanvas(); resize(); const ro = new ResizeObserver(resize); ro.observe(canvasWrapRef); window.addEventListener("resize", resize); const themeObserver = new MutationObserver(() => { visualizer?.refreshColors(); visualizer?.render(); }); themeObserver.observe(document.documentElement, { attributes: true, attributeFilter: ["data-theme"], }); onCleanup(() => { ro.disconnect(); window.removeEventListener("resize", resize); themeObserver.disconnect(); visualizer?.destroy(); }); setTimeout(() => generate(), 100); }); createEffect(() => { visualizer?.setOperation(operation()); visualizer?.setSpeed(speed()); }); const generate = () => { visualizer?.setOperation(operation()); visualizer?.generateFromInput(numbersInput()); }; return (

Carry & borrow arithmetic visualizer