Payload
function App(){ const { values: tweaks, visible: tweaksVisible, update: updateTweaks } = useTweaks(); const { state, run, reset } = usePipelineRunner(); const [selected, setSelected] = React.useState(SAMPLES[0]); const [uploadedName, setUploadedName] = React.useState(null); const [drag, setDrag] = React.useState(false); const [history, setHistory] = React.useState([]); const [payloadExpanded, setPayloadExpanded] = React.useState(false); const [bitsExpanded, setBitsExpanded] = React.useState(false); const [extractedExpanded, setExtractedExpanded] = React.useState(false); const [recoveredExpanded, setRecoveredExpanded] = React.useState(false); const fileRef = React.useRef(null); const resultsRef = React.useRef(null); const [resultsHighlighted, setResultsHighlighted] = React.useState(false); React.useEffect(() => { if (state.result){ setHistory(h => [...h, state.result].slice(-12)); } }, [state.result]); const onViewResults = () => { if (resultsRef.current) { resultsRef.current.scrollIntoView({ behavior: "smooth", block: "start" }); } setResultsHighlighted(true); setTimeout(() => setResultsHighlighted(false), 2000); }; const onRun = async () => { let imageBase64 = selected.imageBase64; if (!imageBase64 && selected.src) { imageBase64 = await fetchSampleBase64(selected.src); } run({ ...selected, imageBase64 }); }; const onReset = () => { reset(); }; const svgToBase64 = (svgEl) => new Promise((resolve) => { const canvas = document.createElement("canvas"); canvas.width = 200; canvas.height = 200; const ctx = canvas.getContext("2d"); const svgStr = new XMLSerializer().serializeToString(svgEl); const blob = new Blob([svgStr], { type: "image/svg+xml" }); const url = URL.createObjectURL(blob); const img = new Image(); img.onload = () => { ctx.drawImage(img, 0, 0, 200, 200); URL.revokeObjectURL(url); resolve(canvas.toDataURL("image/png").split(",")[1]); }; img.onerror = () => { URL.revokeObjectURL(url); resolve(""); }; img.src = url; }); const onFile = (f) => { if (!f) return; setUploadedName(f.name); const reader = new FileReader(); reader.onload = (e) => { const base64 = e.target.result.split(",")[1]; setSelected({ id: "uploaded", label: f.name, seed: f.name.length + 3, imageBase64: base64 }); }; reader.readAsDataURL(f); }; const dropProps = { onDragOver: (e) => { e.preventDefault(); setDrag(true); }, onDragLeave: () => setDrag(false), onDrop: (e) => { e.preventDefault(); setDrag(false); const f = e.dataTransfer.files?.[0]; onFile(f); } }; const statusBanner = (() => { if (state.running){ const label = ["Initializing…","Stage 1 — OCR inference","Stage 2 — Huffman encode","Stage 2 — decode & verify"][state.stage]; return