/** * 2D affine transform stored as {x, y, scale}. Rotation is omitted * for now — the lightbox uses axis-aligned pan + uniform zoom. */ export interface Transform2D { x: number; y: number; scale: number; } export declare const IDENTITY: Transform2D; /** * Apply a scale delta `k` around a point `(px, py)`, preserving the * visual position of that point. This is the pinch-centroid math * used by PhotoSwipe, Google Maps, and every serious image viewer. * * Derivation: let the current transform map (u, v) → (u*scale+x, v*scale+y). * After scaling by `k` around (px, py) we want the pixel at (px, py) * to remain at (px, py). Solving the system yields: * * newScale = scale * k * newX = px - (px - x) * k * newY = py - (py - y) * k */ export declare function scaleAround(t: Transform2D, k: number, px: number, py: number): Transform2D; /** Clamp scale to `[min, max]` without moving the origin. */ export declare function clampScale(t: Transform2D, min: number, max: number): Transform2D; /** Translate by a pixel delta. */ export declare function translate(t: Transform2D, dx: number, dy: number): Transform2D; /** Format as a CSS `transform` value using `translate3d` + `scale` for GPU compositing. */ export declare function toCss(t: Transform2D): string; /** Midpoint between two 2D points. */ export declare function midpoint(a: { x: number; y: number; }, b: { x: number; y: number; }): { x: number; y: number; }; /** Euclidean distance between two 2D points. */ export declare function distance(a: { x: number; y: number; }, b: { x: number; y: number; }): number;