"use client"; import { useState, useMemo, useCallback } from "react"; import { Card } from "@/components/ui/card"; const PRESETS = ["101", "1011", "1101", "10101", "11000", "11111", "100000", "110010"]; interface Column { exponent: number; placeValue: number; digit: string; contrib: number; isOne: boolean; } function powerOfTwo(n: number) { let v = 1; for (let i = 0; i < n; i++) v *= 2; return v; } function buildColumnsFor(binaryStr: string): Column[] { const n = binaryStr.length; const cols: Column[] = []; for (let i = 0; i < n; i++) { const exponent = n - 1 - i; const digit = binaryStr[i]; const placeValue = powerOfTwo(exponent); const isOne = digit === "1"; cols.push({ exponent, placeValue, digit, contrib: parseInt(digit, 10) * placeValue, isOne, }); } return cols; } function emptyColumns(): Column[] { const cols: Column[] = []; for (let exp = 5; exp >= 0; exp--) { cols.push({ exponent: exp, placeValue: powerOfTwo(exp), digit: "_", contrib: 0, isOne: false, }); } return cols; } export function BinaryConverterExplorer() { const [input, setInput] = useState(""); const [submitted, setSubmitted] = useState(null); const [error, setError] = useState(""); const [answerHidden, setAnswerHidden] = useState(false); const [chartHidden, setChartHidden] = useState(false); const handleInputChange = (value: string) => { setInput(value.replace(/[^01]/g, "")); setError(""); }; const convert = useCallback((raw?: string) => { const source = (raw ?? input).trim(); if (source.length === 0) { setError("Type a binary number first (only 0s and 1s)."); setSubmitted(null); return; } if (!/^[01]+$/.test(source)) { setError("Binary numbers use only 0 and 1. Found another digit."); setSubmitted(null); return; } if (source.length > 8) { setError("Keep it to 8 digits or fewer for this lesson."); return; } setError(""); setSubmitted(source); }, [input]); const applyPreset = (value: string) => { setInput(value); convert(value); }; const handleClear = () => { setInput(""); setSubmitted(null); setError(""); }; const handleRandom = () => { const len = 3 + Math.floor(Math.random() * 4); let s = "1"; for (let i = 1; i < len; i++) { s += Math.random() < 0.5 ? "0" : "1"; } setInput(s); convert(s); }; const columns = useMemo(() => { if (!submitted) return emptyColumns(); return buildColumnsFor(submitted); }, [submitted]); const total = useMemo(() => { if (!submitted) return 0; return columns.reduce((acc, c) => acc + c.contrib, 0); }, [columns, submitted]); const fullExpansion = submitted ? columns.map((c) => `${c.digit}×${c.placeValue}`).join(" + ") : ""; const onesOnly = submitted ? columns.filter((c) => c.isOne).length > 0 ? columns.filter((c) => c.isOne).map((c) => c.placeValue).join(" + ") + " = " + total : "0" : ""; return (
{/* Input Card */}

Type a Binary Number

handleInputChange(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") convert(); }} className="w-44 rounded-lg border-2 border-unit-6 bg-surface px-3 py-2 text-center font-mono text-2xl font-bold tracking-[0.3em] text-unit-6 outline-none focus:border-unit-6-dark" aria-label="Binary number input" />
{PRESETS.map((p) => ( ))}
{error && (

{error}

)}
{/* Place value chart */}

Place Value Chart (powers of 2)

{!chartHidden && (
{columns.map((c) => ( ))} {columns.map((c) => ( ))} {columns.map((c, i) => ( ))} {columns.map((c, i) => ( ))}
2{c.exponent}
{c.placeValue}
{c.digit}
{submitted ? c.contrib : "_"}
)} {submitted && (
{fullExpansion}
= {onesOnly}
)}
{/* Answer banner */} {!submitted ? (

Type a binary number above and press Convert.

) : answerHidden ? (

{submitted}2 = ? (press Show Answer)

) : (

{submitted}2 = {total} in denary

)}
{/* Footer note */}

For students: solve on paper first using the chart in your worksheet. Type the binary number here only to check. The lesson is in the chart, not the click.

); }