react-moveable
Version:
A React Component that create Moveable, Draggable, Resizable, Scalable, Rotatable, Warpable, Pinchable, Groupable.
1,843 lines • 88.5 kB
TypeScript
import { IObject } from "@daybrush/utils";
import Gesto, * as GestoTypes from "gesto";
import CustomGesto from "./gesto/CustomGesto";
import { MoveableTargetInfo } from "./utils/getMoveableTargetInfo";
import { DragScrollOptions } from "@scena/dragscroll";
import { MOVEABLE_PROPS, MOVEABLE_EVENTS } 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;
isWrapperMounted?: boolean;
parentMoveable?: MoveableManagerInterface | null;
parentPosition?: number[] | null;
groupable?: boolean;
} & MoveableDefaultOptions & (unknown extends T ? IObject<any> : T);
export declare type AnyObject<T> = (unknown extends T ? IObject<any> : T);
/**
* @typedef
* @memberof Moveable
*/
export interface MoveablePosition {
left: number;
top: number;
right: number;
bottom: number;
origin: number[];
pos1: number[];
pos2: number[];
pos3: number[];
pos4: number[];
direction: 1 | -1;
}
/**
* @typedef
* @memberof Moveable
* @options
*/
export interface DefaultOptions {
/**
* The target(s) to indicate Moveable Control Box.
* @default null
*/
target?: SVGElement | HTMLElement | null;
/**
* The external target(s) to drag Moveable target(s)
* @default target
*/
dragTarget?: MoveableRefType | null;
/**
* If dragTarget is set directly, taget itself cannot be dragged.
* Whether to drag the target as well.
* @default false
*/
dragTargetSelf?: boolean;
/**
* Container area where drag works
* @default window
*/
dragContainer?: null | Window | MoveableRefType<HTMLElement>;
/**
* A container into which Moveables are inserted.
* Set it only when used within the slot of Web Components or when the container is different.
* @default parentElement
*/
container?: SVGElement | HTMLElement | null;
/**
* Whether to warp itself to the container itself. Don't set it.
* @private
* @default false
*/
warpSelf?: boolean;
/**
* Moveable Root Container (No Transformed Container)
* @default parentElement
* @story options--options-root-container
*/
rootContainer?: MoveableRefType<HTMLElement>;
/**
* If you want to set the dragging information to the viewer, refer to the following.
* @default null
* @story options--options-view-container
*/
viewContainer?: MoveableRefType<HTMLElement>;
/**
* Whether the target size is detected and updated whenever it changes.
* It is more effective when used together with `useMutationObserver`.
* @default false
* @story options--options-resize-observer
*/
useResizeObserver?: boolean;
/**
* Whether the target size, pos in inline style is detected and updated whenever it changes.
* It is more effective when used together with `useResizeObserver`.
* @default false
* @story options--options-mutation-observer
*/
useMutationObserver?: boolean;
/**
* Zooms in the elements of a moveable.
* @default 1
*/
zoom?: number;
/**
* The default transformOrigin of the target can be set in advance.
* @default ""
*/
transformOrigin?: Array<string | number> | string | "";
/**
* You can add your custom able.
* @default []
*/
ables?: Able[];
/**
* You can specify the className of the moveable controlbox.
* @default ""
*/
className?: string;
/**
* Minimum distance to pinch.
* @default 20
*/
pinchThreshold?: number;
/**
* Whether the container containing the target becomes a pinch.
* @default true
*/
pinchOutside?: boolean;
/**
* Lets generate events of ables at the same time. (like Resizable, Scalable)
* @default false
*/
triggerAblesSimultaneously?: boolean;
/**
* Checks whether this is an element to input text or contentEditable, and prevents dragging.
* @default false
*/
checkInput?: boolean;
/**
* add nonce property to style for CSP.
* @deprecated
* @default ""
*/
cspNonce?: string;
/**
* You can set the translateZ value of moveable.
* @default 50
*/
translateZ?: number | string;
/**
* Whether to hide the line corresponding to the rect of the target.
* @default false
*/
hideDefaultLines?: boolean;
/**
* Whether to prevent bubbling of events like mousedown, touchstart, etc.
* @default false
*/
stopPropagation?: boolean;
/**
* Whether to call preventDefault on touchstart or mousedown
* @since 0.44.0
* @default true
*/
preventDefault?: boolean;
/**
* Whether to prevent dragging using the right mouse button
* @default true
*/
preventRightClick?: boolean;
/**
* Whether to prevent dragging using the wheel (middle) mouse button
* @default true
*/
preventWheelClick?: boolean;
/**
* Prevent click event on drag. (mousemove, touchmove)
* @default true
*/
preventClickEventOnDrag?: boolean;
/**
* Whether to drag the focused input
* If `checkInput` is true, this option is not applied.
* @since 0.47.0
* @story options--options-drag-focused-input
* @default false
*/
dragFocusedInput?: boolean;
/**
* Prevent click event on dragStart. (mousedown, touchstart)
* @default false
*/
preventClickDefault?: boolean;
/**
* You can use props in object format or custom props.
* @default empty object
*/
props?: Record<string, any>;
/**
* Data for first render
* @default null
*/
persistData?: PersistRectData | null;
/**
* Whether to accurately show the position of a movable control box
* Because getBoundingClientRect is used, css zoom, transform: rotate between container and rootContainer cannot be used.
* group is not supported.
* @default false
*/
useAccuratePosition?: boolean;
/**
* By adding padding to the line, you can increase the area of the line that can be clicked and dragged.
* @since 0.43.0
* @story options--options-line-padding
* @default 0
*/
linePadding?: number;
/**
* By adding padding to the control, you can increase the area of the control that can be clicked and dragged.
* Either `rotateAroundControls` or `displayAroundControls` can be used.
* @since 0.44.0
* @story options--options-control-padding
* @default 0
*/
controlPadding?: number;
/**
* @private
* single => group로 변환과정에 도형 유지를 위한 첫 렌더링 state
*/
firstRenderState?: MoveableManagerState | null;
/**
* @private
*/
requestStyles?: string[];
/**
* If you are using React 18's concurrent mode, use `flushSync` for UI sync.
* @default empty function
* @example
* ```jsx
* import { flushSync } from "react-dom";
*
* <Moveable flushSync={flushSync} />
* ```
*/
flushSync?: (callback: () => void) => void;
}
/**
* @typedef
* @extends Moveable.DefaultOptions
* @extends Moveable.DragAreaOptions
* @extends Moveable.OriginOptions
* @extends Moveable.PaddingOptions
*/
export interface MoveableDefaultOptions extends DefaultOptions, DragAreaOptions, OriginOptions, PaddingOptions {
}
export interface MatrixInfo {
type: "offset" | "target" | "zoom";
target: SVGElement | HTMLElement;
matrix?: number[];
origin?: number[];
zoom?: number;
}
export declare type MoveableManagerState<T = {}> = {
container: SVGElement | HTMLElement | null | undefined;
disableNativeEvent: boolean;
gestos: Record<string, Gesto | CustomGesto | null>;
renderLines: number[][][];
renderPoses: number[][];
posDelta: number[];
style: Partial<Writable<CSSStyleDeclaration>>;
isPersisted?: boolean;
} & MoveableTargetInfo & T;
/**
* @typedef
* @memberof Moveable
*/
export interface ElementSizes {
svg: boolean;
offsetWidth: number;
offsetHeight: number;
clientWidth: number;
clientHeight: number;
inlineCSSWidth: number;
inlineCSSHeight: number;
cssWidth: number;
cssHeight: number;
contentWidth: number;
contentHeight: number;
minWidth: number;
minHeight: number;
maxWidth: number;
maxHeight: number;
minOffsetWidth: number;
minOffsetHeight: number;
maxOffsetWidth: number;
maxOffsetHeight: number;
}
/**
* @typedef
* @memberof Moveable
*/
export declare type LineDirection = "n" | "e" | "s" | "w" | "nw" | "ne" | "sw" | "se";
/**
* @typedef
* @memberof Moveable
* @property - left padding
* @property - top padding
* @property - right padding
* @property - bottom padding
*/
export interface PaddingBox {
left?: number;
top?: number;
right?: number;
bottom?: number;
}
export interface Renderer {
createElement(type: any, props?: any, ...children: any[]): any;
}
/**
* @typedef
* @memberof Moveable.Snappable
*/
export interface SnapGuideline {
type: "horizontal" | "vertical";
direction: string;
hide?: boolean;
element?: Element | null;
isStart?: boolean;
isEnd?: boolean;
isCenter?: boolean;
isInner?: boolean;
grid?: boolean;
pos: number[];
size: number;
className?: string;
sizes?: number[];
gap?: number;
elementDirection?: string;
elementRect?: SnapElementRect;
gapRects?: SnapElementRect[];
}
/**
* @typedef
* @memberof Moveable.Snappable
*/
export interface SnapElementGuideline extends SnapGuideline {
}
export interface SnapBoundInfo {
isBound: boolean;
isSnap: boolean;
offset: number;
dist: number;
snapIndex?: number;
bounds?: BoundInfo[];
snap?: SnapInfo;
}
export interface BoundInfo {
direction?: "start" | "end";
isBound: boolean;
offset: number;
pos: number;
}
export interface SnapOffsetInfo {
isSnap: boolean;
offset: number;
pos: number;
}
export interface SnapDirectionInfo extends SnapInfo {
direction: string;
}
export interface SnapInfo {
isSnap: boolean;
index: number;
direction: string;
posInfos: SnapPosInfo[];
}
export interface SnapPosInfo {
pos: number;
index: number;
direction: string;
guidelineInfos: SnapGuidelineInfo[];
}
export interface SnapGuidelineInfo {
dist: number;
offset: number;
direction: string;
guideline: SnapGuideline;
}
/**
* @typedef
* @memberof Moveable.Snappable
*/
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 {
}
/**
* @memberof Moveable
* @typedef
*/
export interface MoveableDefaultEvents {
onChangeTargets?: (e: OnChangeTargets) => void;
}
export interface MoveableInitalOptions extends ExcludeKeys<MoveableDefaultOptions, "target"> {
target?: MoveableRefTargetType;
}
/**
* @memberof Moveable
* @typedef
* @extends Moveable.MoveableDefaultOptions
* @extends Moveable.MoveableDefaultEvents
*/
export interface MoveableDefaultProps extends MoveableInitalOptions, MoveableDefaultEvents {
}
/**
* @memberof Moveable
* @typedef
*/
export declare type MoveableRefTargetType = MoveableRefType | ArrayFormat<MoveableRefTargetType>;
export declare type MoveableRefTargetsResultType = Array<HTMLElement | SVGElement | string | null | MoveableRefTargetsResultType>;
/**
* @memberof Moveable
* @typedef
*/
export declare type MoveableRefType<T extends Element = HTMLElement | SVGElement> = string | (() => T) | MoveableRefObject<T> | T | null | undefined;
/**
* @memberof Moveable
* @typedef
*/
export interface MoveableRefObject<T extends Element = HTMLElement | SVGElement> {
current: T | undefined | null;
}
/**
* @memberof Moveable
* @typedef
* @extends Moveable.MoveableDefaultProps
* @extends Moveable.Draggable.DraggableOptions
* @extends Moveable.Resizable.ResizableOptions
* @extends Moveable.Scalable.ScalableOptions
* @extends Moveable.Rotatable.RotatableOptions
* @extends Moveable.Warpable.WarpableOptions
* @extends Moveable.Pinchable.PinchableOptions
* @extends Moveable.Group.GroupableOptions
* @extends Moveable.OriginDraggable.OriginDraggableOptions
* @extends Moveable.Scrollable.ScrollableOptions
* @extends Moveable.Clippable.ClippableOptions
* @extends Moveable.Roundable.RoundableOptions
* @extends Moveable.Clickable.ClickableOptions
*/
export interface MoveableOptions extends MoveableInitalOptions, DraggableOptions, DragAreaOptions, OriginDraggableOptions, RotatableOptions, ResizableOptions, ScalableOptions, WarpableOptions, PinchableOptions, GroupableOptions, IndividualGroupableOptions, SnappableOptions, ScrollableOptions, ClippableOptions, RoundableOptions, ClickableOptions {
}
export declare type MoveableState = MoveableManagerState;
/**
* You can make Able that can work in Moveable.
* @typedef
* In Able, you can manage drag events, props, state, fire event props, and render elements.
* @memberof Moveable
*/
export interface Able<Props extends IObject<any> = IObject<any>, Events extends IObject<any> = IObject<any>> {
name: string;
props?: readonly (keyof Props)[];
events?: readonly (keyof Events)[];
always?: boolean;
ableGroup?: string;
updateRect?: boolean;
canPinch?: boolean;
css?: string[];
/**
* You can request style. Specify the name of the style in camel case.
* You can check it with `moveable.state.style`
* @exmaple
* ["borderRadius", "top", "left"]
*/
requestStyle?(): string[];
/**
* If you use group, you can request child style. Specify the name of the style in camel case.
* You can check it with `moveable.state.style`
* @exmaple
* ["borderRadius", "top", "left"]
*/
requestChildStyle?(): string[];
/**
* You can specify the class name to be added to the Moveable control box.
*/
className?(moveable: any): string;
/**
* You can specify the class name to be added to the Moveable View Container
*/
viewClassName?(moveable: any): string;
/**
* Check how related to drag
*/
dragRelation?: "strong" | "weak" | undefined | null | false;
/**
* Fired when the event is cleared
*/
unset?(moveable: any): any;
/**
* Renders the React DOM structure for the able.
*/
render?(moveable: any, renderer: Renderer): any;
dragStart?(moveable: any, e: any): any;
drag?(moveable: any, e: any): any;
dragEnd?(moveable: any, e: any): any;
dragAfter?(moveable: any, e: any): 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: any): any;
dragControl?(moveable: any, e: any): any;
dragControlEnd?(moveable: any, e: any): any;
dragControlAfter?(moveable: any, e: any): any;
dragGroupCondition?(moveable: any, e: any): boolean;
dragGroupStart?(moveable: any, e: any): any;
dragGroup?(moveable: any, e: any): any;
dragGroupEnd?(moveable: any, e: any): 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: any): any;
dragGroupControl?(moveable: any, e: any): any;
dragGroupControlEnd?(moveable: any, e: any): 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;
}
/**
* @typedef
* @memberof Moveable
*/
export interface OnEvent {
/**
* The Moveable instance
*/
currentTarget: MoveableManagerInterface<Record<string, any>, Record<string, any>>;
/**
* The Moveable instance
*/
moveable: MoveableManagerInterface<Record<string, any>, Record<string, any>>;
/**
* The Moveable's target
*/
target: HTMLElement | SVGElement;
/**
* The horizontal coordinate within the application's client area at which the event occurred.
*/
clientX: number;
/**
* The vertical coordinate within the application's client area at which the event occurred.
*/
clientY: number;
/**
* Whether this is the first drag in the drag event
*/
isFirstDrag: number;
/**
* Objects that can send information to the following events.
*/
datas: IObject<any>;
/**
* The mouse or touch input event that is invoking the moveable event
*/
inputEvent: any;
/**
* Stop the currently working able.
*/
stopAble(): void;
/**
* Calling `stopDrag` in a drag-related event ends the drag.
*/
stopDrag(): void;
/**
* Whether the event did not occur externally
*/
isTrusted: boolean;
}
/**
* @typedef
* @memberof Moveable
* @extends Moveable.OnEvent
* @property - This is the last dragged event. No, if you haven't dragged.
* @property - Whether this moved
* @property - Whether it is double-click
*/
export interface OnEndEvent extends OnEvent {
lastEvent: any | undefined;
isDrag: boolean;
isDouble: boolean;
}
/**
* @typedef
* @memberof Moveable
*/
export interface OnTransformStartEvent {
/**
* Set your original transform.
* `transformIndex` is the sequence of functions used in the event.
* If you use `setTransform`, you don't need to use `set` function.
* @default transform of target's inline style
*/
setTransform(transform: string | string[], transformIndex?: number): void;
/**
* `transformIndex` is the sequence of functions used in the event.
* @default index with that property in transform or last
*/
setTransformIndex(transformIndex: number): void;
}
/**
* @typedef
* @memberof Moveable
* @extends Moveable.CSSObject
*/
export interface TransformObject extends CSSObject {
/**
* a target's next transform string value.
*/
transform: string;
/**
* A transform obtained by the simultaneous occurrence of other events in the current event
*/
afterTransform: string;
}
/**
* @typedef
* @memberof Moveable
* @extends Moveable.TransformObject
*/
export interface OnTransformEvent extends TransformObject {
/**
* transform events causes a `drag` event. In some events, there may be no value.
*/
drag: OnDrag;
}
/**
* @typedef
* @memberof Moveable
*/
export interface AbleRequestParam {
/**
* Run the request instantly. (requestStart, request, requestEnd happen at the same time)
*/
isInstant?: boolean;
[key: string]: any;
}
/**
* @typedef
* @memberof Moveable
* @see {@link https://daybrush.com/moveable/release/latest/doc/Moveable.html#request|Request Method}
* @see {@link https://daybrush.com/moveable/release/latest/doc/Moveable.Draggable.html#request|Draggable Requester}
* @see {@link https://daybrush.com/moveable/release/latest/doc/Moveable.Resizable.html#request|Resizable Requester}
* @see {@link https://daybrush.com/moveable/release/latest/doc/Moveable.Scalable.html#request|Scalable Requester}
* @see {@link https://daybrush.com/moveable/release/latest/doc/Moveable.Rotatable.html#request|Rotatable Requester}
* @property - Continue executing the request.
* @property - End the request.
*/
export interface Requester<RequestParam extends {} = AbleRequestParam> {
request(param: RequestParam): this;
requestEnd(): this;
}
export interface AbleRequester {
isControl: boolean;
requestStart(param: IObject<any>): IObject<any>;
request(param: IObject<any>): IObject<any>;
requestEnd(): IObject<any>;
}
/**
* @typedef
* @memberof Moveable
*/
export interface OnChangeTargets {
/**
* The Moveable instance
*/
moveable: MoveableManagerInterface<any, any>;
/**
* The Moveable's targets
*/
targets: Array<HTMLElement | SVGElement>;
}
/**
* @typedef
* @memberof Moveable.Pinchable
* @extends Moveable.OnEvent
*/
export interface OnPinchStart extends OnEvent {
}
/**
* @typedef
* @memberof Moveable.Pinchable
* @extends Moveable.OnEvent
*/
export interface OnPinch extends OnEvent {
}
/**
* @typedef
* @memberof Moveable.Pinchable
* @extends Moveable.OnEndEvent
*/
export interface OnPinchEnd extends OnEndEvent {
}
/**
* When the drag starts, the dragStart event is called.
* @typedef
* @memberof Moveable.Draggable
* @extends Moveable.OnEvent
* @extends Moveable.OnTransformStartEvent
*/
export interface OnDragStart extends OnEvent, OnTransformStartEvent {
/**
* You can set the start translate value.
*/
set: (translate: number[]) => void;
}
/**
* @typedef
* @memberof Moveable.Draggable
* @extends Moveable.OnEvent
* @extends Moveable.CSSObject
* @property - The delta of [left, top]
* @property - The distance of [left, top]
* @property - The position of [left, top]
* @property - The delta of [translateX, translateY]
* @property - The distance of [translateX, translateY]
* @property - The position of [translateX, translateY]
* @property - a target's transform
* @property - a target's left
* @property - a target's top
* @property - a target's bottom
* @property - a target's offset width
* @property - a target's offset height
* @property - a target's right
* @property - Whether or not it is being pinched.
*/
export interface OnDrag extends OnEvent, CSSObject {
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;
}
/**
* @typedef
* @memberof Moveable.Draggable
* @extends Moveable.OnEndEvent
*/
export interface OnDragEnd extends OnEndEvent {
}
/**
* @typedef
* @memberof Moveable.OriginDraggable
* @extends Moveable.OnEvent
* @property - dragOrigin causes a `dragStart` event.
*/
export interface OnDragOriginStart extends OnEvent {
dragStart: OnDragStart | false;
}
/**
* @typedef
* @memberof Moveable.OriginDraggable
* @extends Moveable.OnEvent
* @extends Moveable.CSSObject
*/
export interface OnDragOrigin extends OnEvent, CSSObject {
/**
* Offset width of target
*/
width: number;
/**
* Offset height of target
*/
height: number;
/**
* The delta of [x, y]
*/
delta: number[];
/**
* The distance of [x, y]
*/
dist: number[];
/**
* The target's moved transform-origin poses
*/
origin: number[];
/**
* The target's moved transform-origin css
*/
transformOrigin: string;
/**
* A transform obtained by the simultaneous occurrence of other events in the current event
*/
afterTransform: string;
/**
* `dragOrigin` causes a `drag` event.
*/
drag: OnDrag;
}
/**
* @typedef
* @memberof Moveable.OriginDraggable
* @extends Moveable.OnEndEvent
*/
export interface OnDragOriginEnd extends OnEndEvent {
}
/**
* @typedef
* @memberof Moveable.Roundable
* @extends Moveable.OnEvent
*/
export interface OnRoundStart extends OnEvent {
}
/**
* @typedef
* @memberof Moveable.Roundable
* @extends Moveable.OnEvent
* @extends Moveable.CSSObject
* @property - Offset width of target
* @property - Offset height of target
* @property - The delta of [x, y]
* @property - The distance of [x, y]
* @property - The target's moved border-radius's horizontal poses
* @property - The target's moved border-radius's vertical poses
* @property - The target's moved border-radius
*/
export interface OnRound extends OnEvent, CSSObject {
width: number;
height: number;
delta: number[];
dist: number[];
horizontals: number[];
verticals: number[];
borderRadius: string;
}
/**
* @typedef
* @memberof Moveable.Roundable
* @extends Moveable.OnEndEvent
*/
export interface OnRoundEnd extends OnEndEvent {
}
/**
* @typedef
* @memberof Moveable.Roundable
* @extends Moveable.OnRoundStart
*/
export interface OnRoundGroupStart extends OnRoundStart {
/**
* moveable's targets
*/
targets: Array<HTMLElement | SVGElement>;
/**
* moveable's child events
*/
events: OnRoundStart[];
}
/**
* @typedef
* @memberof Moveable.Roundable
* @extends Moveable.OnRound
*/
export interface OnRoundGroup extends OnRound {
/**
* moveable's targets
*/
targets: Array<HTMLElement | SVGElement>;
/**
* moveable's child events
*/
events: OnRound[];
}
/**
* @typedef
* @memberof Moveable.Roundable
* @extends Moveable.OnRoundEnd
*/
export interface OnRoundGroupEnd extends OnRoundEnd {
/**
* moveable's targets
*/
targets: Array<HTMLElement | SVGElement>;
/**
* moveable's child events
*/
events: OnRoundEnd[];
}
/**
* @typedef
* @memberof Moveable.Scalable
* @extends Moveable.OnEvent
* @extends Moveable.OnTransformStartEvent
*/
export interface OnScaleStart extends OnEvent, OnTransformStartEvent {
/**
* The direction of scale.
*/
direction: number[];
/**
* scale causes a `dragStart` event.
*/
dragStart: OnDragStart | false;
/**
* You can set the start scale value.
*/
set: (scale: number[]) => void;
/**
* Set a fixed direction to scale.
* @default Opposite direction
*/
setFixedDirection: (startDirecition: number[]) => void;
/**
* Set the ratio of width and height.
* @default offsetWidth / offsetHeight
*/
setRatio: (ratio: number) => void;
/**
* You can set the min scale width, height value.
* scale size = scale value * offset size
* @default [-Infinity, -Infinity]
*/
setMinScaleSize: (min: number[]) => void;
/**
* You can set the max scale width, height value.
* scale size = scale value * offset size
* @default [Infinity, Infinity]
*/
setMaxScaleSize: (max: number[]) => void;
}
/**
* @typedef
* @memberof Moveable.Scalable
* @extends Moveable.OnEvent
*/
export interface OnBeforeScale extends OnEvent {
/**
* Set a fixed direction to scale.
* If fixedDirection is set, the scale values can be changed and can be reconfirmed as a return value.
*/
setFixedDirection: (startDirecition: number[]) => number[];
/**
* fixedDirection set by rotateStart.
*/
startFixedDirection: number[];
/**
* Set target's scale to scaling.
*/
setScale: (scale: number[]) => void;
/**
* a target's scale before snap and throttle and format
*/
scale: number[];
}
/**
* @typedef
* @memberof Moveable.Scalable
* @extends Moveable.OnEvent
* @extends Moveable.OnTransformEvent
* @property - The direction of scale.
* @property - a target's offsetWidth
* @property - a target's offsetHeight
* @property - a target's scale
* @property - The distance of scale
* @property - The delta of scale
* @property - Whether or not it is being pinched.
*/
export interface OnScale extends OnEvent, OnTransformEvent {
direction: number[];
offsetWidth: number;
offsetHeight: number;
scale: number[];
dist: number[];
delta: number[];
isPinch: boolean;
}
/**
* @typedef
* @memberof Moveable.Scalable
* @extends Moveable.OnEndEvent
*/
export interface OnScaleEnd extends OnEndEvent {
}
/**
* @typedef
* @memberof Moveable.Resizable
* @extends Moveable.OnEvent
* @property - The direction of resize.
* @property - resize causes a `dragStart` event.
* @property - You can set the css width, height value.
* @property - You can set the css min width, min height value. (default: min-width)
* @property - You can set the css max width, max height value. (default: max-width)
* @property - You can set the css origin (default: % %)
* @property - Set a fixed direction to resize. (default: Opposite direction)
* @property - Set the ratio of width and height. (default: offsetWidth / offsetHeight)
*/
export interface OnResizeStart extends OnEvent {
/**
* The direction of resize.
*/
direction: number[];
/**
* First set (boundingWidth / boundingHeight) value
*/
startRatio: number;
/**
* resize causes a `dragStart` event.
*/
dragStart: OnDragStart | false;
/**
* You can set the css width, height value.
*/
set: (size: number[]) => any;
/**
* You can set the css min offset width, min offset height value.
* @default [minOffsetWidth, minOffsetHeight])
*/
setMin: (minSize: Array<string | number>) => any;
/**
* You can set the css max offset width, max offset height value.
* @default [maxOffsetWidth, maxOffsetHeight])
*/
setMax: (maxSize: Array<string | number>) => any;
/**
* You can set the css origin
* @default transformOrigin
*/
setOrigin: (origin: Array<string | number>) => any;
/**
* Set a fixed direction to resize.
* @default Opposite direction
*/
setFixedDirection: (startDirecition: number[]) => any;
/**
* Set a fixed direction to resize.
* @default Opposite position
* @private
*/
setFixedPosition: (startPosition: number[]) => any;
/**
* Set the ratio of width and height.
* @default offsetWidth / offsetHeight
*/
setRatio: (ratio: number) => any;
}
/**
* @typedef
* @memberof Moveable.Resizable
* @extends Moveable.OnEvent
*/
export interface OnBeforeResize extends OnEvent {
/**
* Set a fixed direction to resize.
* If fixedDirection is set, the boundingWidth and boundingHeight values can be changed and can be reconfirmed as a return value.
*/
setFixedDirection: (startDirecition: number[]) => number[];
/**
* Set a fixed position to resize.
* If fixedPosition is set, the boundingWidth and boundingHeight values can be changed and can be reconfirmed as a return value.
* @private
*/
setFixedPosition: (startPosition: number[]) => number[];
/**
* fixedDirection set by resizeStart.
*/
startFixedDirection: number[];
/**
* fixedPosition set by resizeStart.
* @private
*/
startFixedPosition: number[];
/**
* Set the bounding size to resizing.
*/
setSize: (size: number[]) => void;
/**
* a target's bounding width before snap and throttle and format
*/
boundingWidth: number;
/**
* a target's bounding height before snap and throttle and format
*/
boundingHeight: number;
}
/**
* @typedef
* @memberof Moveable
*/
export interface CSSObject {
/**
* You can get the style you can get from the event.
*/
style: Record<string, string>;
/**
* You can get it as a cssText that you can get from that event.
*/
cssText: string;
}
/**
* @typedef
* @memberof Moveable.Resizable
* @extends Moveable.OnEvent
* @extends Moveable.OnTransformEvent
*/
export interface OnResize extends OnEvent, OnTransformEvent {
/**
* The direction of resize.
*/
direction: number[];
/**
* a target's cssWidth
*/
width: number;
/**
* a target's cssHeight
*/
height: number;
/**
* a target's offset width as an integer with bounding width
*/
offsetWidth: number;
/**
* a target's offset height as an integer with bounding height
*/
offsetHeight: number;
/**
* a target's bounding width
*/
boundingWidth: number;
/**
* a target's bounding height
*/
boundingHeight: number;
/**
* The distance of [boundingWidth, boundingHeight]
*/
dist: number[];
/**
* The delta of [boundingWidth, boundingHeight]
*/
delta: number[];
/**
* First set (boundingWidth / boundingHeight) value
*/
startRatio: number;
/**
* Whether or not it is being pinched.
*/
isPinch: boolean;
}
/**
* @typedef
* @memberof Moveable.Resizable
* @extends Moveable.OnEndEvent
*/
export interface OnResizeEnd extends OnEndEvent {
}
/**
* @typedef
* @memberof Moveable.Rotatable
* @extends Moveable.OnEvent
* @extends Moveable.OnTransformStartEvent
*/
export interface OnRotateStart extends OnEvent, OnTransformStartEvent {
/**
* You can set the start rotate value.
*/
set: (rotate: number) => void;
/**
* Set a fixed direction to rotate.
* @default target's transformOrigin
*/
setFixedDirection: (fixedDirection: number[]) => void;
/**
* Set a fixed position to rotate.
* @default target's transformOrigin
*/
setFixedPosition: (fixedPosition: number[]) => void;
/**
* rotate causes a `dragStart` event.
*/
dragStart: OnDragStart | false;
/**
* rotate causes a `resizeStart` event.
*/
resizeStart: OnResizeStart | false;
}
/**
* @typedef
* @description Parameters for the `beforeRotate` event
* @memberof Moveable.Rotatable
* @extends Moveable.OnEvent
*/
export interface OnBeforeRotate extends OnEvent {
/**
* The rotation degree before transform is applied before snap and throttle and format
*/
beforeRotation: number;
/**
* The rotation degree before snap and throttle and format
*/
rotation: number;
/**
* The client rotation degree before snap and throttle and format
*/
absoluteRotation: number;
/**
* You can set the value of `rotation`.
*/
setRotation(nextRotation: number): void;
}
/**
* @typedef
* @description Parameters for the `rotate` event
* @memberof Moveable.Rotatable
* @extends Moveable.OnEvent
* @extends Moveable.OnTransformEvent
*/
export interface OnRotate extends OnEvent, OnTransformEvent {
/**
* The distance of rotation degree before transform is applied
*/
beforeDist: number;
/**
* The delta of rotation degree before transform is applied
*/
beforeDelta: number;
/**
* The now rotation degree before transform is applied
* @deprecated
*/
beforeRotate: number;
/**
* The now rotation degree before transform is applied
*/
beforeRotation: number;
/**
* The distance of rotation degree
*/
dist: number;
/**
* The delta of rotation degree
*/
delta: number;
/**
* The now rotation degree
* @deprecated
*/
rotate: number;
/**
* The now rotation degree
*/
rotation: number;
/**
* The distance of client rotation degree
*/
absoluteDist: number;
/**
* The delta of client rotation degree
*/
absoluteDelta: number;
/**
* The now client rotation degree
* @deprecated
*/
absoluteRotate: number;
/**
* The now client rotation degree
*/
absoluteRotation: number;
/**
* Whether or not it is being pinched.
*/
isPinch: boolean;
/**
* rotate causes a `resize` event.
*/
resize?: OnResize;
}
/**
* @typedef
* @memberof Moveable.Rotatable
* @extends Moveable.OnEndEvent
*/
export interface OnRotateEnd extends OnEndEvent {
}
/**
* @typedef
* @memberof Moveable.Warpable
* @extends Moveable.OnEvent
* @extends Moveable.OnTransformStartEvent
* @property - You can set the start matrix value.
*/
export interface OnWarpStart extends OnEvent, OnTransformStartEvent {
set: (matrix: number[]) => any;
}
/**
* @typedef
* @memberof Moveable.Warpable
* @extends Moveable.OnEvent
* @extends Moveable.CSSObject
*/
export interface OnWarp extends OnEvent, CSSObject {
/**
* The delta of warp matrix
*/
delta: number[];
/**
* The dist of warp matrix
*/
dist: number[];
/**
* The calculated warp matrix
*/
matrix: number[];
/**
* a target's transform
*/
transform: string;
/**
* Multiply function that can multiply previous matrix by warp matrix
*/
multiply: (matrix1: number[], matrix2: number[], n?: number) => number[];
}
/**
* @typedef
* @memberof Moveable.Warpable
* @extends Moveable.OnEndEvent
*/
export interface OnWarpEnd extends OnEndEvent {
}
/**
* @typedef
* @memberof Moveable.Draggable
* @extends Moveable.OnDragStart
* @property - targets to drag
* @property - Each `dragStart` event on the targets
*/
export interface OnDragGroupStart extends OnDragStart {
targets: Array<HTMLElement | SVGElement>;
events: OnDragStart[];
}
/**
* @typedef
* @memberof Moveable.Draggable
* @extends Moveable.OnDrag
* @property - The dragging targets
* @property - Each `drag` event on the targets
*/
export interface OnDragGroup extends OnDrag {
targets: Array<HTMLElement | SVGElement>;
events: OnDrag[];
}
/**
* @typedef
* @memberof Moveable.Draggable
* @extends Moveable.OnDragEnd
* @property - The drag finished targets
* @property - Each `dragEnd` event on the targets
*/
export interface OnDragGroupEnd extends OnDragEnd {
targets: Array<HTMLElement | SVGElement>;
events: OnDragEnd[];
}
/**
* @typedef
* @memberof Moveable.Rotatable
* @extends Moveable.OnRotateStart
* @property - targets to rotate
* @property - Each `rotateStart` event on the targets
*/
export interface OnRotateGroupStart extends OnRotateStart {
targets: Array<HTMLElement | SVGElement>;
events: OnRotateStart[];
}
/**
* @typedef
* @description Parameters for the `beforeRotateGroup` event
* @memberof Moveable.Rotatable
* @extends Moveable.OnBeforeRotate
*/
export interface OnBeforeRotateGroup extends OnBeforeRotate {
/**
* The rotating targets
*/
targets: Array<HTMLElement | SVGElement>;
}
/**
* @typedef
* @description Parameters for the `rotateGroup` event
* @memberof Moveable.Rotatable
* @extends Moveable.OnRotate
*/
export interface OnRotateGroup extends OnRotate {
/**
* The rotating targets
*/
targets: Array<HTMLElement | SVGElement>;
/**
* Each `rotate` event on the targets
*/
events: OnRotate[];
/**
* You can set the group's rotation.
* @deprecated
*/
set: (rotation: number) => any;
/**
* You can set the group's rotation.
*/
setGroupRotation: (rotation: number) => any;
}
/**
* @typedef
* @memberof Moveable.Rotatable
* @extends Moveable.OnRotateEnd
* @property - The rotate finished targets
* @property - Each `rotateEnd` event on the targets
*/
export interface OnRotateGroupEnd extends OnRotateEnd {
targets: Array<HTMLElement | SVGElement>;
events: OnRotateEnd[];
}
/**
* @typedef
* @memberof Moveable.Resizable
* @extends Moveable.OnResizeStart
* @property - targets to resize
* @property - Each `resizeStart` event on the targets
*/
export interface OnResizeGroupStart extends OnResizeStart {
targets: Array<HTMLElement | SVGElement>;
events: OnResizeStart[];
}
/**
* @typedef
* @memberof Moveable.Resizable
* @extends Moveable.OnBeforeResize
*/
export interface OnBeforeResizeGroup extends OnBeforeResize {
/**
* The resizing targets
*/
targets: Array<HTMLElement | SVGElement>;
}
/**
* @typedef
* @memberof Moveable.Resizable
* @extends Moveable.OnResize
* @property - The resizing targets
* @property - Each `resize`event on the targets
*/
export interface OnResizeGroup extends OnResize {
targets: Array<HTMLElement | SVGElement>;
events: OnResize[];
}
/**
* @typedef
* @memberof Moveable.Resizable
* @extends Moveable.OnResizeEnd
* @property - The resize finished targets
* @property - Each `resizeEnd` event on the targets
*/
export interface OnResizeGroupEnd extends OnResizeEnd {
targets: Array<HTMLElement | SVGElement>;
events: OnResizeEnd[];
}
/**
* @typedef
* @memberof Moveable.Scalable
* @extends Moveable.OnScaleStart
* @property - targets to scale
* @property - Each `scaleStart` & `dragStart` event on the targets
*/
export interface OnScaleGroupStart extends OnScaleStart {
targets: Array<HTMLElement | SVGElement>;
events: OnScaleStart[];
}
/**
* @typedef
* @memberof Moveable.Scalable
* @extends Moveable.OnBeforeScale
* @property - The scaling targets
*/
export interface OnBeforeScaleGroup extends OnBeforeScale {
targets: Array<HTMLElement | SVGElement>;
}
/**
* @typedef
* @memberof Moveable.Scalable
* @extends Moveable.OnScale
* @property - The scaling targets
* @property - Each `scale` & `drag` event on the targets
*/
export interface OnScaleGroup extends OnScale {
targets: Array<HTMLElement | SVGElement>;
events: OnScale[];
}
/**
* @typedef
* @memberof Moveable.Scalable
* @extends Moveable.OnScaleEnd
* @property - The scale finished targets
* @property - Each `scaleEnd` event on the targets
*/
export interface OnScaleGroupEnd extends OnScaleEnd {
targets: Array<HTMLElement | SVGElement>;
events: OnScaleEnd[];
}
/**
* @typedef
* @memberof Moveable.Pinchable
* @extends Moveable.OnPinchStart
* @property - targets to pinch
*/
export interface OnPinchGroupStart extends OnPinchStart {
targets: Array<HTMLElement | SVGElement>;
}
/**
* @typedef
* @memberof Moveable.Pinchable
* @extends Moveable.OnPinch
* @property - targets to pinch
*/
export interface OnPinchGroup extends OnPinch {
targets: Array<HTMLElement | SVGElement>;
}
/**
* @typedef
* @memberof Moveable.Pinchable
* @extends Moveable.OnPinchEnd
* @property - The pinch finished targets
*/
export interface OnPinchGroupEnd extends OnPinchEnd {
targets: Array<HTMLElement | SVGElement>;
}
/**
* @typedef
* @memberof Moveable
* @extends Moveable.OnEvent
*/
export interface OnClick extends OnEvent {
/**
* Clicked element.
*/
inputTarget: Element;
/**
* clicked moveable target
*/
moveableTarget: HTMLElement | SVGElement | null;
/**
* Whether the clicked target is moveable target.
*/
isTarget: boolean;
/**
* Whether the clicked target is a child of moveable target.
*/
containsTarget: boolean;
/**
* Whether it is double-click
*/
isDouble: boolean;
}
/**
* @typedef
* @memberof Moveable
* @extends Moveable.OnClick
*/
export interface OnClickGroup extends OnClick {
/**
* targets set to group.
*/
targets: Element[];
/**
* The corresponding index among the targets set as a group.
*/
targetIndex: number;
}
/**
* `beforeRenderStart` event occurs before the first start of all events.
* @typedef
* @memberof Moveable
* @extends Moveable.OnEvent
* @property - Whether or not it is being pinched.
* @property - Set your original transform.
*/
export interface OnBeforeRenderStart extends OnEvent {
isPinch: boolean;
setTransform(transform: string | string[]): any;
}
/**
* `beforeRender` event occurs before the dragging of all events.
* @typedef
* @memberof Moveable
* @extends Moveable.OnEvent
* @property - Whether or not it is being pinched.
*/
export interface OnBeforeRender extends OnEvent {
isPinch: boolean;
}
/**
* `beforeRenderEnd` event occurs before the end of all events.
* @typedef
* @memberof Moveable
* @extends Moveable.OnEvent
* @property - Whether or not it is being dragged.
* @property - Whether or not it is being pinched.
*/
export interface OnBeforeRenderEnd extends OnEvent {
isPinch: boolean;
isDrag: boolean;
}
/**
* @typedef
* @memberof Moveable
* @extends Moveable.OnBeforeRenderStart
* @property - targets set to group.
* @property - children's `beforeRenderStart` events
*/
export interface OnBeforeRenderGroupStart extends OnBeforeRenderStart {
targets: Array<HTMLElement | SVGElement>;
events: OnBeforeRenderStart[];
}
/**
* @typedef
* @memberof Moveable
* @extends Moveable.OnBeforeRender
* @property - targets set to group.
* @property - children's `beforeRender` events
*/
export interface OnBeforeRenderGroup extends OnBeforeRender {
targets: Array<HTMLElement | SVGElement>;
events: OnBeforeRender[];
}
/**
* @typedef
* @memberof Moveable
* @extends Moveable.OnBeforeRenderEnd
* @property - targets set to group.
*/
export interface OnBeforeRenderGroupEnd extends OnBeforeRenderEnd {
targets: Array<HTMLElement | SVGElement>;
}
/**
* `renderStart` event occurs at the first start of all events.
* @typedef
* @memberof Moveable
* @extends Moveable.OnEvent
* @property - Whether or not it is being pinched.
*/
export interface OnRenderStart extends OnEvent {
isPinch: boolean;
}
/**
* `render` event occurs before the target is drawn on the screen.
* @typedef
* @memberof Moveable
* @extends Moveable.OnEvent
* @extends Moveable.CSSObject
*/
export interface OnRender extends OnEvent, CSSObject {
/**
* a target's next transform string value.
*/
transform: string;
/**
* Whether or not it is being pinched.
*/
isPinch: boolean;
/**
* Return transform as a transform object.
* `rotate` is a number and everything else is an array of numbers.
*/
transformObject: Record<string, any>;
}
/**
* `renderEnd` event occurs at the end of all events.
* @typedef
* @memberof Moveable
* @extends Moveable.OnEvent
* @extends Moveable.CSSObject
*/
export interface OnRenderEnd extends OnEvent, CSSObject {
/**
* a target's next transform string value.
*/
transform: string;
/**
* Whether or not it is being dragged.
*/
isPinch: boolean;
/**
* Whether or not it is being pinched.
*/
isDrag: boolean;
/**
* Return transform as a transform object.
* `rotate` is a number and everything else is an array of numbers.
*/
transformObject: Record<string, any>;
}
export declare type EventInterface<T extends IObject<any> = {}> = {
[key in keyof T]?: (e: T[key]) => any;
};
/**
* @typedef
* @memberof Moveable.Scrollable
* @extends Moveable.OnEvent
* @property - The container corresponding to scrolling area (scrollContainer >= rootContainer >= container)
* @property - The direction of scrolling [left, top]
*/
export interface OnScroll extends OnEvent {
scrollContainer: HTMLElement;
direction: number[];
}
/**
* @typedef
* @memberof Moveable.Scrollable
* @extends Moveable.OnScroll
* @property - targets set to group.
*/
export interface OnScrollGroup extends OnScroll {
targets: Array<HTMLElement | SVGElement>;
}
/**
* @typedef
* @memberof Moveable
* @extends Moveable.OnRenderStart
* @property - targets set to group.
*/
export interface OnRenderGroupStart extends OnRenderStart {
targets: Array<HTMLElement | SVGElement>;
}
/**
* @typedef
* @memberof Moveable
* @extends Moveable.OnRender
* @property - targets set to group.
* @property - Each `render` event on the targets
*/
export interface OnRenderGroup extends OnRender {
targets: Array<HTMLElement | SVGElement>;
events: OnRender[];
}
/**
* @typedef
* @memberof Moveable
* @extends Moveable.OnRenderEnd
* @property - targets set to group.
* @property - Each `renderEnd` event on the targets
*/
export interface OnRenderGroupEnd extends OnRenderEnd {
targets: Array<HTMLElement | SVGElement>;
events: OnRenderEnd[];
}
/**
* @typedef
* @memberof Moveable.Draggable
*/
export interface DraggableOptions {
/**
* Whether or not target can be dragged.
* @default false
*/
draggable?: boolean;
/**
* throttle of x, y when drag.
* @default 0
*/
throttleDrag?: number;
/**
* throttle of angle(degree) of x,y when drag.
* @default 0
*/
throttleDragRotate?: number;
/**
* Hides the guidelines that appear when using the `throttleDragRotate` prop.
* @default false
*/
hideThrottleDragRotateLine?: boolean;
/**
* start angle(degree) of x,y for throttleDragRotate when drag.
* @default 0
*/
startDragRotate?: number;
/**
* Whether to move by dragging the edge line
* @default false
*/
edgeDraggable?: boolean | Array<LineDirection>;
}
export interface DraggableEvents {
onDragStart: OnDragStart;
onDrag: OnDrag;
onDragEnd: OnDragEnd;
onDragGroupStart: OnDragGroupStart;
onDragGroup: OnDragGroup;
onDragGroupEnd: OnDragGroupEnd;
}
export interface DraggableProps extends DraggableOptions, EventInterface