point-focus
Version:
A React component for zooming and focusing on image points via click, drag, or cursor.
192 lines (191 loc) • 5.52 kB
TypeScript
export type ImageSource = React.SourceHTMLAttributes<HTMLSourceElement>;
export type IInteractionTYpe = 'click' | 'hover' | 'keyboard' | 'external';
export interface IImageMagnifierTypes {
src: string;
sources?: ImageSource[];
width?: number | undefined;
height?: number | undefined;
zoomSrc?: string | undefined;
zoomScale?: number | undefined;
zoomPreload?: boolean | undefined;
fadeDuration?: number | undefined;
moveType?: 'follow' | 'drag' | 'pinch';
zoomType?: 'click' | 'hover';
externalZoomState?: boolean | undefined;
setExternalZoomState?: (value: boolean) => void | undefined;
clickToZoomOut?: boolean | undefined;
containerClassName?: string | undefined;
baseImageClassName?: string | undefined;
zoomImageClassName?: string | undefined;
closeButtonClassName?: string | undefined;
alt: string;
containerAriaLabel?: string;
closeButtonAriaLabel?: string;
zoomImageAriaLabel?: string;
tabIndex?: number;
hideCloseButton?: boolean | undefined;
closeButtonContent?: React.ReactNode | undefined;
overlay?: React.ReactNode | undefined;
baseImageStyle?: React.CSSProperties | undefined;
onMouseEnter?: (info: {
source: 'mouse' | 'touch';
}) => void;
onMouseLeave?: (info: {
source: 'mouse' | 'touch';
}) => void;
onClickImage?: (info: {
x: number;
y: number;
source: 'mouse' | 'touch';
}) => void;
onZoom?: (info: {
at: {
x: number;
y: number;
};
method: IInteractionTYpe;
}) => void;
onClose?: (info: {
triggeredBy: IInteractionTYpe;
}) => void;
afterZoomImgLoaded?: () => void;
afterZoomOut?: () => void;
onBaseImageError?: () => void;
onZoomImageError?: () => void;
onDragStart?: (info: {
start: {
x: number;
y: number;
};
source: 'mouse' | 'touch';
}) => void;
onDragEnd?: (info: {
velocity: {
vx: number;
vy: number;
};
final: {
x: number;
y: number;
};
}) => void;
onZoomedMouseMove?: (info: {
x: number;
y: number;
bounds: DOMRect;
}) => void;
disableMobile?: boolean;
disableDrag?: boolean;
disableInertia?: boolean;
loadingPlaceholder?: React.ReactNode;
disableLoadingFallbacks?: boolean;
errorPlaceholder?: React.ReactNode;
disableErrorFallbacks?: boolean;
}
type ICoordinateObject = {
x: number;
y: number;
};
export type IImageTypes = {
onLoadCallback: (() => void) | null;
bounds: DOMRect | Record<string, number>;
offsets: ICoordinateObject;
ratios: ICoordinateObject;
scaledDimensions: {
width: number;
height: number;
};
wasDragging: boolean;
velocity: {
vx: number;
vy: number;
} | null;
dragStartCoords: ICoordinateObject;
prevDragCoords: {
x: number;
y: number;
time: number;
} | null;
lastDragCoords: {
x: number;
y: number;
time: number;
} | null;
rafId?: number | null;
lastMoveEvent?: {
x: number;
y: number;
bounds: DOMRect;
} | null;
};
export type IZoomImageTypes = {
src: string;
fadeDuration: number;
top: number;
left: number;
isZoomed: boolean;
onLoad?: (e: React.SyntheticEvent<HTMLImageElement>) => void;
onError?: () => void;
onClose?: (method: IInteractionTYpe) => void;
onFadeOut?: (e: React.TransitionEvent<HTMLImageElement>) => void;
closeButtonRef: React.RefObject<HTMLButtonElement>;
onDragStart?: (e: React.MouseEvent | React.TouchEvent) => void | undefined;
onDragEnd?: (e: React.MouseEvent | React.TouchEvent) => void | undefined;
onTouchStart: (e: React.MouseEvent | React.TouchEvent) => void;
onTouchEnd: (e: React.MouseEvent | React.TouchEvent) => void;
zoomImageClassName?: string | undefined;
closeButtonClassName?: string | undefined;
alt: string;
closeButtonAriaLabel?: string;
zoomImageAriaLabel?: string;
onKeyDown: (e: React.KeyboardEvent) => void;
closeButtonContent?: React.ReactNode | undefined;
loadingPlaceholder?: React.ReactNode;
disableLoadingFallbacks?: boolean;
errorPlaceholder?: React.ReactNode;
disableErrorFallbacks?: boolean;
zoomScale: number;
};
export type IBaseImageTypes = {
src: string;
sources?: ImageSource[];
width?: number;
height?: number;
baseImageClassName?: string;
baseImageStyle?: React.CSSProperties;
isZoomed?: boolean;
fadeDuration?: number;
alt: string;
loadingPlaceholder?: React.ReactNode;
disableLoadingFallbacks?: boolean;
errorPlaceholder?: React.ReactNode;
disableErrorFallbacks?: boolean;
onError?: (() => void) | undefined;
};
export type InertiaOptions = {
initialLeft: number;
initialTop: number;
velocity: {
vx: number;
vy: number;
};
setLeft: (left: number) => void;
setTop: (top: number) => void;
bounds: {
minLeft: number;
maxLeft: number;
minTop: number;
maxTop: number;
};
friction?: number;
minVelocity?: number;
onEnd?: () => void;
};
export type ZoomFallbackBoundaryProps = {
fallback: React.ReactNode;
children: React.ReactNode;
};
export type ZoomFallbackBoundaryState = {
hasError: boolean;
};
export {};