Non-original aspects (square, 4:5, 16:9) always centered the crop with
no way to choose what got cut off. Crop position is now a normalized
0-1 offset per axis instead of a fixed /2 center, and dragging directly
on the canvas -- only when the current aspect actually leaves slack to
pan within -- adjusts it. Pointer movement converts to rotated-image
pixels via the crop-width-to-display-width ratio, so it stays 1:1
regardless of the maxDim downscale or the canvas's own CSS scaling.
Resets to centered on aspect or rotation change, since old offsets
don't make sense against new dimensions. Verified with a real drag test:
a marker cropped out at the centered default becomes visible after
dragging, and the "original" aspect (no crop, no slack) correctly
leaves panning disabled.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Chromatic aberration, dust & scratches, light-leak shape variety
(bloom/streak/corner), double exposure, and grain size/color controls,
plus polaroid/infrared/black & white presets and non-destructive
crop+rotate ahead of the existing effect stack.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Canvas-based client-side editor (grain, vignette, halation, procedural
light leaks, color-cast presets) plus a small Express/SQLite server for
the two paths that need persistence: instant share links and delayed
"send to develop" links with a randomized reveal time.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>