UNPKG

react-moveable

Version:

A React Component that create Moveable, Draggable, Resizable, Scalable, Rotatable, Warpable, Pinchable, Groupable.

455 lines (454 loc) 13.9 kB
import { IObject } from "@daybrush/utils"; import Dragger, * as DraggerTypes from "@daybrush/drag"; import CustomDragger from "./CustomDragger"; import { Position } from "@daybrush/drag"; export declare type MoveableManagerProps<T = {}> = { target?: SVGElement | HTMLElement | null; container?: SVGElement | HTMLElement | null; dragArea?: boolean; parentMoveable?: any; parentPosition?: { left: number; top: number; } | null; origin?: boolean; transformOrigin?: Array<string | number> | ""; edge?: boolean; keepRatio?: boolean; pinchThreshold?: number; ables?: Array<Able<T>>; } & T; export declare type MoveableManagerState<T = {}> = { target: SVGElement | HTMLElement | null | undefined; left: number; top: number; right: number; bottom: number; width: number; height: number; beforeMatrix: number[]; matrix: number[]; targetTransform: string; targetMatrix: number[]; offsetMatrix: number[]; is3d: boolean; transformOrigin: number[]; beforeOrigin: number[]; origin: number[]; beforeDirection: 1 | -1; direction: 1 | -1; pos1: number[]; pos2: number[]; pos3: number[]; pos4: number[]; dragger: Dragger | CustomDragger | null; } & T; export interface Renderer { createElement(type: any, props?: any, ...children: any[]): any; } export interface Guideline { type: "horizontal" | "vertical"; element?: Element | null; center?: boolean; pos: number[]; size: number; } export interface BoundInfo { isBound: boolean; offset: number; pos: number; } export interface SnapInfo { isSnap: boolean; dist: number; offset: number; guidelines: Guideline[]; snapPoses: number[]; } export interface MoveableProps extends DraggableProps, RotatableProps, ResizableProps, ScalableProps, WarpableProps, PinchableProps, GroupableProps, SnappableProps { target?: SVGElement | HTMLElement | Array<SVGElement | HTMLElement> | null; container?: SVGElement | HTMLElement | null; origin?: boolean; keepRatio?: boolean; edge?: boolean; pinchThreshold?: number; ables?: Able[]; } export declare type MoveableState = MoveableManagerState; export interface OnPinchStart { target: HTMLElement | SVGElement; clientX: number; clientY: number; datas: IObject<any>; } export interface OnPinch { target: HTMLElement | SVGElement; clientX: number; clientY: number; datas: IObject<any>; } export interface OnPinchEnd { target: HTMLElement | SVGElement; isDrag: boolean; clientX: number; clientY: number; datas: IObject<any>; } export interface OnDragStart { target: HTMLElement | SVGElement; clientX: number; clientY: number; datas: IObject<any>; set: (translate: number[]) => void; } export interface OnDrag { target: HTMLElement | SVGElement; clientX: number; clientY: number; datas: IObject<any>; beforeDelta: number[]; beforeDist: number[]; beforeTranslate: number[]; delta: number[]; dist: number[]; translate: number[]; transform: string; left: number; top: number; bottom: number; right: number; isPinch: boolean; } export interface OnDragEnd { target: HTMLElement | SVGElement; isDrag: boolean; clientX: number; clientY: number; datas: IObject<any>; } export interface OnScaleStart { target: HTMLElement | SVGElement; clientX: number; clientY: number; direction: number[]; datas: IObject<any>; dragStart: OnDragStart | false; set: (scale: number[]) => void; } export interface OnScale { target: HTMLElement | SVGElement; clientX: number; clientY: number; datas: IObject<any>; direction: number[]; scale: number[]; dist: number[]; delta: number[]; transform: string; isPinch: boolean; drag: OnDrag; } export interface OnScaleEnd { target: HTMLElement | SVGElement; isDrag: boolean; clientX: number; clientY: number; datas: IObject<any>; } export interface OnResizeStart { target: HTMLElement | SVGElement; clientX: number; clientY: number; datas: IObject<any>; direction: number[]; dragStart: OnDragStart | false; set: (sizes: number[]) => any; setOrigin: (origin: Array<string | number>) => any; } export interface OnResize { target: HTMLElement | SVGElement; clientX: number; clientY: number; datas: IObject<any>; direction: number[]; width: number; height: number; dist: number[]; delta: number[]; isPinch: boolean; drag: OnDrag; } export interface OnResizeEnd { target: HTMLElement | SVGElement; isDrag: boolean; clientX: number; clientY: number; datas: IObject<any>; } export interface OnRotateStart { target: HTMLElement | SVGElement; clientX: number; clientY: number; datas: IObject<any>; set: (rotate: number) => void; } export interface OnRotate { target: HTMLElement | SVGElement; clientX: number; clientY: number; datas: IObject<any>; beforeDist: number; beforeDelta: number; beforeRotate: number; dist: number; delta: number; rotate: number; transform: string; isPinch: boolean; } export interface OnRotateEnd { target: HTMLElement | SVGElement; isDrag: boolean; clientX: number; clientY: number; datas: IObject<any>; } export interface OnWarpStart { target: HTMLElement | SVGElement; clientX: number; clientY: number; datas: IObject<any>; set: (matrix: number[]) => any; } export interface OnWarp { target: HTMLElement | SVGElement; clientX: number; clientY: number; datas: IObject<any>; transform: string; delta: number[]; dist: number[]; matrix: number[]; multiply: (matrix1: number[], matrix2: number[], n?: number) => number[]; } export interface OnWarpEnd { target: HTMLElement | SVGElement; clientX: number; clientY: number; isDrag: boolean; datas: IObject<any>; } export interface OnDragGroupStart extends OnDragStart { targets: Array<HTMLElement | SVGElement>; events: OnDragStart[]; } export interface OnDragGroup extends OnDrag { targets: Array<HTMLElement | SVGElement>; events: OnDrag[]; } export interface OnDragGroupEnd { targets: Array<HTMLElement | SVGElement>; clientX: number; clientY: number; datas: IObject<any>; isDrag: boolean; } export interface OnRotateGroupStart extends OnRotateStart { targets: Array<HTMLElement | SVGElement>; events: Array<OnRotateStart & { dragStart: OnDragStart | false; }>; } export interface OnRotateGroup extends OnRotate { targets: Array<HTMLElement | SVGElement>; events: Array<OnRotate & { drag: OnDrag; }>; } export interface OnRotateGroupEnd { targets: Array<HTMLElement | SVGElement>; clientX: number; clientY: number; datas: IObject<any>; isDrag: boolean; } export interface OnResizeGroupStart extends OnResizeStart { targets: Array<HTMLElement | SVGElement>; events: OnResizeStart[]; } export interface OnResizeGroup extends OnResize { targets: Array<HTMLElement | SVGElement>; events: Array<OnResize & { drag: OnDrag; }>; } export interface OnResizeGroupEnd { targets: Array<HTMLElement | SVGElement>; clientX: number; clientY: number; isDrag: boolean; datas: IObject<any>; } export interface OnScaleGroupStart extends OnScaleStart { targets: Array<HTMLElement | SVGElement>; events: OnScaleStart[]; } export interface OnScaleGroup extends OnScale { targets: Array<HTMLElement | SVGElement>; events: Array<OnScale & { drag: OnDrag; }>; } export interface OnScaleGroupEnd { targets: Array<HTMLElement | SVGElement>; clientX: number; clientY: number; isDrag: boolean; datas: IObject<any>; } export interface OnPinchGroupStart { targets: Array<HTMLElement | SVGElement>; clientX: number; clientY: number; datas: IObject<any>; } export interface OnPinchGroup extends OnPinch { targets: Array<HTMLElement | SVGElement>; } export interface OnPinchGroupEnd { targets: Array<HTMLElement | SVGElement>; clientX: number; clientY: number; isDrag: boolean; datas: IObject<any>; } export interface OnClickGroup { targets: Array<HTMLElement | SVGElement>; target: HTMLElement | SVGElement; hasTarget: boolean; containsTarget: boolean; targetIndex: number; } export interface Able<T = any> { name: string & keyof MoveableManagerProps<T>; dragControlOnly?: boolean; updateRect?: boolean; canPinch?: boolean; unset?: (moveable: MoveableManagerProps<any>) => any; render?: (moveable: MoveableManagerProps<any>, renderer: Renderer) => any; dragStart?: (moveable: MoveableManagerProps<any>, e: DraggerTypes.OnDragStart) => any; drag?: (moveable: MoveableManagerProps<any>, e: DraggerTypes.OnDrag) => any; dragEnd?: (moveable: MoveableManagerProps<any>, e: DraggerTypes.OnDragEnd) => any; pinchStart?: (moveable: MoveableManagerProps<any>, e: DraggerTypes.OnPinchStart) => any; pinch?: (moveable: MoveableManagerProps<any>, e: DraggerTypes.OnPinch) => any; pinchEnd?: (moveable: MoveableManagerProps<any>, e: DraggerTypes.OnPinchEnd) => any; dragControlCondition?: (target: SVGElement | HTMLElement) => boolean; dragControlStart?: (moveable: MoveableManagerProps<any>, e: DraggerTypes.OnDragStart) => any; dragControl?: (moveable: MoveableManagerProps<any>, e: DraggerTypes.OnDrag) => any; dragControlEnd?: (moveable: MoveableManagerProps<any>, e: DraggerTypes.OnDragEnd) => any; dragGroupCondition?: (target: SVGElement | HTMLElement) => boolean; dragGroupStart?: (moveable: MoveableManagerProps<any>, e: DraggerTypes.OnDragStart) => any; dragGroup?: (moveable: MoveableManagerProps<any>, e: DraggerTypes.OnDrag) => any; dragGroupEnd?: (moveable: MoveableManagerProps<any>, e: DraggerTypes.OnDragEnd) => any; pinchGroupStart?: (moveable: MoveableManagerProps<any>, e: DraggerTypes.OnPinchStart) => any; pinchGroup?: (moveable: MoveableManagerProps<any>, e: DraggerTypes.OnPinch) => any; pinchGroupEnd?: (moveable: MoveableManagerProps<any>, e: DraggerTypes.OnPinchEnd) => any; dragGroupControlCondition?: (target: SVGElement | HTMLElement) => boolean; dragGroupControlStart?: (moveable: MoveableManagerProps<any>, e: DraggerTypes.OnDragStart) => any; dragGroupControl?: (moveable: MoveableManagerProps<any>, e: DraggerTypes.OnDragStart) => any; dragGroupControlEnd?: (moveable: MoveableManagerProps<any>, e: DraggerTypes.OnDragEnd) => any; } export interface OriginProps { origin: boolean; } export interface DraggableProps { draggable?: boolean; throttleDrag?: number; onDragStart?: (e: OnDragStart) => any; onDrag?: (e: OnDrag) => any; onDragEnd?: (e: OnDragEnd) => any; onDragGroupStart?: (e: OnDragGroupStart) => any; onDragGroup?: (e: OnDragGroup) => any; onDragGroupEnd?: (e: OnDragGroupEnd) => any; } export interface ResizableProps { resizable?: boolean; throttleResize?: number; onResizeStart?: (e: OnResizeStart) => any; onResize?: (e: OnResize) => any; onResizeEnd?: (e: OnResizeEnd) => any; onResizeGroupStart?: (e: OnResizeGroupStart) => any; onResizeGroup?: (e: OnResizeGroup) => any; onResizeGroupEnd?: (e: OnResizeGroupEnd) => any; } export interface ScalableProps { scalable?: boolean; throttleScale?: number; onScaleStart?: (e: OnScaleStart) => any; onScale?: (e: OnScale) => any; onScaleEnd?: (e: OnScaleEnd) => any; onScaleGroupStart?: (e: OnScaleGroupStart) => any; onScaleGroup?: (e: OnScaleGroup) => any; onScaleGroupEnd?: (e: OnScaleGroupEnd) => any; } export interface RotatableProps { rotatable?: boolean; rotationPosition?: "top" | "bottom" | "left" | "right"; throttleRotate?: number; onRotateStart?: (e: OnRotateStart) => any; onRotate?: (e: OnRotate) => any; onRotateEnd?: (e: OnRotateEnd) => any; onRotateGroupStart?: (e: OnRotateGroupStart) => any; onRotateGroup?: (e: OnRotateGroup) => any; onRotateGroupEnd?: (e: OnRotateGroupEnd) => any; } export interface WarpableProps { warpable?: boolean; onWarpStart?: (e: OnWarpStart) => any; onWarp?: (e: OnWarp) => any; onWarpEnd?: (e: OnWarpEnd) => any; } export interface PinchableProps extends ResizableProps, ScalableProps, RotatableProps { pinchable?: boolean | Array<"rotatable" | "resizable" | "scalable">; onPinchStart?: (e: OnPinchStart) => any; onPinch?: (e: OnPinch) => any; onPinchEnd?: (e: OnPinchEnd) => any; onPinchGroupStart?: (e: OnPinchGroupStart) => any; onPinchGroup?: (e: OnPinchGroup) => any; onPinchGroupEnd?: (e: OnPinchGroupEnd) => any; } export interface GroupableProps extends PinchableProps, DraggableProps, RotatableProps, ResizableProps, ScalableProps { groupable?: boolean; targets?: Array<HTMLElement | SVGElement>; updateGroup?: boolean; onClickGroup?: (e: OnClickGroup) => any; } export interface SnappableProps { snappable?: boolean | string[]; snapCenter?: boolean; snapThreshold?: number; horizontalGuidelines?: number[]; verticalGuidelines?: number[]; elementGuildelines?: Element[]; bounds?: { left?: number; top?: number; right?: number; bottom?: number; }; } export interface SnappableState { guidelines: any[]; snapDirection: number[] | true | null; startLeft: number; startTop: number; startRight: number; startBottom: number; } export interface OnCustomDrag extends Position { inputEvent: any; isDrag: boolean; datas: IObject<any>; parentEvent: boolean; parentDragger: CustomDragger; }