myprint-design
Version:
操作简单,组件丰富的一站式打印解决方案打印设计器
1,810 lines • 54 kB
TypeScript
/**
* @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[];
}
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>;
}
/**
* @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>;
}
export interface OnChangeTargets {
/**
* The Moveable instance
*/
moveable: MoveableManagerInterface<any, any>;
/**
* The Moveable's targets
*/
targets: Array<HTMLElement | SVGElement>;
}
export interface IObject<T> {
[name: string]: T;
}
/**
* @typedef
* @memberof Moveable.Warpable
* @extends Moveable.RenderDirections
*/
export interface WarpableOptions extends RenderDirections {
/**
* Whether or not target can be warped.
* @default false
*/
warpable?: boolean;
}
/**
* @typedef
* @memberof Moveable.Snappable
*/
export interface SnapDirections {
/**
* Whether to snap the top of the element
* @default true
*/
left?: boolean;
/**
* Whether to snap the left of the element
* @default true
*/
top?: boolean;
/**
* Whether to snap the right of the element
* @default true
*/
right?: boolean;
/**
* Whether to snap the bottom of the element
* @default true
*/
bottom?: boolean;
/**
* Whether to snap the center((left + right) / 2) of the element
* @default false
*/
center?: boolean;
/**
* Whether to snap the middle((top + bottom) / 2) of the element
* @default false
*/
middle?: boolean;
}
/**
* @typedef
* @memberof Moveable.Snappable
*/
export interface PosGuideline {
/**
* guideline pos
*/
pos: number | string;
/**
* class names to add to guideline
* @default ""
*/
className?: string;
}
/**
* @typedef
* @memberof Moveable.Snappable
*/
export interface InnerBoundType {
left: number;
top: number;
width: number;
height: number;
}
/**
* @typedef
* @memberof Moveable.Snappable
* @extends Moveable.Snappable.SnapDirections
*/
export interface ElementGuidelineValueOption extends SnapDirections {
/**
* guideline element
*/
element: MoveableRefType<Element>;
/**
* class names to add to guideline
* @default ""
*/
className?: string;
/**
* Whether to update the element size at every render
* @default false
*/
refresh?: boolean;
}
/**
* @typedef
* @memberof Moveable.Snappable
*/
export interface SnappableOptions {
/**
* Whether or not target can be snapped to the guideline.
* @default false
*/
snappable?: boolean | string[];
/**
* A snap container that is the basis for snap, bounds, and innerBounds.
* @default null
*/
snapContainer?: MoveableRefType<HTMLElement | SVGElement>;
/**
* You can specify the directions to snap to the target.
* @default true (true is all directions)
*/
snapDirections?: boolean | SnapDirections;
/**
* You can specify the snap directions of elements.
* @default true (true is all directions)
*/
elementSnapDirections?: boolean | SnapDirections;
/**
* When you drag, make the gap snap in the element guidelines.
* @default true
*/
snapGap?: boolean;
/**
/**
* Distance value that can snap to guidelines.
* Use `snapHorizontalThreshold` and `snapVerticalThreshold`
* @default 0
* @depreacted
*/
snapThreshold?: number;
/**
* Distance horizontal between horizontal value that can snap to guidelines.
* @default 5
*/
snapHorizontalThreshold?: number;
/**
* Distance Horizontal value that can snap to guidelines.
* @default 5
*/
snapVerticalThreshold?: number;
/**
* Distance value that render snapped guidelines.
* @default 1
*/
snapRenderThreshold?: number;
/**
* snap distance digits.
* @default 0
*/
snapDigit?: number;
/**
* Whether to show guideline of snap by grid
* @default false
*/
isDisplayGridGuidelines?: boolean;
/**
* Snap works if `abs(current rotation - snapRotationDegrees) < snapRotationThreshold`.
* @default 5
*/
snapRotationThreshold?: number;
/**
* degree angles to snap to rotation
* @default []
*/
snapRotationDegrees?: number[];
/**
* If width size is greater than 0, you can vertical snap to the grid.
* @default 0 (0 is not used)
*/
snapGridWidth?: number;
/**
* If height size is greater than 0, you can horizontal snap to the grid.
* @default 0 (0 is not used)
*/
snapGridHeight?: number;
/**
* In the case of a group, if `snapGridWidth` and `snapGridHeight` are used, all children can be snapped.
* Custom fixed directions are not yet allowed. Also, it cannot be applied if rotated.
* @default false
*/
snapGridAll?: boolean;
/**
* Whether to show snap distance.
* @default true
*/
isDisplaySnapDigit?: boolean;
/**
* Whether to show element inner snap distance
* @default false
*/
isDisplayInnerSnapDigit?: boolean;
/**
* Add guidelines in the horizontal direction.
* @default []
*/
horizontalGuidelines?: Array<PosGuideline | number | string>;
/**
* Add guidelines in the vertical direction.
* @default []
*/
verticalGuidelines?: Array<PosGuideline | number | string>;
/**
* Add guidelines for the element.
* @default []
*/
elementGuidelines?: Array<ElementGuidelineValueOption | MoveableRefType<Element>>;
/**
* Maximum distance to which element guidelines can be snapped.
* @default Infinity
*/
maxSnapElementGuidelineDistance?: number;
/**
* Maximum distance to which element gap guidelines can be snapped.
* @default Infinity
*/
maxSnapElementGapDistance?: number;
/**
* You can set up boundaries.
* @default null
*/
bounds?: BoundType | null;
/**
* You can set up inner boundaries.
* @default null
*/
innerBounds?: InnerBoundType | null;
/**
* You can set the text format of the distance shown in the guidelines.
* @default oneself
*/
snapDistFormat?: (distance: number, type: "vertical" | "horizontal") => number | string;
}
/**
* @typedef
* @options
* @memberof Moveable.Scrollable
*/
export interface ScrollableOptions {
/**
* Whether or not target can be scrolled to the scroll container
* @default false
*/
scrollable?: boolean;
/**
* The container to which scroll is applied
* @deprecated
* @default container
*/
scrollContainer?: MoveableRefType<HTMLElement>;
/**
* Expand the range of the scroll check area.
* @deprecated
* @default 0
*/
scrollThreshold?: number;
/**
* Time interval that occurs when scrolling occurs when dragging is maintained
* If set to 0, it does not occur.
* @deprecated
* @default 0
*/
scrollThrottleTime?: number;
/**
* Sets a function to get the scroll position.
* @deprecated
* @default scrollContainer's scrollTop, scrollLeft
*/
getScrollPosition?: (e: {
scrollContainer: HTMLElement;
direction: number[];
}) => number[];
}
/**
* @typedef
* @memberof Moveable.Scalable
* @extends Moveable.RenderDirections
*/
export interface ScalableOptions extends RenderDirections {
/**
* Whether or not target can be scaled.
* @default false
*/
scalable?: boolean | ScalableOptions;
/**
* throttle of scaleX, scaleY when scale.
* @default 0
*/
throttleScale?: number;
/**
* When resize or scale, keeps a ratio of the width, height.
* @default false
*/
keepRatio?: boolean;
/**
* Whether to scale and resize through edge lines.
* You can use "n", "w", "s", "e" in LineDirection array.
* @default false
*/
edge?: boolean | Array<LineDirection>;
}
/**
* @typedef
* @memberof Moveable.Roundable
*/
export interface RoundableOptions {
/**
* Whether to show and drag border-radius.
* @default false
*/
roundable?: boolean;
/**
* % Can be used instead of the absolute px
* @default false
*/
roundRelative?: boolean;
/**
* Minimum number of round controls. It moves in proportion by control. [horizontal, vertical]
* @default [0, 0]
*/
minRoundControls?: number[];
/**
* Maximum number of round controls. It moves in proportion by control. [horizontal, vertical]
* @default [4, 4]
*/
maxRoundControls?: number[];
/**
* Whether you can add/delete round controls by double-clicking a line or control.
* @default true
*/
roundClickable?: boolean | "line" | "control";
/**
* Whether to show a round control that does not actually exist as a shadow
* @default false
*/
isDisplayShadowRoundControls?: boolean | "horizontal";
/**
* The padding value of the position of the round control
* @default 0
*/
roundPadding?: number;
}
export declare type RotationPosition = "top" | "bottom" | "left" | "right" | "top-right" | "top-left" | "bottom-right" | "bottom-left" | "left-top" | "left-bottom" | "right-top" | "right-bottom" | "none";
/**
* @typedef
* @memberof Moveable
*/
export interface RenderDirections {
/**
* Set directions to show the control box.
* @default false if rotatable, ["n", "nw", "ne", "s", "se", "sw", "e", "w"] otherwise
*/
renderDirections?: boolean | string[];
/**
* Whether to scale and resize through edge lines.
* You can use "n", "w", "s", "e" in LineDirection array.
* @default false
*/
edge?: boolean | Array<LineDirection>;
/**
* You can expand the area around the control.
* Either `rotateAroundControls` or `displayAroundControls` can be used.
* You can set the area through the `controlPadding` value.
* @since 0.44.0
* @story options--options-control-padding
* @default false
*/
displayAroundControls?: boolean;
}
/**
* @typedef
* @memberof Moveable.Rotatable
* @extends Moveable.RenderDirections
*/
export interface RotatableOptions extends RenderDirections {
/**
* Whether or not target can be rotated.
* @default false
*/
rotatable?: boolean | RotatableOptions;
/**
* You can specify the position of the rotation.
* @default "top"
*/
rotationPosition?: RotationPosition | RotationPosition[];
/**
* You can rotate around direction controls.
* Either `rotateAroundControls` or `displayAroundControls` can be used.
* @default 0
*/
rotateAroundControls?: boolean;
/**
* Sets the control that will cause resize along with rotate. (Only Single Target, Only resizable, Beta)
* @default null
*/
resolveAblesWithRotatable?: Record<string, LineDirection[]> | null | undefined;
/**
* throttle of angle(degree) when rotate.
* @default 0
*/
throttleRotate?: number;
/**
* Set additional rotationTargets.
* @default null
*/
rotationTarget?: MoveableRefType | ArrayFormat<MoveableRefType> | false;
}
/**
* @typedef
* @memberof Moveable.Resizable
* @extends Moveable.RenderDirections
*/
export interface ResizableOptions extends RenderDirections {
/**
* Whether or not target can be resized.
* @default false
*/
resizable?: boolean | ResizableOptions;
/**
* throttle of width, height when resize.
* @default 1
*/
throttleResize?: number;
/**
* When resize or scale, keeps a ratio of the width, height.
* @default false
*/
keepRatio?: boolean;
/**
* The size can be changed by format and throttle, but the ratio is maintained at the end. Forced true when using groups.
* @default false
*/
keepRatioFinally?: boolean;
/**
* Function to convert size for resize.
* @default oneself
*/
resizeFormat?: (size: number[]) => number[];
/**
* Whether to scale and resize through edge lines.
* You can use "n", "w", "s", "e" in LineDirection array.
* @default false
*/
edge?: boolean | Array<LineDirection>;
/**
* Whether to recalculate when the size to be calculated is different from the actual size
* @default true
*/
checkResizableError?: boolean;
}
/**
* @typedef
* @memberof Moveable.Pinchable
*/
export interface PinchableOptions {
/**
* Whether or not target can be pinched with draggable, resizable, scalable, rotatable.
* @default false
*/
pinchable?: boolean | Array<"rotatable" | "resizable" | "scalable">;
}
/**
* @typedef
* @memberof Moveable.OriginDraggable
*/
export interface OriginDraggableOptions {
/**
* Whether to drag origin.
* @default false
*/
originDraggable?: boolean;
/**
* % Can be used instead of the absolute px.
* @default true
*/
originRelative?: boolean;
}
export declare type ExcludeKeys<T extends IObject<any>, U> = Pick<T, Exclude<keyof T, U>>;
export interface ArrayFormat<T = any> {
length: number;
[key: number]: T;
}
/**
* @memberof Moveable
* @typedef
*/
export declare type MoveableRefTargetType = MoveableRefType | ArrayFormat<MoveableRefTargetType>;
export interface MoveableInitalOptions extends ExcludeKeys<MoveableDefaultOptions, "target"> {
target?: MoveableRefTargetType;
}
/**
* @typedef
* @memberof Moveable
*/
export declare type LineDirection = "n" | "e" | "s" | "w" | "nw" | "ne" | "sw" | "se";
/**
* @typedef
* @memberof Moveable.IndividualGroup
*/
export interface IndividualGroupableOptions {
/**
* Create targets individually, not as a group.
* @story individual-group--individual-group-draggable-scalable-rotatable
*/
individualGroupable?: boolean;
/**
* When using individualGroupable you can pass props to child moveable.
* @story individual-group--individual-group-groupable-props
* @since 0.44.0
*/
individualGroupableProps?: (element: HTMLElement | SVGElement | null | undefined, index: number) => Record<string, any> | undefined | null | void;
}
/**
* @typedef
* @memberof Moveable
*/
export declare type MoveableTargetGroupsType = Array<HTMLElement | SVGElement | MoveableTargetGroupsType>;
/**
* @typedef
* @memberof Moveable.Group
*/
export interface GroupableOptions {
/**
* Sets the initial rotation of the group.
* @default 0
*/
defaultGroupRotate?: number;
/**
* Use the defaultGroupRotate even if the children's rotations match.
* @default false
*/
useDefaultGroupRotate?: boolean;
/**
* Sets the initial transform origin of the group.
* @default "50% 50%"
*/
defaultGroupOrigin?: string;
/**
* @default
*/
targetGroups?: MoveableTargetGroupsType;
/**
* @private
*/
groupable?: boolean;
/**
* Whether to hide the line in child moveable for group corresponding to the rect of the target.
* @default false
*/
hideChildMoveableDefaultLines?: boolean;
/**
* Props that work when group
* @example
* ```js
* {
* roundable: true,
* groupableProps: {
* roundable: false,
* },
* }
* ```
*/
groupableProps?: Record<string, any>;
}
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 ClippableOptions {
/**
* Whether to clip the target.
* @default false
*/
clippable?: boolean | ClippableOptions;
/**
* Whether to keep the ratio of size if your clipPath is 'inset', 'rect', 'ellipse' type
* @default false
*/
keepRatio?: boolean;
/**
* You can force the custom clipPath. (defaultClipPath < style < customClipPath < dragging clipPath)
*/
customClipPath?: string;
/**
* If clippath is not set, the default value can be set. (defaultClipPath < style < customClipPath < dragging clipPath)
*/
defaultClipPath?: string;
/**
* % Can be used instead of the absolute px (`rect` not possible)
* @default false
*/
clipRelative?: boolean;
/**
* When dragging the target, the clip also moves.
* @default true
*/
dragWithClip?: boolean;
/**
* You can drag the clip by setting clipArea.
* @default false
*/
clipArea?: boolean;
/**
* Whether the clip is bound to the target.
* @default false
*/
clipTargetBounds?: boolean;
/**
* Add clip guidelines in the vertical direction.
* @default []
*/
clipVerticalGuidelines?: Array<string | number>;
/**
* Add clip guidelines in the horizontal direction.
* @default []
*/
clipHorizontalGuidelines?: Array<string | number>;
/**
* Distance value that can snap to clip guidelines.
* @default 5
*/
clipSnapThreshold?: number;
}
export interface ClickableOptions {
/**
* Whether to trigger the moveable's click event.
* @default true
*/
clickable?: boolean;
}
export interface MoveableOptions extends MoveableInitalOptions, DraggableOptions, DragAreaOptions, OriginDraggableOptions, RotatableOptions, ResizableOptions, ScalableOptions, WarpableOptions, PinchableOptions, GroupableOptions, IndividualGroupableOptions, SnappableOptions, ScrollableOptions, ClippableOptions, RoundableOptions, ClickableOptions {
}
export interface BoundType {
/**
* If position is css, right and bottom are calculated as css right and css bottom of container.
* @default "client"
*/
position?: "client" | "css";
left?: number;
top?: number;
right?: number;
bottom?: number;
}
export interface OnBound {
bounds: {
left: boolean;
top: boolean;
right: boolean;
bottom: boolean;
};
innerBounds: {
left: boolean;
top: boolean;
right: boolean;
bottom: boolean;
};
}
export interface OnResizeEnd extends OnEndEvent {
}
export interface OnRotateEnd extends OnEndEvent {
}
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;
}
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;
}
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[];
}
export interface OnRoundGroup extends OnRound {
/**
* moveable's targets
*/
targets: Array<HTMLElement | SVGElement>;
/**
* moveable's child events
*/
events: OnRound[];
}
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 {
}
export interface OnResizeGroup extends OnResize {
targets: Array<HTMLElement | SVGElement>;
events: OnResize[];
}
/**
* @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[];
}
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;
}
export interface OnTransformEvent extends TransformObject {
/**
* transform events causes a `drag` event. In some events, there may be no value.
*/
drag: OnDrag;
}
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;
}
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;
}
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;
}
export interface OnEndEvent extends OnEvent {
lastEvent: any | undefined;
isDrag: boolean;
isDouble: boolean;
}
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.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;
}
export interface OnDragEnd extends OnEndEvent {
}
export declare type Writable<T> = {
-readonly [key in keyof T]: T[key];
};
export interface ScalableRequestParam extends AbleRequestParam {
/**
* Direction to scale
* @default [1, 1]
*/
direction?: number[];
/**
* Whether to force keepRatio to resize
*/
keepRatio?: boolean;
/**
* delta number of width
*/
deltaWidth?: number;
/**
* delta number of height
*/
deltaHeight?: number;
/**
* whether to use with `snappable`
*/
useSnap?: boolean;
}
export interface RotatableRequestParam extends AbleRequestParam {
/**
* delta number of rotation
*/
deltaRotate?: number;
/**
* absolute number of moveable's rotation
*/
rotate?: number;
}
export interface ResizableRequestParam extends AbleRequestParam {
/**
* Direction to resize
* @default [1, 1]
*/
direction?: number[];
/**
* Whether to force keepRatio to resize
*/
keepRatio?: boolean;
/**
* delta number of width
*/
deltaWidth?: number;
/**
* delta number of height
*/
deltaHeight?: number;
/**
* offset number of width
*/
offsetWidth?: number;
/**
* offset number of height
*/
offsetHeight?: number;
/**
*
*/
horizontal?: boolean;
/**
* whether to use with `snappable`
*/
useSnap?: boolean;
}
export interface Requester<RequestParam extends {} = AbleRequestParam> {
request(param: RequestParam): this;
requestEnd(): this;
}
export interface Renderer {
createElement(type: any, props?: any, ...children: any[]): any;
}
export interface RectInfo {
/**
* The coordinates of the vertex 1
*/
pos1: number[];
/**
* The coordinates of the vertex 2
*/
pos2: number[];
/**
* The coordinates of the vertex 3
*/
pos3: number[];
/**
* The coordinates of the vertex 4
*/
pos4: number[];
/**
* left position of the target relative to the container
*/
left: number;
/**
* top position of the target relative to the container
*/
top: number;
/**
* The width of moveable element
*/
width: number;
/**
* The height of moveable element
*/
height: number;
/**
* The offset width of the target
*/
offsetWidth: number;
/**
* The offset height of the target
*/
offsetHeight: number;
/**
* The absolute transform origin
*/
origin: number[];
/**
* The absolute transform origin before transformation
*/
beforeOrigin: number[];
/**
* The target transform origin
*/
transformOrigin: number[];
/**
* you can get the absolute rotation value
*/
rotation: number;
/**
* If you use a group, you can get child moveables' rect info
*/
children?: RectInfo[];
}
export declare type PersistRectData = Omit<Partial<RectInfo>, "children"> & {
children?: Array<Partial<RectInfo>>;
};
export interface PaddingBox {
left?: number;
top?: number;
right?: number;
bottom?: number;
}
export interface PaddingOptions {
/**
* Add padding around the target to increase the drag area.
* @default null
*/
padding?: PaddingBox | number;
}
export interface OriginOptions {
/**
* Whether or not the origin control box will be visible or not.
* @default true
*/
origin?: boolean;
/**
* Sets the transform origin based on the svg target. If not set, it is set as the transform origin based on the owner of svg.
* @since 0.47.0
* @default ""
*/
svgOrigin?: string;
}
export interface MoveableRefObject<T extends Element = HTMLElement | SVGElement> {
current: T | undefined | null;
}
export declare type MoveableRefType<T extends Element = HTMLElement | SVGElement> = string | (() => T) | MoveableRefObject<T> | T | null | undefined;
export interface MoveablePosition {
left: number;
top: number;
right: number;
bottom: number;
origin: number[];
pos1: number[];
pos2: number[];
pos3: number[];
pos4: number[];
direction: 1 | -1;
}
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 interface MatrixInfo {
type: "offset" | "target" | "zoom";
target: SVGElement | HTMLElement;
matrix?: number[];
origin?: number[];
zoom?: number;
}
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;
}
export interface MoveableElementMatrixInfo {
hasZoom: boolean;
hasFixed: boolean;
originalRootMatrix: number[];
rootMatrix: number[];
beforeMatrix: number[];
offsetMatrix: number[];
allMatrix: number[];
targetMatrix: number[];
transformOrigin: number[];
targetOrigin: number[];
is3d: boolean;
targetTransform: string;
inlineTransform: string;
offsetContainer: HTMLElement | null;
offsetRootContainer: HTMLElement | null;
matrixes: MatrixInfo[];
}
export interface MoveableElementInfo extends MoveableElementMatrixInfo, MoveablePosition, ElementSizes {
width: number;
height: number;
rotation: number;
}
export interface MoveableTargetInfo extends MoveableElementInfo {
targetClientRect: MoveableClientRect;
containerClientRect: MoveableClientRect;
moveableClientRect: MoveableClientRect;
rootContainerClientRect: MoveableClientRect;
beforeDirection: 1 | -1;
beforeOrigin: number[];
offsetDelta: number[];
originalBeforeOrigin: number[];
target: HTMLElement | SVGElement | null | undefined;
style: Partial<Writable<CSSStyleDeclaration>>;
}
export declare type MoveableManagerState<T = {}> = {
container: SVGElement | HTMLElement | null | undefined;
disableNativeEvent: boolean;
renderLines: number[][][];
renderPoses: number[][];
posDelta: number[];
style: Partial<Writable<CSSStyleDeclaration>>;
isPersisted?: boolean;
} & MoveableTargetInfo & T;
export interface DragAreaOptions {
/**
* Instead of firing an event on the target, we add it to the moveable control element. You can use click and clickGroup events.
* @default if group, true, else fals
*/
dragArea?: boolean;
/**
* Set `pointerEvents: none;` css to pass events in dragArea.
* @default false
*/
passDragArea?: boolean;
}
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;
}
export interface MoveableDefaultOptions extends DefaultOptions, DragAreaOptions, OriginOptions, PaddingOptions {
}
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);
/**
* @typedef
* @memberof Moveable
* @property - top position
* @property - left position
* @property - target's width
* @property - target's height
*/
export interface HitRect {
top: number;
left: number;
width?: number;
height?: number;
}
export interface DraggableRequestParam extends AbleRequestParam {
/**
* x position
*/
x?: number;
/**
* y position
*/
y?: number;
/**
* X number to move
*/
deltaX?: number;
/**
* Y number to move
*/
deltaY?: number;
/**
* whether to use with `snappable`
*/
useSnap?: boolean;
}
/**
* @typedef
* @memberof Moveable
*/
export interface AbleRequestParam {
/**
* Run the request instantly. (requestStart, request, requestEnd happen at the same time)
*/
isInstant?: boolean;
[key: string]: any;
}
export interface AbleRequesters {
draggable: DraggableRequestParam;
resizable: ResizableRequestParam;
scalable: ScalableRequestParam;
rotatable: RotatableRequestParam;
[key: string]: AbleRequestParam;
}
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;
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;
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;
}
export interface AbleRequester {
isControl: boolean;
requestStart(param: IObject<any>): IObject<any>;
request(param: IObject<any>): IObject<any>;
requestEnd(): IObject<any>;
}
export interface MoveableInterface {
getManager(): MoveableManagerInterface<any, any>;
getRect(): RectInfo;
getAble<T extends Able>(ableName: string): T | undefined;
isMoveableElement(target: Element): boolean;
/**
* If the location or size of the target is changed, call the `.updateRect()` method.
* Use the `useResizeObserver` and `useMutationObserver` props to update automatically.
*/
updateRect(type?: "Start" | "" | "End", isTarget?: boolean, isSetState?: boolean): void;
/**
* @deprecated
* Use `.updateRect()` method
*/
updateTarget(): void;
/**
* Request able through a method rather than an event.
* At the moment of execution, requestStart is executed,
* and then request and requestEnd can be executed through Requester.
* @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}
* @see {@link https://daybrush.com/moveable/release/latest/doc/Moveable.OriginDraggable.html#request OriginDraggable Requester}
* @param - ableName
* @param - request to be able params.
* @param - If isInstant is true, request and requestEnd are executed immediately.
* @return - Able Requester. If there is no request in able, nothing will work.
* @example
* import Moveable from "moveable";
*
* const moveable = new Moveable(document.body);
*
* // Instantly Request (requestStart - request - requestEnd)
* moveable.request("draggable", { deltaX: 10, deltaY: 10 }, true);
*
* // Start move
* const requester = moveable.request("draggable");
* requester.request({ deltaX: 10, deltaY: 10 });
* requester.request({ deltaX: 10, deltaY: 10 });
* requester.request({