---
epic: 1
story: 1.6
title: "WASM Bindings (for Web)"
status: draft
---

## Epic 1 — Core Calculation Engine (Rust Crate)
**Goal:** Build `calcpad-engine` as a standalone Rust crate that powers all platforms. This is the foundation.

### Story 1.6: WASM Bindings (for Web)

As a web developer integrating CalcPad,
I want `wasm-bindgen` exports that return JSON-compatible results and fit within a 500KB gzipped bundle,
So that the engine runs performantly in the browser without large download overhead.

**Acceptance Criteria:**

**Given** a JavaScript caller invoking the `eval_line` WASM export with a string input
**When** the function executes
**Then** it returns a `JsValue` that can be deserialized to a JavaScript object
**And** the object includes `type`, `display`, `rawValue`, and `error` fields

**Given** a JavaScript caller invoking `eval_sheet` with an array of lines
**When** the function executes
**Then** it returns an array of result objects corresponding to each line
**And** variable context flows from earlier lines to later lines

**Given** the WASM crate is built with `wasm-pack build --release`
**When** the output `.wasm` file is gzip-compressed
**Then** the compressed size is under 500KB

**Given** the WASM module is loaded in a browser environment
**When** `eval_line` is called with `0.1 + 0.2`
**Then** the result is `0.3` (arbitrary precision works in WASM)
**And** performance is comparable to native for typical expressions (under 1ms per line)

**Given** the WASM module is loaded in a Web Worker
**When** `eval_sheet` is called
**Then** it does not block the main thread
**And** results can be posted back via standard `postMessage`
