c42f29537b
- Reset dragging on every exit path (enterZoom, fit, Escape, lightbox-close effect) so a
drag interrupted by Escape/Fit can't carry the grabbing state into the next session.
- Drag ends on pointerup/pointercancel/lostpointercapture (dropped pointerleave, which
fought the capture) so a drag genuinely continues outside the image.
- dragStart guards e.button===0; track the captured pointerId and release only when
hasPointerCapture() — no double-release throws.
- a11y: slider aria-valuetext ("150 percent").
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>