react-moveable
Version:
A React Component that create Moveable, Draggable, Resizable, Scalable, Rotatable, Warpable, Pinchable, Groupable.
956 lines (955 loc) • 29.8 kB
TypeScript
import { IObject } from "@daybrush/utils";
import Gesto, * as GestoTypes from "gesto";
import CustomGesto from "./gesto/CustomGesto";
import { MOVEABLE_EVENTS_MAP, MOVEABLE_PROPS_MAP } from "./ables/consts";
export interface MoveableClientRect {
left: number;
top: number;
right: number;
bottom: number;
width: number;
height: number;
clientLeft?: number;
clientTop?: number;
clientWidth?: number;
clientHeight?: number;
scrollWidth?: number;
scrollHeight?: number;
overflow?: boolean;
}
export declare type MoveableManagerProps<T = {}> = {
cssStyled: any;
customStyledMap: Record<string, any>;
wrapperMoveable?: MoveableManagerInterface | null;
parentMoveable?: MoveableManagerInterface | null;
parentPosition?: {
left: number;
top: number;
} | null;
groupable?: boolean;
} & MoveableDefaultOptions & (unknown extends T ? IObject<any> : T);
export declare type AnyObject<T> = (unknown extends T ? IObject<any> : T);
export interface DefaultOptions {
target?: SVGElement | HTMLElement | null;
dragTarget?: SVGElement | HTMLElement | null;
container?: SVGElement | HTMLElement | null;
portalContainer?: HTMLElement | null;
rootContainer?: HTMLElement | null;
zoom?: number;
transformOrigin?: Array<string | number> | string | "";
edge?: boolean;
ables?: Able[];
className?: string;
pinchThreshold?: number;
pinchOutside?: boolean;
triggerAblesSimultaneously?: boolean;
checkInput?: boolean;
cspNonce?: string;
translateZ?: number | string;
hideDefaultLines?: boolean;
props?: Record<string, any>;
}
export interface MoveableDefaultOptions extends DefaultOptions, DragAreaOptions, OriginOptions, PaddingOptions {
}
export interface MatrixInfo {
type: "offset" | "target";
target: SVGElement | HTMLElement;
matrix?: number[];
origin?: number[];
}
export declare type MoveableManagerState<T = {}> = {
container: SVGElement | HTMLElement | null | undefined;
target: SVGElement | HTMLElement | null | undefined;
left: number;
top: number;
right: number;
bottom: number;
width: number;
height: number;
beforeMatrix: number[];
allMatrix: number[];
targetTransform: string;
rootMatrix: number[];
targetMatrix: number[];
offsetMatrix: number[];
is3d: boolean;
transformOrigin: number[];
targetOrigin: number[];
beforeOrigin: number[];
origin: number[];
originalBeforeOrigin: number[];
beforeDirection: number;
direction: number;
renderPoses: number[][];
disableNativeEvent: boolean;
pos1: number[];
pos2: number[];
pos3: number[];
pos4: number[];
gesto: Gesto | CustomGesto | null;
targetClientRect: MoveableClientRect;
containerClientRect: MoveableClientRect;
moveableClientRect: MoveableClientRect;
rotation: number;
} & T;
export interface PaddingBox {
left?: number;
top?: number;
right?: number;
bottom?: number;
}
export interface Renderer {
createElement(type: any, props?: any, ...children: any[]): any;
}
export interface SnapGuideline {
type: "horizontal" | "vertical";
hide?: boolean;
element?: Element | null;
isStart?: boolean;
isEnd?: boolean;
isCenter?: boolean;
isInner?: boolean;
pos: number[];
size: number;
className?: string;
sizes?: number[];
gap?: number;
elementRect?: SnapElementRect;
gapRects?: SnapElementRect[];
}
export interface SnapBoundInfo {
isBound: boolean;
isSnap: boolean;
offset: number;
dist: number;
snapIndex?: number;
bounds?: BoundInfo[];
snap?: SnapInfo;
}
export interface BoundInfo {
isBound: boolean;
offset: number;
pos: number;
}
export interface SnapOffsetInfo {
isSnap: boolean;
offset: number;
pos: number;
}
export interface SnapInfo {
isSnap: boolean;
index: number;
posInfos: SnapPosInfo[];
}
export interface SnapPosInfo {
pos: number;
index: number;
guidelineInfos: SnapGuidelineInfo[];
}
export interface SnapGuidelineInfo {
dist: number;
offset: number;
guideline: SnapGuideline;
}
export interface RenderGuidelineInfo {
key?: string;
direction: string;
classNames: string[];
size: string;
pos: string[];
sizeValue: number;
posValue: number[];
zoom: number;
}
export interface RenderGuidelineInnerInfo {
key?: string;
direction: string;
classNames: Array<string | undefined>;
size?: string;
pos?: string[];
sizeValue: number;
posValue: number[];
zoom: number;
}
export declare type ExcludeKeys<T extends IObject<any>, U> = Pick<T, Exclude<keyof T, U>>;
export interface MoveableProps extends MoveableDefaultProps, DraggableProps, DragAreaProps, OriginDraggableProps, RotatableProps, ResizableProps, ScalableProps, WarpableProps, PinchableProps, ExcludeKeys<GroupableProps, "targets" | "updateGroup">, IndividualGroupableProps, SnappableProps, ScrollableProps, ClippableProps, RoundableProps, BeforeRenderableProps, ClickableProps, RenderableProps {
}
export interface MoveableDefaultProps extends ExcludeKeys<MoveableDefaultOptions, "target"> {
target?: MoveableRefType | ArrayFormat<MoveableRefType>;
}
export declare type MoveableRefType<T extends Element = HTMLElement | SVGElement> = string | (() => T) | MoveableRefObject<T> | T | null | undefined;
export interface MoveableRefObject<T extends Element = HTMLElement | SVGElement> {
current: T | undefined | null;
}
export interface MoveableOptions extends MoveableDefaultProps, DraggableOptions, DragAreaOptions, OriginDraggableOptions, RotatableOptions, ResizableOptions, ScalableOptions, WarpableOptions, PinchableOptions, GroupableOptions, IndividualGroupableOptions, SnappableOptions, ScrollableOptions, ClippableOptions, RoundableOptions {
}
export declare type MoveableState = MoveableManagerState;
export interface Able<Props extends IObject<any> = IObject<any>, Events extends IObject<any> = IObject<any>> {
name: string;
props?: {
[key in keyof Props]: any;
};
events?: {
[key in keyof Events]: string;
};
always?: boolean;
ableGroup?: string;
updateRect?: boolean;
canPinch?: boolean;
css?: string[];
unset?(moveable: any): any;
render?(moveable: any, renderer: Renderer): any;
dragStart?(moveable: any, e: GestoTypes.OnDragStart): any;
drag?(moveable: any, e: GestoTypes.OnDrag): any;
dragEnd?(moveable: any, e: GestoTypes.OnDragEnd): any;
pinchStart?(moveable: any, e: GestoTypes.OnPinchStart): any;
pinch?(moveable: any, e: GestoTypes.OnPinch): any;
pinchEnd?(moveable: any, e: GestoTypes.OnPinchEnd): any;
dragControlCondition?(moveable: any, e: any): boolean;
dragControlStart?(moveable: any, e: GestoTypes.OnDragStart): any;
dragControl?(moveable: any, e: GestoTypes.OnDrag): any;
dragControlEnd?(moveable: any, e: GestoTypes.OnDragEnd): any;
dragGroupCondition?(moveable: any, e: any): boolean;
dragGroupStart?(moveable: any, e: GestoTypes.OnDragStart): any;
dragGroup?(moveable: any, e: GestoTypes.OnDrag): any;
dragGroupEnd?(moveable: any, e: GestoTypes.OnDragEnd): any;
pinchGroupStart?(moveable: any, e: GestoTypes.OnPinchStart): any;
pinchGroup?(moveable: any, e: GestoTypes.OnPinch): any;
pinchGroupEnd?(moveable: any, e: GestoTypes.OnPinchEnd): any;
dragGroupControlCondition?(moveable: any, e: any): boolean;
dragGroupControlStart?(moveable: any, e: GestoTypes.OnDragStart): any;
dragGroupControl?(moveable: any, e: GestoTypes.OnDragStart): any;
dragGroupControlEnd?(moveable: any, e: GestoTypes.OnDragEnd): any;
mouseEnter?(moveable: any, e: any): any;
mouseLeave?(moveable: any, e: any): any;
mouseGroupEnter?(moveable: any, e: any): any;
mouseGroupLeave?(moveable: any, e: any): any;
request?(moveable: any): AbleRequester;
}
export interface OnEvent {
currentTarget: MoveableManagerInterface<any, any>;
moveable: MoveableManagerInterface<any, any>;
target: HTMLElement | SVGElement;
clientX: number;
clientY: number;
datas: IObject<any>;
inputEvent: any;
}
export interface OnEndEvent extends OnEvent {
lastEvent: any | undefined;
isDrag: boolean;
isDouble: boolean;
}
export interface OnTransformStartEvent {
setTransform(transform: string | string[], index?: number): void;
setTransformIndex(transformIndex: number): void;
}
export interface OnTransformEvent {
transform: string;
drag: OnDrag;
}
export interface AbleRequestParam {
isInstant?: boolean;
[key: string]: any;
}
export interface Requester {
request(param: IObject<any>): this;
requestEnd(): this;
}
export interface AbleRequester {
isControl: boolean;
requestStart(param: IObject<any>): IObject<any>;
request(param: IObject<any>): IObject<any>;
requestEnd(): IObject<any>;
}
export interface OnPinchStart extends OnEvent {
}
export interface OnPinch extends OnEvent {
}
export interface OnPinchEnd extends OnEndEvent {
}
export interface OnDragStart extends OnEvent, OnTransformStartEvent {
set: (translate: number[]) => void;
}
export interface OnDrag extends OnEvent {
beforeDelta: number[];
beforeDist: number[];
beforeTranslate: number[];
delta: number[];
dist: number[];
translate: number[];
transform: string;
left: number;
top: number;
bottom: number;
width: number;
height: number;
right: number;
isPinch: boolean;
}
export interface OnDragEnd extends OnEndEvent {
}
export interface OnDragOriginStart extends OnEvent {
dragStart: OnDragStart | false;
}
export interface OnDragOrigin extends OnEvent {
width: number;
height: number;
delta: number[];
dist: number[];
origin: number[];
transformOrigin: string;
drag: OnDrag;
}
export interface OnDragOriginEnd extends OnEndEvent {
}
export interface OnRoundStart extends OnEvent {
}
export interface OnRound extends OnEvent {
width: number;
height: number;
delta: number[];
dist: number[];
horizontals: number[];
verticals: number[];
borderRadius: string;
}
export interface OnRoundEnd extends OnEndEvent {
}
export interface OnScaleStart extends OnEvent, OnTransformStartEvent {
direction: number[];
dragStart: OnDragStart | false;
set: (scale: number[]) => void;
setFixedDirection: (fixedDirection: number[]) => void;
setRatio: (ratio: number) => any;
}
export interface OnScale extends OnEvent, OnTransformEvent {
direction: number[];
offsetWidth: number;
offsetHeight: number;
scale: number[];
dist: number[];
delta: number[];
isPinch: boolean;
}
export interface OnScaleEnd extends OnEndEvent {
}
export interface OnResizeStart extends OnEvent {
direction: number[];
dragStart: OnDragStart | false;
set: (size: number[]) => any;
setMin: (minSize: number[]) => any;
setMax: (maxSize: number[]) => any;
setOrigin: (origin: Array<string | number>) => any;
setFixedDirection: (startDirecition: number[]) => any;
setRatio: (ratio: number) => any;
}
export interface OnResize extends OnEvent {
direction: number[];
width: number;
height: number;
offsetWidth: number;
offsetHeight: number;
dist: number[];
delta: number[];
isPinch: boolean;
drag: OnDrag;
}
export interface OnResizeEnd extends OnEndEvent {
}
export interface OnRotateStart extends OnEvent, OnTransformStartEvent {
set: (rotate: number) => void;
dragStart: OnDragStart | false;
}
export interface OnRotate extends OnEvent {
beforeDist: number;
beforeDelta: number;
beforeRotate: number;
dist: number;
delta: number;
rotate: number;
absoluteDist: number;
absoluteDelta: number;
absoluteRotate: number;
transform: string;
isPinch: boolean;
drag: OnDrag;
}
export interface OnRotateEnd extends OnEndEvent {
}
export interface OnWarpStart extends OnEvent, OnTransformStartEvent {
set: (matrix: number[]) => any;
}
export interface OnWarp extends OnEvent {
transform: string;
delta: number[];
dist: number[];
matrix: number[];
multiply: (matrix1: number[], matrix2: number[], n?: number) => number[];
}
export interface OnWarpEnd extends OnEndEvent {
}
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 extends OnDragEnd {
targets: Array<HTMLElement | SVGElement>;
}
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;
}>;
set: (rotation: number) => any;
}
export interface OnRotateGroupEnd extends OnRotateEnd {
targets: Array<HTMLElement | SVGElement>;
}
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 extends OnResizeEnd {
targets: Array<HTMLElement | SVGElement>;
}
export interface OnScaleGroupStart extends OnScaleStart {
targets: Array<HTMLElement | SVGElement>;
events: OnScaleStart[];
}
export interface OnScaleGroup extends OnScale {
targets: Array<HTMLElement | SVGElement>;
events: OnScale[];
}
export interface OnScaleGroupEnd extends OnScaleEnd {
targets: Array<HTMLElement | SVGElement>;
}
export interface OnPinchGroupStart extends OnPinchStart {
targets: Array<HTMLElement | SVGElement>;
}
export interface OnPinchGroup extends OnPinch {
targets: Array<HTMLElement | SVGElement>;
}
export interface OnPinchGroupEnd extends OnPinchEnd {
targets: Array<HTMLElement | SVGElement>;
}
export interface OnClick extends OnEvent {
inputTarget: Element;
isTarget: boolean;
containsTarget: boolean;
isDouble: boolean;
}
export interface OnClickGroup extends OnEvent {
targets: Element[];
inputTarget: Element;
isTarget: boolean;
containsTarget: boolean;
targetIndex: number;
isDouble: boolean;
}
export interface OnBeforeRenderStart extends OnEvent {
isPinch: boolean;
setTransform(transform: string | string[]): any;
}
export interface OnBeforeRender extends OnEvent {
isPinch: boolean;
}
export interface OnBeforeRenderEnd extends OnEvent {
isPinch: boolean;
isDrag: boolean;
}
export interface OnBeforeRenderGroupStart extends OnBeforeRenderStart {
targets: Array<HTMLElement | SVGElement>;
events: OnBeforeRenderStart[];
}
export interface OnBeforeRenderGroup extends OnBeforeRender {
targets: Array<HTMLElement | SVGElement>;
events: OnBeforeRender[];
}
export interface OnBeforeRenderGroupEnd extends OnBeforeRenderEnd {
targets: Array<HTMLElement | SVGElement>;
}
export interface OnRenderStart extends OnEvent {
isPinch: boolean;
}
export interface OnRender extends OnEvent {
isPinch: boolean;
}
export interface OnRenderEnd extends OnEvent {
isPinch: boolean;
isDrag: boolean;
}
export declare type EventInterface<T extends IObject<any> = {}> = {
[key in keyof T]?: (e: T[key]) => any;
};
export interface OnScroll extends OnEvent {
scrollContainer: HTMLElement;
direction: number[];
}
export interface OnScrollGroup extends OnScroll {
targets: Array<HTMLElement | SVGElement>;
}
export interface OnRenderGroupStart extends OnRenderStart {
targets: Array<HTMLElement | SVGElement>;
}
export interface OnRenderGroup extends OnRender {
targets: Array<HTMLElement | SVGElement>;
}
export interface OnRenderGroupEnd extends OnRenderEnd {
targets: Array<HTMLElement | SVGElement>;
}
export interface DraggableOptions {
draggable?: boolean;
throttleDrag?: number;
throttleDragRotate?: number;
startDragRotate?: number;
edgeDraggable?: boolean;
}
export interface DraggableEvents {
onDragStart: OnDragStart;
onDrag: OnDrag;
onDragEnd: OnDragEnd;
onDragGroupStart: OnDragGroupStart;
onDragGroup: OnDragGroup;
onDragGroupEnd: OnDragGroupEnd;
}
export interface DraggableProps extends DraggableOptions, EventInterface<DraggableEvents> {
}
export interface DraggableState {
dragInfo: {
startRect: RectInfo;
dist: number[];
} | null;
}
export interface PaddingOptions {
padding?: PaddingBox;
}
export interface OriginOptions {
origin?: boolean;
}
export interface OriginDraggableOptions {
originDraggable?: boolean;
originRelative?: boolean;
}
export interface OriginDraggableEvents {
onDragOriginStart: OnDragOriginStart;
onDragOrigin: OnDragOrigin;
onDragOriginEnd: OnDragOriginEnd;
}
export interface OriginDraggableProps extends OriginDraggableOptions, EventInterface<OriginDraggableEvents> {
}
export interface RoundableOptions {
roundable?: boolean;
roundRelative?: boolean;
minRoundControls?: number[];
maxRoundControls?: number[];
roundClickable?: boolean;
}
export interface RoundableEvents {
onRoundStart: OnRoundStart;
onRound: OnRound;
onRoundEnd: OnRoundEnd;
}
export interface RoundableProps extends RoundableOptions, EventInterface<RoundableEvents> {
}
export interface RoundableState {
borderRadiusState?: string;
}
export interface ResizableOptions extends RenderDirections {
resizable?: boolean;
throttleResize?: number;
keepRatio?: boolean;
}
export interface ResizableEvents {
onResizeStart: OnResizeStart;
onResize: OnResize;
onResizeEnd: OnResizeEnd;
onResizeGroupStart: OnResizeGroupStart;
onResizeGroup: OnResizeGroup;
onResizeGroupEnd: OnResizeGroupEnd;
}
export interface ResizableProps extends ResizableOptions, EventInterface<ResizableEvents> {
}
export interface ScalableOptions extends RenderDirections {
scalable?: boolean;
throttleScale?: number;
keepRatio?: boolean;
}
export interface ScalableEvents {
onScaleStart: OnScaleStart;
onScale: OnScale;
onScaleEnd: OnScaleEnd;
onScaleGroupStart: OnScaleGroupStart;
onScaleGroup: OnScaleGroup;
onScaleGroupEnd: OnScaleGroupEnd;
}
export interface ScalableProps extends ScalableOptions, EventInterface<ScalableEvents> {
}
export interface GapGuideline extends SnapGuideline {
renderPos: number[];
inner?: boolean;
}
export interface RenderDirections {
renderDirections?: boolean | string[];
}
export interface RotatableOptions extends RenderDirections {
rotatable?: boolean;
rotationPosition?: "top" | "bottom" | "left" | "right" | "top-right" | "top-left" | "bottom-right" | "bottom-left" | "left-top" | "left-bottom" | "right-top" | "right-bottom" | "none";
throttleRotate?: number;
rotationTarget?: MoveableRefType | ArrayFormat<MoveableRefType> | false;
}
export interface RotatableEvents {
onRotateStart: OnRotateStart;
onRotate: OnRotate;
onRotateEnd: OnRotateEnd;
onRotateGroupStart: OnRotateGroupStart;
onRotateGroup: OnRotateGroup;
onRotateGroupEnd: OnRotateGroupEnd;
}
export interface RotatableProps extends RotatableOptions, EventInterface<RotatableEvents> {
}
export interface WarpableOptions {
warpable?: boolean;
renderDirections?: boolean | string[];
}
export interface WarpableEvents {
onWarpStart: OnWarpStart;
onWarp: OnWarp;
onWarpEnd: OnWarpEnd;
}
export interface WarpableProps extends WarpableOptions, EventInterface<WarpableEvents> {
}
export interface PinchableOptions {
pinchable?: boolean | Array<"rotatable" | "resizable" | "scalable">;
}
export interface PinchableEvents {
onPinchStart: OnPinchStart;
onPinch: OnPinch;
onPinchEnd: OnPinchEnd;
onPinchGroupStart: OnPinchGroupStart;
onPinchGroup: OnPinchGroup;
onPinchGroupEnd: OnPinchGroupEnd;
}
export interface PinchableProps extends PinchableOptions, ResizableProps, ScalableProps, RotatableProps, EventInterface<PinchableEvents> {
}
export interface GroupableOptions {
defaultGroupRotate?: number;
defaultGroupOrigin?: string;
groupable?: boolean;
}
export interface IndividualGroupableOptions {
individualGroupable?: boolean;
}
export interface IndividualGroupableProps extends IndividualGroupableOptions {
}
export interface GroupableProps extends GroupableOptions {
targets?: Array<HTMLElement | SVGElement>;
updateGroup?: boolean;
}
export interface SnappableOptions {
snappable?: boolean | string[];
snapContainer?: MoveableRefType<HTMLElement | SVGElement>;
snapDirections?: boolean | SnapDirections;
elementSnapDirections?: boolean | SnapDirections;
snapGap?: boolean;
snapThreshold?: number;
snapDigit?: number;
snapGridWidth?: number;
snapGridHeight?: number;
isDisplaySnapDigit?: boolean;
isDisplayInnerSnapDigit?: boolean;
horizontalGuidelines?: number[];
verticalGuidelines?: number[];
elementGuidelines?: Array<ElementGuidelineValue | MoveableRefType<Element>>;
bounds?: BoundType;
innerBounds?: InnerBoundType;
snapDistFormat?: (distance: number) => number | string;
}
export interface SnapDirections {
left?: boolean;
top?: boolean;
right?: boolean;
bottom?: boolean;
center?: boolean;
middle?: boolean;
}
export interface ElementGuidelineValue extends SnapDirections {
element: Element;
refresh?: boolean;
className?: string;
}
export interface ElementGuidelineValue extends SnapDirections {
element: Element;
refresh?: boolean;
className?: string;
}
export interface SnappableEvents {
onSnap: OnSnap;
}
export interface SnappableProps extends SnappableOptions, EventInterface<SnappableEvents> {
onSnap?: (e: OnSnap) => any;
}
export interface OnSnap {
guidelines: SnapGuideline[];
elements: SnapGuideline[];
gaps: SnapGuideline[];
}
export interface InnerBoundType {
left: number;
top: number;
width: number;
height: number;
}
export interface BoundType {
position?: "client" | "css";
left?: number;
top?: number;
right?: number;
bottom?: number;
}
export interface SnapDirectionPoses {
left?: number;
top?: number;
right?: number;
bottom?: number;
center?: number;
middle?: number;
}
export interface SnapElementRect extends ElementGuidelineValue {
rect: SnapDirectionPoses;
}
export interface SnappableState {
staticGuidelines: SnapGuideline[];
elementRects: SnapElementRect[];
guidelines: SnapGuideline[];
snapOffset: {
left: number;
top: number;
bottom: number;
right: number;
};
snapRenderInfo?: SnapRenderInfo | null;
enableSnap: boolean;
}
export interface SnapRenderInfo {
direction?: number[];
snap?: boolean;
center?: boolean;
request?: boolean;
externalPoses?: number[][];
externalBounds?: BoundType | false | null;
}
export interface ScrollableOptions {
scrollable?: boolean;
scrollContainer?: MoveableRefType<HTMLElement>;
scrollThreshold?: number;
getScrollPosition?: (e: {
scrollContainer: HTMLElement;
direction: number[];
}) => number[];
}
export interface ScrollableEvents {
onScroll: OnScroll;
onScrollGroup: OnScrollGroup;
}
export interface ScrollableProps extends ScrollableOptions, EventInterface<ScrollableEvents> {
}
export interface DragAreaOptions {
dragArea?: boolean;
passDragArea?: boolean;
}
export interface DragAreaProps extends DragAreaOptions {
}
export interface ClickableEvents {
onClick: OnClick;
onClickGroup: OnClickGroup;
}
export interface ArrayFormat<T = any> {
length: number;
[key: number]: T;
}
export interface ClickableProps extends EventInterface<ClickableEvents> {
}
export interface BeforeRenderableEvents {
onBeforeRenderStart: OnBeforeRenderStart;
onBeforeRender: OnBeforeRender;
onBeforeRenderEnd: OnBeforeRenderEnd;
onBeforeRenderGroupStart: OnBeforeRenderGroupStart;
onBeforeRenderGroup: OnBeforeRenderGroup;
onBeforeRenderGroupEnd: OnBeforeRenderGroupEnd;
}
export interface BeforeRenderableProps extends EventInterface<BeforeRenderableEvents> {
}
export interface RenderableEvents {
onRenderStart: OnRenderStart;
onRender: OnRender;
onRenderEnd: OnRenderEnd;
onRenderGroupStart: OnRenderGroupStart;
onRenderGroup: OnRenderGroup;
onRenderGroupEnd: OnRenderGroupEnd;
}
export interface RenderableProps extends EventInterface<RenderableEvents> {
}
export interface ClippableOptions {
clippable?: boolean;
customClipPath?: string;
defaultClipPath?: string;
clipRelative?: boolean;
dragWithClip?: boolean;
clipArea?: boolean;
clipTargetBounds?: boolean;
clipVerticalGuidelines?: Array<string | number>;
clipHorizontalGuidelines?: Array<string | number>;
clipSnapThreshold?: number;
}
export interface ClippableEvents {
onClipStart: OnClipStart;
onClip: OnClip;
onClipEnd: OnClipEnd;
}
export interface ClippableProps extends ClippableOptions, EventInterface<ClippableEvents> {
}
export interface ClippableState {
clipPathState?: string;
snapBoundInfos?: {
vertical: Required<SnapBoundInfo>;
horizontal: Required<SnapBoundInfo>;
} | null;
}
export interface OnClipStart extends OnEvent {
clipType: "polygon" | "circle" | "ellipse" | "inset" | "rect";
poses: number[][];
clipStyle: string;
}
export interface OnClip extends OnEvent {
clipType: "polygon" | "circle" | "ellipse" | "inset" | "rect";
clipEventType: "added" | "changed" | "removed";
poses: number[][];
distX: number;
distY: number;
clipStyle: string;
clipStyles: string[];
}
export interface OnClipEnd extends OnEndEvent {
}
export interface OnCustomDrag extends GestoTypes.Position {
type: string;
inputEvent: any;
isDrag: boolean;
datas: IObject<any>;
originalDatas: IObject<any>;
parentEvent: boolean;
parentGesto: CustomGesto;
}
export interface RectInfo {
pos1: number[];
pos2: number[];
pos3: number[];
pos4: number[];
left: number;
top: number;
width: number;
height: number;
offsetWidth: number;
offsetHeight: number;
origin: number[];
beforeOrigin: number[];
transformOrigin: number[];
rotation: number;
children?: RectInfo[];
}
export interface HitRect {
top: number;
left: number;
width?: number;
height?: number;
}
export interface MoveableManagerInterface<T = {}, U = {}> extends MoveableInterface {
moveables?: MoveableManagerInterface[];
props: MoveableManagerProps<T>;
state: MoveableManagerState<U>;
rotation: number;
scale: number[];
controlGesto: Gesto;
targetGesto: Gesto;
enabledAbles: Able[];
controlAbles: Able[];
targetAbles: Able[];
areaElement: HTMLElement;
controlBox: {
getElement(): HTMLElement;
};
isUnmounted: boolean;
useCSS(tag: string, css: string): any;
getContainer(): HTMLElement | SVGElement;
getRotation(): number;
forceUpdate(): any;
triggerEvent(name: string, params: IObject<any>, isManager?: boolean): any;
onPreventClick(e: any): void;
}
export interface MoveableGroupInterface<T = {}, U = {}> extends MoveableManagerInterface<T, U> {
moveables: MoveableManagerInterface[];
props: MoveableManagerProps<T> & {
targets: Array<HTMLElement | SVGElement>;
};
transformOrigin: string;
}
export interface MoveableInterface {
getManager(): MoveableManagerInterface<any, any>;
getRect(): RectInfo;
isMoveableElement(target: Element): boolean;
updateRect(type?: "Start" | "" | "End", isTarget?: boolean, isSetState?: boolean): void;
updateTarget(): void;
request(ableName: string, params?: IObject<any>, isInstant?: boolean): Requester;
destroy(): void;
dragStart(e: MouseEvent | TouchEvent): void;
isInside(clientX: number, clientY: number): boolean;
isDragging(): boolean;
hitTest(el: Element | HitRect): number;
setState(state: any, callback?: () => any): any;
}
export interface ControlPose {
vertical: number;
horizontal: number;
pos: number[];
sub?: boolean;
raw?: number;
direction?: "n" | "e" | "s" | "w" | "nw" | "ne" | "sw" | "se" | "nesw";
}
export declare type AnyProps<T extends IObject<any>> = Required<{
[key in keyof T]: any;
}>;
export declare type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;
export declare type MoveableEvents = {
[key in keyof typeof MOVEABLE_EVENTS_MAP]: Parameters<Required<MoveableProps>[typeof MOVEABLE_EVENTS_MAP[key]]>[0];
};
export declare type MoveableProperties = {
-readonly [key in keyof typeof MOVEABLE_PROPS_MAP]: MoveableProps[key];
};
export interface SnappableRenderType {
type: "snap" | "bounds";
pos: number;
}
export declare type ExcludeParams<T> = ExcludeKeys<T, "moveable" | "target" | "clientX" | "clientY" | "inputEvent" | "datas" | "currentTarget">;
export declare type ExcludeEndParams<T> = ExcludeKeys<ExcludeParams<T>, "lastEvent" | "isDrag" | "isDouble">;
export declare type DefaultProps<Name extends string, AbleObject extends Partial<Able<any, any>>> = AbleObject extends {
props: {};
} ? AbleObject["props"] : {
readonly [key in Name]: BooleanConstructor;
};