UNPKG

@fancyapps/ui

Version:

Robust JavaScript UI Component Library

355 lines (354 loc) 9.78 kB
import { Component } from "../shared/Base/Component"; import { PluginsType, EventsType, Bounds, MatrixValues, ZoomOptions } from "./types"; import { States } from "./consts"; import { OptionsType } from "./options"; export declare class Panzoom extends Component<OptionsType, EventsType> { static defaults: Partial<OptionsType>; static Plugins: PluginsType; private pointerTracker; private resizeObserver; private updateTimer; private clickTimer; private rAF; private isTicking; private friction; private ignoreBounds; private isBouncingX; private isBouncingY; private clicks; private trackingPoints; private pwt; private cwd; private pmme; /** * Current state of the instance */ state: States; /** * True if the user is currently dragging */ isDragging: boolean; /** * Reference to the container element */ container: HTMLElement; /** * Reference to the content element */ content: HTMLElement | HTMLImageElement | HTMLPictureElement; /** * Reference to the loading indicator element */ spinner: HTMLElement | null; /** * Container dimensions. * `innerWidth` & `innerHeight` values are width/height without padding. */ containerRect: { width: number; height: number; innerWidth: number; innerHeight: number; }; /** * Content dimensions and position relative to parent. * `width` & `height` values are in current scale. */ contentRect: { top: number; right: number; bottom: number; left: number; fullWidth: number; fullHeight: number; fitWidth: number; fitHeight: number; width: number; height: number; }; /** * Initial position of the drag */ dragStart: { x: number; y: number; top: number; left: number; time: number; }; /** * Current position of the drag */ dragOffset: { x: number; y: number; time: number; }; /** * Transformation matrix values that define current x/y position and scale */ current: MatrixValues; /** * Transformation matrix values that define the x/y position and scale of the end of the current animation */ target: MatrixValues; /** * The velocity of each transformation matrix value */ velocity: MatrixValues; /** * Axis that is currently locked */ lockedAxis: false | "x" | "y"; /** * True if the user is on a touch device */ get isTouchDevice(): boolean; get isMobile(): boolean; /** * Current pan mode - `mousemove` or `drag` */ get panMode(): "mousemove" | "drag"; /** * If the content can be dragged when it fits into the container */ get panOnlyZoomed(): boolean | ((...any: any) => boolean | "auto"); /** * True if the content has any boundaries */ get isInfinite(): boolean | "x" | "y"; /** * At what angle the content is rotated */ get angle(): number; /** * At what angle the content is rotated at the end of the current animation */ get targetAngle(): number; /** * At what scale the content is scaled */ get scale(): number; /** * At what scale the content is scaled at the end of the current animation */ get targetScale(): number; /** * Minimum scale level */ get minScale(): number; /** * At what scale the content will be at full width and height (1 to 1) */ get fullScale(): number; /** * Maximum scale level given the `maxScale` option */ get maxScale(): number; /** * At what scale the content will cover the container */ get coverScale(): number; /** * True if the content is currently animated and the scale level is changing */ get isScaling(): boolean; /** * True if the content (image) has not finished loading */ get isContentLoading(): boolean; /** * True if the animation is complete and the content fits within the bounds */ get isResting(): boolean; constructor(container: HTMLElement | null, userOptions?: Partial<OptionsType>, userPlugins?: PluginsType); private initContent; private onLoad; private onError; /** * Initialize the resize observer */ attachObserver(): void; /** * Remove the resize observer */ detachObserver(): void; /** * Enable click, wheel, mousemove and all touch events */ attachEvents(): void; /** * Remove click, wheel, mouse movement and all touch events */ detachEvents(): void; private animate; private setTargetForce; private checkBounds; private clampTargetBounds; private calculateContentDim; private setEdgeForce; private enable; private onClick; private addTrackingPoint; private onPointerDown; private onPointerMove; private onPointerUp; private startDecelAnim; private onWheel; private onMouseMove; private onKeydown; private onResize; private setTransform; /** * Calculate dimensions of contents and container */ updateMetrics(silently?: boolean): void; /** * Get information about current content boundaries */ getBounds(): Bounds; /** * Enable or disable controls depending on the current size of the content */ updateControls(): void; /** * Pan content to selected position and scale, use `friction` to control duration */ panTo({ x, y, scale, friction, angle, originX, originY, flipX, flipY, ignoreBounds, }: { x?: number; y?: number; scale?: number; friction?: number; angle?: number; originX?: number; originY?: number; flipX?: boolean; flipY?: boolean; ignoreBounds?: boolean; }): void; /** * Relatively change position, scale, or angle of content, and flip content horizontally or vertically */ applyChange({ panX, panY, scale, angle, originX, originY, friction, flipX, flipY, ignoreBounds, bounce, }: { panX?: number; panY?: number; scale?: number; angle?: number; originX?: number; originY?: number; friction?: number; flipX?: boolean; flipY?: boolean; ignoreBounds?: boolean; bounce?: boolean; }): void; /** * Stop animation and optionally set target values to the current values (or vice versa) */ stop(freeze?: "current" | "target" | false): void; /** * Request an animation frame to check if the content position or scale needs to be changed based on the target values or if the content is out of bounds */ requestTick(): void; /** * Update the current position based on the mouse move event */ panWithMouse(event: MouseEvent, friction?: number): void; /** * Update the current scale based on the mouse scroll event */ zoomWithWheel(event: WheelEvent): void; /** * Check if the content can be scaled up */ canZoomIn(): boolean; /** * Check if the content can be scaled down */ canZoomOut(): boolean; /** * Increase scale level */ zoomIn(scale?: number, opts?: ZoomOptions): void; /** * Reduce scale level */ zoomOut(scale?: number, opts?: ZoomOptions): void; /** * Change the scale level so that the content fits inside the container */ zoomToFit(opts?: ZoomOptions): void; /** * Change the scale level so that the content covers the container */ zoomToCover(opts?: ZoomOptions): void; /** * Change the scale level so that the content has full width and height (e.g, on a 1-to-1 scale) */ zoomToFull(opts?: ZoomOptions): void; /** * Change the scale level to maximum */ zoomToMax(opts?: ZoomOptions): void; /** * Toggle `full` scale level: `fit` -> `full` -> `fit` */ toggleZoom(opts?: ZoomOptions): void; /** * Toggle scale level: `fit` -> `max` -> `fit` */ toggleMax(opts?: ZoomOptions): void; /** * Toggle scale level: `fit` -> `cover` -> `fit` */ toggleCover(opts?: ZoomOptions): void; /** * Iterate scale level: `fit` -> `full` -> `max` -> `fit` */ iterateZoom(opts?: ZoomOptions): void; /** * Scale the content to a specific step or level. * Note: Origin `[0,0]` is in the center, because content has CSS `transform-origin: center center;` */ zoomTo(zoomLevel?: number | "fit" | "cover" | "full" | "max" | "next", { friction, originX, originY, event, }?: ZoomOptions): void; /** * Rotate the content counterclockwise */ rotateCCW(): void; /** * Rotate the content clockwise */ rotateCW(): void; /** * Flip content horizontally */ flipX(): void; /** * Flip content vertically */ flipY(): void; /** * Change the scale level so that the content fits the container horizontally */ fitX(): void; /** * Change the scale level so that the content fits the container vertically */ fitY(): void; /** * Toggle full screen mode */ toggleFS(): void; /** * Get transformation matrix values */ getMatrix(source?: MatrixValues): DOMMatrix; /** * Reset all transformations AND animate to the original position */ reset(friction?: number): void; /** * Destroy the instance */ destroy(): void; }