The preview lets a cell be dragged to +/-200% but the schema rejected
anything past +/-100, failing half the draggable range with a 400. The
schema now mirrors the drag clamp; cover-mode values past 100 saturate
at the image edge, contain-mode values keep panning like the preview.
Cover cells and the cornerRadius mask re-encode kept the input format,
so JPEG inputs lost the masked alpha and corners flattened to black.
Both now encode PNG explicitly.
Unreadable image dimensions used to silently substitute the cell's own
size, fill-stretching the image; they now throw and surface as a 422
naming the file.
Fixes#718
The contain branch chained a zoom resize into the contain resize on one Sharp pipeline; Sharp keeps a single set of resize options, so per-cell zoom was silently discarded and pan was equally dead. Splitting the chain would not have fixed it: the contain step scales the zoomed image straight back down.
The backend now implements the preview's semantics exactly: contain-fit, scale about the cell centre by zoom, offset by pan as a fraction of the cell, clip, background behind. Defaults keep the old single contain resize (now PNG-encoded so JPEG inputs no longer flatten cornerRadius masks to black corners), and the general path centres with floor to match Sharp's contain placement.
Nine marker-geometry tests, seven mutants each killed by the test built for them, window math fuzzed over 2.59M combinations.
Fixes#711