react-moveable
Version:
A React Component that create Moveable, Draggable, Resizable, Scalable, Rotatable, Warpable, Pinchable, Groupable.
455 lines (454 loc) • 13.9 kB
TypeScript
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;
}