UNPKG

react-moveable

Version:

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

1,613 lines (1,418 loc) 124 kB
/* Copyright (c) 2019 Daybrush name: react-moveable license: MIT author: Daybrush repository: https://github.com/daybrush/moveable/blob/master/packages/react-moveable version: 0.12.3 */ 'use strict'; var React = require('react'); var frameworkUtils = require('framework-utils'); var getAgent = require('@egjs/agent'); var utils = require('@daybrush/utils'); var matrix = require('@moveable/matrix'); var styler = require('react-css-styler'); var Dragger = require('@daybrush/drag'); var ChildrenDiffer = require('@egjs/children-differ'); /*! ***************************************************************************** Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT. See the Apache Version 2.0 License for specific language governing permissions and limitations under the License. ***************************************************************************** */ /* global Reflect, Promise */ var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; } || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; function __extends(d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); } var __assign = function () { __assign = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var agent = getAgent(); var isWebkit = agent.os.name.indexOf("ios") > -1 || agent.browser.name.indexOf("safari") > -1; var PREFIX = "moveable-"; var MOVEABLE_CSS = frameworkUtils.prefixCSS(PREFIX, "\n{\n\tposition: fixed;\n\twidth: 0;\n\theight: 0;\n\tleft: 0;\n\ttop: 0;\n\tz-index: 3000;\n}\n.control-box {\n z-index: 0;\n}\n.line, .control {\n\tleft: 0;\n\ttop: 0;\n}\n.control {\n\tposition: absolute;\n\twidth: 14px;\n\theight: 14px;\n\tborder-radius: 50%;\n\tborder: 2px solid #fff;\n\tbox-sizing: border-box;\n\tbackground: #4af;\n\tmargin-top: -7px;\n margin-left: -7px;\n z-index: 10;\n}\n.line {\n\tposition: absolute;\n\twidth: 1px;\n\theight: 1px;\n\tbackground: #4af;\n\ttransform-origin: 0px 0.5px;\n}\n.line.rotation-line {\n\theight: 40px;\n\twidth: 1px;\n\ttransform-origin: 0.5px 39.5px;\n}\n.line.rotation-line .control {\n\tborder-color: #4af;\n\tbackground:#fff;\n\tcursor: alias;\n}\n.line.vertical.bold {\n width: 2px;\n margin-left: -1px;\n}\n.line.horizontal.bold {\n height: 2px;\n margin-top: -1px;\n}\n.control.origin {\n\tborder-color: #f55;\n\tbackground: #fff;\n\twidth: 12px;\n\theight: 12px;\n\tmargin-top: -6px;\n\tmargin-left: -6px;\n\tpointer-events: none;\n}\n.direction.e, .direction.w {\n\tcursor: ew-resize;\n}\n.direction.s, .direction.n {\n\tcursor: ns-resize;\n}\n.direction.nw, .direction.se, :host.reverse .direction.ne, :host.reverse .direction.sw {\n\tcursor: nwse-resize;\n}\n.direction.ne, .direction.sw, :host.reverse .direction.nw, :host.reverse .direction.se {\n\tcursor: nesw-resize;\n}\n.group {\n z-index: -1;\n}\n.area {\n position: absolute;\n}\n.area.avoid, .area.avoid:before, .area.avoid:after {\n transform-origin: 50% calc(100% + 20px);\n}\n.area.avoid:before, .area.avoid:after {\n content: \"\";\n top: 0px;\n left: 0px;\n position: absolute;\n width: 100%;\n height: 100%;\n}\n\n.area.avoid:before {\n transform: rotate(120deg);\n}\n.area.avoid:after {\n transform: rotate(-120deg);\n}\n" + (isWebkit ? ":global svg *:before {\n\tcontent:\"\";\n\ttransform-origin: inherit;\n}" : "") + "\n"); var NEARBY_POS = [[0, 1, 2], [1, 0, 3], [2, 0, 3], [3, 1, 2]]; var TINY_NUM = 0.0000001; var MIN_SCALE = 0.000000001; var MAX_NUM = Math.pow(10, 10); var MIN_NUM = -MAX_NUM; function multiply2(pos1, pos2) { return [pos1[0] * pos2[0], pos1[1] * pos2[1]]; } function prefix() { var classNames = []; for (var _i = 0; _i < arguments.length; _i++) { classNames[_i] = arguments[_i]; } return frameworkUtils.prefixNames.apply(void 0, [PREFIX].concat(classNames)); } function createIdentityMatrix3() { return matrix.createIdentityMatrix(3); } function getTransformMatrix(transform) { if (!transform || transform === "none") { return [1, 0, 0, 1, 0, 0]; } if (utils.isObject(transform)) { return transform; } var value = utils.splitBracket(transform).value; return value.split(/s*,\s*/g).map(function (v) { return parseFloat(v); }); } function getAbsoluteMatrix(matrix$1, n, origin) { return matrix.multiplies(n, matrix.createOriginMatrix(origin, n), matrix$1, matrix.createOriginMatrix(origin.map(function (a) { return -a; }), n)); } function measureSVGSize(el, unit, isHorizontal) { if (unit === "%") { var viewBox = el.ownerSVGElement.viewBox.baseVal; return viewBox[isHorizontal ? "width" : "height"] / 100; } return 1; } function getBeforeTransformOrigin(el) { var relativeOrigin = getTransformOrigin(getComputedStyle(el, ":before")); return relativeOrigin.map(function (o, i) { var _a = utils.splitUnit(o), value = _a.value, unit = _a.unit; return value * measureSVGSize(el, unit, i === 0); }); } function getTransformOrigin(style) { var transformOrigin = style.transformOrigin; return transformOrigin ? transformOrigin.split(" ") : ["0", "0"]; } function caculateMatrixStack(target, container, prevMatrix, prevN) { var _a; var el = target; var matrixes = []; var isContainer = !!prevMatrix || target === container; var isSVGGraphicElement = el.tagName.toLowerCase() !== "svg" && "ownerSVGElement" in el; var is3d = false; var n = 3; var transformOrigin; var targetMatrix; var style = getComputedStyle(el); while (el && (isContainer || el !== container)) { var tagName = el.tagName.toLowerCase(); var position = style.position; var isFixed = position === "fixed"; var matrix$1 = matrix.convertCSStoMatrix(getTransformMatrix(style.transform)); if (!is3d && matrix$1.length === 16) { is3d = true; n = 4; var matrixesLength = matrixes.length; for (var i = 0; i < matrixesLength; ++i) { matrixes[i] = matrix.convertDimension(matrixes[i], 3, 4); } } if (is3d && matrix$1.length === 9) { matrix$1 = matrix.convertDimension(matrix$1, 3, 4); } var offsetLeft = el.offsetLeft; var offsetTop = el.offsetTop; if (isFixed) { var containerRect = (container || document.documentElement).getBoundingClientRect(); offsetLeft -= containerRect.left; offsetTop -= containerRect.top; } // svg var isSVG = utils.isUndefined(offsetLeft); var hasNotOffset = isSVG; var origin = void 0; // inner svg element if (hasNotOffset && tagName !== "svg") { origin = isWebkit ? getBeforeTransformOrigin(el) : getTransformOrigin(style).map(function (pos) { return parseFloat(pos); }); hasNotOffset = false; if (tagName === "g") { offsetLeft = 0; offsetTop = 0; } else { _a = getSVGGraphicsOffset(el, origin), offsetLeft = _a[0], offsetTop = _a[1], origin[0] = _a[2], origin[1] = _a[3]; } } else { origin = getTransformOrigin(style).map(function (pos) { return parseFloat(pos); }); } if (tagName === "svg" && targetMatrix) { matrixes.push(getSVGMatrix(el, n), matrix.createIdentityMatrix(n)); } var parentElement = el.parentElement; if (isWebkit && !hasNotOffset && !isSVG) { var offsetParent = el.offsetParent; if (offsetParent && offsetParent !== parentElement) { offsetLeft -= parentElement.offsetLeft; offsetTop -= parentElement.offsetTop; } } matrixes.push(getAbsoluteMatrix(matrix$1, n, origin), matrix.createOriginMatrix([hasNotOffset ? el : offsetLeft, hasNotOffset ? origin : offsetTop], n)); if (!targetMatrix) { targetMatrix = matrix$1; } if (!transformOrigin) { transformOrigin = origin; } if (isContainer || isFixed) { break; } el = parentElement; if (isSVG) { continue; } while (el) { style = getComputedStyle(el); var nextPosition = style.position, nextTransform = style.transform; if (nextPosition !== "static" || nextTransform && nextTransform !== "none") { break; } el = el.parentElement; } if (el) { style = getComputedStyle(el); } } var mat = prevMatrix ? matrix.convertDimension(prevMatrix, prevN, n) : matrix.createIdentityMatrix(n); var beforeMatrix = prevMatrix ? matrix.convertDimension(prevMatrix, prevN, n) : matrix.createIdentityMatrix(n); var offsetMatrix = matrix.createIdentityMatrix(n); var length = matrixes.length; matrixes.reverse(); matrixes.forEach(function (matrix$1, i) { var _a; if (length - 2 === i) { beforeMatrix = mat.slice(); } if (length - 1 === i) { offsetMatrix = mat.slice(); } if (utils.isObject(matrix$1[n - 1])) { _a = getSVGOffset(matrix$1[n - 1], container, n, matrix$1[2 * n - 1], mat, matrixes[i + 1]), matrix$1[n - 1] = _a[0], matrix$1[2 * n - 1] = _a[1]; } mat = matrix.multiply(mat, matrix$1, n); }); var isMatrix3d = !isSVGGraphicElement && is3d; var transform = (isMatrix3d ? "matrix3d" : "matrix") + "(" + matrix.convertMatrixtoCSS(isSVGGraphicElement && targetMatrix.length === 16 ? matrix.convertDimension(targetMatrix, 4, 3) : targetMatrix) + ")"; return [beforeMatrix, offsetMatrix, mat, targetMatrix, transform, transformOrigin, is3d]; } function getSVGMatrix(el, n) { var clientWidth = el.clientWidth; var clientHeight = el.clientHeight; var viewBox = el.viewBox.baseVal; var viewBoxWidth = viewBox.width || clientWidth; var viewBoxHeight = viewBox.height || clientHeight; var scaleX = clientWidth / viewBoxWidth; var scaleY = clientHeight / viewBoxHeight; var preserveAspectRatio = el.preserveAspectRatio.baseVal; // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio var align = preserveAspectRatio.align; // 1 : meet 2: slice var meetOrSlice = preserveAspectRatio.meetOrSlice; var svgOrigin = [0, 0]; var scale = [scaleX, scaleY]; var translate = [0, 0]; if (align !== 1) { var xAlign = (align - 2) % 3; var yAlign = Math.floor((align - 2) / 3); svgOrigin[0] = viewBoxWidth * xAlign / 2; svgOrigin[1] = viewBoxHeight * yAlign / 2; var scaleDimension = meetOrSlice === 2 ? Math.max(scaleY, scaleX) : Math.min(scaleX, scaleY); scale[0] = scaleDimension; scale[1] = scaleDimension; translate[0] = (clientWidth - viewBoxWidth) / 2 * xAlign; translate[1] = (clientHeight - viewBoxHeight) / 2 * yAlign; } var scaleMatrix = matrix.createScaleMatrix(scale, n); scaleMatrix[n - 1] = translate[0], scaleMatrix[2 * n - 1] = translate[1]; return getAbsoluteMatrix(scaleMatrix, n, svgOrigin); } function getSVGGraphicsOffset(el, origin) { if (!el.getBBox) { return [0, 0]; } var bbox = el.getBBox(); var svgElement = el.ownerSVGElement; var viewBox = svgElement.viewBox.baseVal; var left = bbox.x - viewBox.x; var top = bbox.y - viewBox.y; return [left, top, origin[0] - left, origin[1] - top]; } function caculatePosition(matrix$1, pos, n) { return matrix.caculate(matrix$1, matrix.convertPositionMatrix(pos, n), n); } function caculatePoses(matrix, width, height, n) { var pos1 = caculatePosition(matrix, [0, 0], n); var pos2 = caculatePosition(matrix, [width, 0], n); var pos3 = caculatePosition(matrix, [0, height], n); var pos4 = caculatePosition(matrix, [width, height], n); return [pos1, pos2, pos3, pos4]; } function getRect(poses) { var posesX = poses.map(function (pos) { return pos[0]; }); var posesY = poses.map(function (pos) { return pos[1]; }); var left = Math.min.apply(Math, posesX); var top = Math.min.apply(Math, posesY); var right = Math.max.apply(Math, posesX); var bottom = Math.max.apply(Math, posesY); var rectWidth = right - left; var rectHeight = bottom - top; return { left: left, top: top, right: right, bottom: bottom, width: rectWidth, height: rectHeight }; } function caculateRect(matrix, width, height, n) { var poses = caculatePoses(matrix, width, height, n); return getRect(poses); } function getSVGOffset(el, container, n, origin, beforeMatrix, absoluteMatrix) { var _a; var _b = getSize(el), width = _b[0], height = _b[1]; var containerRect = (container || document.documentElement).getBoundingClientRect(); var rect = el.getBoundingClientRect(); var rectLeft = rect.left - containerRect.left; var rectTop = rect.top - containerRect.top; var rectWidth = rect.width; var rectHeight = rect.height; var mat = matrix.multiplies(n, beforeMatrix, absoluteMatrix); var _c = caculateRect(mat, width, height, n), prevLeft = _c.left, prevTop = _c.top, prevWidth = _c.width, prevHeight = _c.height; var posOrigin = caculatePosition(mat, origin, n); var prevOrigin = matrix.minus(posOrigin, [prevLeft, prevTop]); var rectOrigin = [rectLeft + prevOrigin[0] * rectWidth / prevWidth, rectTop + prevOrigin[1] * rectHeight / prevHeight]; var offset = [0, 0]; var count = 0; while (++count < 10) { var inverseBeforeMatrix = matrix.invert(beforeMatrix, n); _a = matrix.minus(caculatePosition(inverseBeforeMatrix, rectOrigin, n), caculatePosition(inverseBeforeMatrix, posOrigin, n)), offset[0] = _a[0], offset[1] = _a[1]; var mat2 = matrix.multiplies(n, beforeMatrix, matrix.createOriginMatrix(offset, n), absoluteMatrix); var _d = caculateRect(mat2, width, height, n), nextLeft = _d.left, nextTop = _d.top; var distLeft = nextLeft - rectLeft; var distTop = nextTop - rectTop; if (Math.abs(distLeft) < 2 && Math.abs(distTop) < 2) { break; } rectOrigin[0] -= distLeft; rectOrigin[1] -= distTop; } return offset.map(function (p) { return Math.round(p); }); } function caculateMoveablePosition(matrix$1, origin, width, height) { var is3d = matrix$1.length === 16; var n = is3d ? 4 : 3; var _a = caculatePoses(matrix$1, width, height, n), _b = _a[0], x1 = _b[0], y1 = _b[1], _c = _a[1], x2 = _c[0], y2 = _c[1], _d = _a[2], x3 = _d[0], y3 = _d[1], _e = _a[3], x4 = _e[0], y4 = _e[1]; var _f = caculatePosition(matrix$1, origin, n), originX = _f[0], originY = _f[1]; var left = Math.min(x1, x2, x3, x4); var top = Math.min(y1, y2, y3, y4); var right = Math.max(x1, x2, x3, x4); var bottom = Math.max(y1, y2, y3, y4); x1 = x1 - left || 0; x2 = x2 - left || 0; x3 = x3 - left || 0; x4 = x4 - left || 0; y1 = y1 - top || 0; y2 = y2 - top || 0; y3 = y3 - top || 0; y4 = y4 - top || 0; originX = originX - left || 0; originY = originY - top || 0; var center = [(x1 + x2 + x3 + x4) / 4, (y1 + y2 + y3 + y4) / 4]; var pos1Rad = matrix.getRad(center, [x1, y1]); var pos2Rad = matrix.getRad(center, [x2, y2]); var direction = pos1Rad < pos2Rad && pos2Rad - pos1Rad < Math.PI || pos1Rad > pos2Rad && pos2Rad - pos1Rad < -Math.PI ? 1 : -1; return [[left, top, right, bottom], [originX, originY], [x1, y1], [x2, y2], [x3, y3], [x4, y4], direction]; } function getLineStyle(pos1, pos2) { var distX = pos2[0] - pos1[0]; var distY = pos2[1] - pos1[1]; var width = Math.sqrt(distX * distX + distY * distY); var rad = matrix.getRad(pos1, pos2); return { transform: "translate(" + pos1[0] + "px, " + pos1[1] + "px) rotate(" + rad + "rad)", width: width + "px" }; } function getControlTransform() { var poses = []; for (var _i = 0; _i < arguments.length; _i++) { poses[_i] = arguments[_i]; } var length = poses.length; var x = poses.reduce(function (prev, pos) { return prev + pos[0]; }, 0) / length; var y = poses.reduce(function (prev, pos) { return prev + pos[1]; }, 0) / length; return { transform: "translate(" + x + "px, " + y + "px)" }; } function getSize(target, style, isOffset, isBoxSizing) { if (style === void 0) { style = getComputedStyle(target); } if (isBoxSizing === void 0) { isBoxSizing = isOffset || style.boxSizing === "border-box"; } var width = target.offsetWidth; var height = target.offsetHeight; var hasOffset = !utils.isUndefined(width); if ((isOffset || isBoxSizing) && hasOffset) { return [width, height]; } width = target.clientWidth; height = target.clientHeight; if (!hasOffset && !width && !height) { var bbox = target.getBBox(); return [bbox.width, bbox.height]; } if (isOffset || isBoxSizing) { var borderLeft = parseFloat(style.borderLeftWidth) || 0; var borderRight = parseFloat(style.borderRightWidth) || 0; var borderTop = parseFloat(style.borderTopWidth) || 0; var borderBottom = parseFloat(style.borderBottomWidth) || 0; return [width + borderLeft + borderRight, height + borderTop + borderBottom]; } else { var paddingLeft = parseFloat(style.paddingLeft) || 0; var paddingRight = parseFloat(style.paddingRight) || 0; var paddingTop = parseFloat(style.paddingTop) || 0; var paddingBottom = parseFloat(style.paddingBottom) || 0; return [width - paddingLeft - paddingRight, height - paddingTop - paddingBottom]; } } function getTargetInfo(target, container, state) { var _a, _b, _c, _d, _e; var left = 0; var top = 0; var right = 0; var bottom = 0; var origin = [0, 0]; var pos1 = [0, 0]; var pos2 = [0, 0]; var pos3 = [0, 0]; var pos4 = [0, 0]; var offsetMatrix = createIdentityMatrix3(); var beforeMatrix = createIdentityMatrix3(); var matrix$1 = createIdentityMatrix3(); var targetMatrix = createIdentityMatrix3(); var width = 0; var height = 0; var transformOrigin = [0, 0]; var direction = 1; var beforeDirection = 1; var is3d = false; var targetTransform = ""; var beforeOrigin = [0, 0]; var prevMatrix = state ? state.beforeMatrix : undefined; var prevN = state ? state.is3d ? 4 : 3 : undefined; if (target) { if (state) { width = state.width; height = state.height; } else { var style = getComputedStyle(target); width = target.offsetWidth; height = target.offsetHeight; if (utils.isUndefined(width)) { _a = getSize(target, style, true), width = _a[0], height = _a[1]; } } _b = caculateMatrixStack(target, container, prevMatrix, prevN), beforeMatrix = _b[0], offsetMatrix = _b[1], matrix$1 = _b[2], targetMatrix = _b[3], targetTransform = _b[4], transformOrigin = _b[5], is3d = _b[6]; _c = caculateMoveablePosition(matrix$1, transformOrigin, width, height), _d = _c[0], left = _d[0], top = _d[1], right = _d[2], bottom = _d[3], origin = _c[1], pos1 = _c[2], pos2 = _c[3], pos3 = _c[4], pos4 = _c[5], direction = _c[6]; var n = is3d ? 4 : 3; var beforePos = [0, 0]; _e = caculateMoveablePosition(offsetMatrix, matrix.plus(transformOrigin, matrix.getOrigin(targetMatrix, n)), width, height), beforePos = _e[0], beforeOrigin = _e[1], beforeDirection = _e[6]; beforeOrigin = [beforeOrigin[0] + beforePos[0] - left, beforeOrigin[1] + beforePos[1] - top]; } return { beforeDirection: beforeDirection, direction: direction, target: target, left: left, top: top, right: right, bottom: bottom, pos1: pos1, pos2: pos2, pos3: pos3, pos4: pos4, width: width, height: height, beforeMatrix: beforeMatrix, matrix: matrix$1, targetTransform: targetTransform, offsetMatrix: offsetMatrix, targetMatrix: targetMatrix, is3d: is3d, beforeOrigin: beforeOrigin, origin: origin, transformOrigin: transformOrigin }; } function getDirection(target) { if (!target) { return; } var direciton = target.getAttribute("data-direction"); if (!direciton) { return; } var dir = [0, 0]; direciton.indexOf("w") > -1 && (dir[0] = -1); direciton.indexOf("e") > -1 && (dir[0] = 1); direciton.indexOf("n") > -1 && (dir[1] = -1); direciton.indexOf("s") > -1 && (dir[1] = 1); return dir; } function getAbsolutePoses(poses, dist) { return [matrix.plus(dist, poses[0]), matrix.plus(dist, poses[1]), matrix.plus(dist, poses[2]), matrix.plus(dist, poses[3])]; } function getAbsolutePosesByState(_a) { var left = _a.left, top = _a.top, pos1 = _a.pos1, pos2 = _a.pos2, pos3 = _a.pos3, pos4 = _a.pos4; return getAbsolutePoses([pos1, pos2, pos3, pos4], [left, top]); } function throttle(num, unit) { if (!unit) { return num; } return Math.round(num / unit) * unit; } function throttleArray(nums, unit) { nums.forEach(function (_, i) { nums[i] = throttle(nums[i], unit); }); return nums; } function unset(self, name) { if (self[name]) { self[name].unset(); self[name] = null; } } function getOrientationDirection(pos, pos1, pos2) { return (pos[0] - pos1[0]) * (pos2[1] - pos1[1]) - (pos[1] - pos1[1]) * (pos2[0] - pos1[0]); } function isInside(pos, pos1, pos2, pos3, pos4) { var k1 = getOrientationDirection(pos, pos1, pos2); var k2 = getOrientationDirection(pos, pos2, pos4); var k3 = getOrientationDirection(pos, pos4, pos1); var k4 = getOrientationDirection(pos, pos2, pos4); var k5 = getOrientationDirection(pos, pos4, pos3); var k6 = getOrientationDirection(pos, pos3, pos2); var signs1 = [k1, k2, k3]; var signs2 = [k4, k5, k6]; if (signs1.every(function (sign) { return sign >= 0; }) || signs1.every(function (sign) { return sign <= 0; }) || signs2.every(function (sign) { return sign >= 0; }) || signs2.every(function (sign) { return sign <= 0; })) { return true; } return false; } function triggerEvent(moveable, name, e) { return moveable.triggerEvent(name, e); } function getComputedStyle(el, pseudoElt) { return window.getComputedStyle(el, pseudoElt); } var Origin = { name: "origin", render: function (moveable, React) { if (!moveable.props.origin) { return null; } var beforeOrigin = moveable.state.beforeOrigin; return [// <div className={prefix("control", "origin")} style={getControlTransform(origin)} key="origin"></div>, React.createElement("div", { className: prefix("control", "origin"), style: getControlTransform(beforeOrigin), key: "beforeOrigin" })]; } }; function triggerAble(moveable, ableType, eventOperation, eventAffix, eventType, e) { var eventName = "" + eventOperation + eventAffix + eventType; var conditionName = "" + eventOperation + eventAffix + "Condition"; var isStart = eventType === "Start"; var isEnd = eventType === "End"; var isGroup = eventAffix.indexOf("Group") > -1; var ables = moveable[ableType]; var results = ables.filter(function (able) { var condition = isStart && able[conditionName]; if (able[eventName] && (!condition || condition(e.inputEvent.target, moveable))) { return able[eventName](moveable, e); } return false; }); var isUpdate = results.length; if (isEnd) { moveable.state.dragger = null; } if (!isStart && isUpdate) { if (results.some(function (able) { return able.updateRect; }) && !isGroup) { moveable.updateRect(eventType); } else { moveable.updateTarget(eventType); } } else if (isEnd && !isUpdate) { moveable.forceUpdate(); } } function getAbleDragger(moveable, target, ableType, eventAffix) { var options = { container: window, pinchThreshold: moveable.props.pinchThreshold }; ["drag", "pinch"].forEach(function (eventOperation) { ["Start", "", "End"].forEach(function (eventType) { options["" + eventOperation + eventType.toLowerCase()] = function (e) { return triggerAble(moveable, ableType, eventOperation, eventAffix, eventType, e); }; }); }); return new Dragger(target, options); } var DragArea = { name: "dragArea", render: function (moveable, React) { var _a = moveable.props, target = _a.target, dragArea = _a.dragArea, groupable = _a.groupable; var _b = moveable.state, width = _b.width, height = _b.height, pos1 = _b.pos1, pos2 = _b.pos2, pos3 = _b.pos3, pos4 = _b.pos4; if (groupable) { return [React.createElement("div", { key: "area", ref: frameworkUtils.ref(moveable, "areaElement"), className: prefix("area") })]; } if (!target || !dragArea) { return []; } var h = matrix.createWarpMatrix([0, 0], [width, 0], [0, height], [width, height], pos1, pos2, pos3, pos4); if (!h.length) { return []; } return [React.createElement("div", { key: "area", ref: frameworkUtils.ref(moveable, "areaElement"), className: prefix("area"), style: { top: "0px", left: "0px", width: width + "px", height: height + "px", transform: "matrix3d(" + matrix.convertMatrixtoCSS(h).join(",") + ")" } })]; } }; var ControlBoxElement = styler("div", MOVEABLE_CSS); function renderLine(direction, pos1, pos2) { return React.createElement("div", { className: prefix("line", "direction", direction), "data-direction": direction, style: getLineStyle(pos1, pos2) }); } var MoveableManager = /*#__PURE__*/ function (_super) { __extends(MoveableManager, _super); function MoveableManager() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.state = { target: null, beforeMatrix: createIdentityMatrix3(), matrix: createIdentityMatrix3(), targetMatrix: createIdentityMatrix3(), targetTransform: "", is3d: false, left: 0, top: 0, width: 0, height: 0, transformOrigin: [0, 0], direction: 1, beforeDirection: 1, beforeOrigin: [0, 0], origin: [0, 0], pos1: [0, 0], pos2: [0, 0], pos3: [0, 0], pos4: [0, 0] }; _this.targetAbles = []; _this.controlAbles = []; return _this; } var __proto = MoveableManager.prototype; __proto.render = function () { this.checkUpdate(); var _a = this.props, edge = _a.edge, parentPosition = _a.parentPosition; var _b = parentPosition || { left: 0, top: 0 }, parentLeft = _b.left, parentTop = _b.top; var _c = this.state, left = _c.left, top = _c.top, pos1 = _c.pos1, pos2 = _c.pos2, pos3 = _c.pos3, pos4 = _c.pos4, target = _c.target, direction = _c.direction; return React.createElement(ControlBoxElement, { ref: frameworkUtils.ref(this, "controlBox"), className: prefix("control-box", direction === -1 ? "reverse" : ""), style: { position: "absolute", display: target ? "block" : "none", transform: "translate(" + (left - parentLeft) + "px, " + (top - parentTop) + "px) translateZ(50px)" } }, this.renderAbles(), renderLine(edge ? "n" : "", pos1, pos2), renderLine(edge ? "e" : "", pos2, pos4), renderLine(edge ? "w" : "", pos1, pos3), renderLine(edge ? "s" : "", pos3, pos4)); }; __proto.componentDidMount = function () { this.controlBox.getElement(); this.updateEvent(this.props); }; __proto.componentDidUpdate = function (prevProps, prevState) { this.updateEvent(prevProps); }; __proto.componentWillUnmount = function () { unset(this, "targetDragger"); unset(this, "controlDragger"); }; __proto.getContainer = function () { var _a = this.props, parentMoveable = _a.parentMoveable, container = _a.container; return container || parentMoveable && parentMoveable.getContainer() || this.controlBox.getElement().offsetParent; }; __proto.isMoveableElement = function (target) { return target && (target.getAttribute("class") || "").indexOf(PREFIX) > -1; }; __proto.dragStart = function (e) { this.targetDragger.onDragStart(e); }; __proto.isInside = function (clientX, clientY) { var _a = this.state, pos1 = _a.pos1, pos2 = _a.pos2, pos3 = _a.pos3, pos4 = _a.pos4, target = _a.target; if (!target) { return false; } var _b = target.getBoundingClientRect(), left = _b.left, top = _b.top; var pos = [clientX - left, clientY - top]; return isInside(pos, pos1, pos2, pos4, pos3); }; __proto.updateRect = function (type, isTarget, isSetState) { if (isSetState === void 0) { isSetState = true; } var parentMoveable = this.props.parentMoveable; var state = this.state; var target = state.target || this.props.target; this.updateState(getTargetInfo(target, this.getContainer(), isTarget ? state : undefined), parentMoveable ? false : isSetState); }; __proto.updateEvent = function (prevProps) { var controlBoxElement = this.controlBox.getElement(); var hasTargetAble = this.targetAbles.length; var hasControlAble = this.controlAbles.length; var target = this.props.target; var prevTarget = prevProps.target; var dragArea = this.props.dragArea; var prevDragArea = prevProps.dragArea; var isTargetChanged = !dragArea && prevTarget !== target; var isUnset = !hasTargetAble && this.targetDragger || isTargetChanged || prevDragArea !== dragArea; if (isUnset) { unset(this, "targetDragger"); this.updateState({ dragger: null }); } if (!hasControlAble) { unset(this, "controlDragger"); } if (target && hasTargetAble && !this.targetDragger) { if (dragArea) { this.targetDragger = getAbleDragger(this, this.areaElement, "targetAbles", ""); } else { this.targetDragger = getAbleDragger(this, target, "targetAbles", ""); } } if (!this.controlDragger && hasControlAble) { this.controlDragger = getAbleDragger(this, controlBoxElement, "controlAbles", "Control"); } if (isUnset) { this.unsetAbles(); } }; __proto.updateTarget = function (type) { this.updateRect(type, true); }; __proto.checkUpdate = function () { var props = this.props; var target = props.target, parentMoveable = props.parentMoveable; var stateTarget = this.state.target; if (!stateTarget && !target) { return; } this.updateAbles(); var isTargetChanged = stateTarget !== target; if (!isTargetChanged) { return; } this.updateState({ target: target }); if (!parentMoveable) { this.updateRect("End", false, false); } }; __proto.triggerEvent = function (name, e) { var callback = this.props[name]; return callback && callback(e); }; __proto.unsetAbles = function () { var _this = this; if (this.targetAbles.filter(function (able) { if (able.unset) { able.unset(_this); return true; } return false; }).length) { this.forceUpdate(); } }; __proto.updateAbles = function (ables, eventAffix) { if (ables === void 0) { ables = this.props.ables; } if (eventAffix === void 0) { eventAffix = ""; } var props = this.props; var enabledAbles = ables.filter(function (able) { return able && props[able.name]; }); var controlAbleOnly = false; var dragStart = "drag" + eventAffix + "Start"; var pinchStart = "pinch" + eventAffix + "Start"; var dragControlStart = "drag" + eventAffix + "ControlStart"; var targetAbles = enabledAbles.filter(function (able) { return able[dragStart] || able[pinchStart]; }); var controlAbles = enabledAbles.filter(function (e) { var dragControlOnly = e.dragControlOnly; if (!e[dragControlStart] || dragControlOnly && controlAbleOnly) { return false; } if (dragControlOnly) { controlAbleOnly = true; } return true; }); this.targetAbles = targetAbles; this.controlAbles = controlAbles; }; __proto.updateState = function (nextState, isSetState) { if (isSetState) { this.setState(nextState); } else { var state = this.state; for (var name in nextState) { state[name] = nextState[name]; } } }; __proto.renderAbles = function () { var _this = this; var ables = this.targetAbles.concat(this.controlAbles, [Origin, DragArea]); var enabledAbles = {}; return ables.map(function (able) { if (enabledAbles[able.name] || !able.render) { return undefined; } enabledAbles[able.name] = true; return able.render(_this, React); }); }; MoveableManager.defaultProps = { target: null, container: null, origin: true, keepRatio: true, edge: false, parentMoveable: null, parentPosition: null, ables: [], pinchThreshold: 20, dragArea: false, transformOrigin: "" }; return MoveableManager; }(React.PureComponent); function getRotatiion(touches) { return matrix.getRad([touches[0].clientX, touches[0].clientY], [touches[1].clientX, touches[1].clientY]) / Math.PI * 180; } var Pinchable = { name: "pinchable", updateRect: true, pinchStart: function (moveable, _a) { var _b; var datas = _a.datas, clientX = _a.clientX, clientY = _a.clientY, touches = _a.touches, inputEvent = _a.inputEvent, targets = _a.targets; var _c = moveable.props, pinchable = _c.pinchable, ables = _c.ables; if (!pinchable) { return false; } var state = moveable.state; var eventName = "onPinch" + (targets ? "Group" : "") + "Start"; var controlEventName = "drag" + (targets ? "Group" : "") + "ControlStart"; var pinchAbles = (pinchable === true ? moveable.controlAbles : ables.filter(function (able) { return pinchable.indexOf(able.name) > -1; })).filter(function (able) { return able.canPinch && able[controlEventName]; }); datas.pinchableDatas = {}; var result = triggerEvent(moveable, eventName, (_b = {}, _b[targets ? "targets" : "target"] = targets ? targets : state.target, _b.clientX = clientX, _b.clientY = clientY, _b.datas = datas.pinchableDatas, _b)); datas.isPinch = result !== false; datas.ables = pinchAbles; var isPinch = datas.isPinch; if (!isPinch) { return false; } var parentRotate = getRotatiion(touches); pinchAbles.forEach(function (able) { datas[able.name + "Datas"] = {}; var e = { datas: datas[able.name + "Datas"], clientX: clientX, clientY: clientY, inputEvent: inputEvent, parentRotate: parentRotate, pinchFlag: true }; able[controlEventName](moveable, e); }); moveable.state.snapDirection = [0, 0]; return isPinch; }, pinch: function (moveable, _a) { var _b; var datas = _a.datas, clientX = _a.clientX, clientY = _a.clientY, pinchScale = _a.scale, distance = _a.distance, touches = _a.touches, inputEvent = _a.inputEvent, targets = _a.targets; if (!datas.isPinch) { return; } var parentRotate = getRotatiion(touches); var parentDistance = distance * (1 - 1 / pinchScale); var target = moveable.state.target; var params = (_b = {}, _b[targets ? "targets" : "target"] = targets ? targets : target, _b.clientX = clientX, _b.clientY = clientY, _b.datas = datas.pinchableDatas, _b); var eventName = "onPinch" + (targets ? "Group" : ""); triggerEvent(moveable, eventName, params); var ables = datas.ables; var controlEventName = "drag" + (targets ? "Group" : "") + "Control"; ables.forEach(function (able) { able[controlEventName](moveable, { clientX: clientX, clientY: clientY, datas: datas[able.name + "Datas"], inputEvent: inputEvent, parentDistance: parentDistance, parentRotate: parentRotate, pinchFlag: true }); }); return params; }, pinchEnd: function (moveable, _a) { var _b; var datas = _a.datas, clientX = _a.clientX, clientY = _a.clientY, isPinch = _a.isPinch, inputEvent = _a.inputEvent, targets = _a.targets; if (!datas.isPinch) { return; } var target = moveable.state.target; var eventName = "onPinch" + (targets ? "Group" : "") + "End"; triggerEvent(moveable, eventName, (_b = {}, _b[targets ? "targets" : "target"] = targets ? targets : target, _b.isDrag = isPinch, _b.clientX = clientX, _b.clientY = clientY, _b.datas = datas.pinchableDatas, _b)); var ables = datas.ables; var controlEventName = "drag" + (targets ? "Group" : "") + "ControlEnd"; ables.forEach(function (able) { able[controlEventName](moveable, { clientX: clientX, clientY: clientY, isDrag: isPinch, datas: datas[able.name + "Datas"], inputEvent: inputEvent, pinchFlag: true }); }); return isPinch; }, pinchGroupStart: function (moveable, e) { return this.pinchStart(moveable, __assign({}, e, { targets: moveable.props.targets })); }, pinchGroup: function (moveable, e) { return this.pinch(moveable, __assign({}, e, { targets: moveable.props.targets })); }, pinchGroupEnd: function (moveable, e) { return this.pinchEnd(moveable, __assign({}, e, { targets: moveable.props.targets })); } }; function triggerChildAble(moveable, able, type, datas, eachEvent, callback) { var name = able.name; var ableDatas = datas[name] || (datas[name] = []); var isEnd = !!type.match(/End$/g); var childs = moveable.moveables.map(function (child, i) { var childDatas = ableDatas[i] || (ableDatas[i] = {}); var childEvent = utils.isFunction(eachEvent) ? eachEvent(child, childDatas) : eachEvent; var result = able[type](child, __assign({}, childEvent, { datas: childDatas, parentFlag: true })); result && callback && callback(child, childDatas, result, i); if (isEnd) { child.state.dragger = null; } return result; }); return childs; } function directionCondition(target) { return utils.hasClass(target, prefix("direction")); } function setDragStart(moveable, _a) { var datas = _a.datas; var _b = moveable.state, matrix$1 = _b.matrix, beforeMatrix = _b.beforeMatrix, is3d = _b.is3d, left = _b.left, top = _b.top, origin = _b.origin, offsetMatrix = _b.offsetMatrix, targetMatrix = _b.targetMatrix, transformOrigin = _b.transformOrigin; var n = is3d ? 4 : 3; datas.is3d = is3d; datas.matrix = matrix$1; datas.targetMatrix = targetMatrix; datas.beforeMatrix = beforeMatrix; datas.offsetMatrix = offsetMatrix; datas.transformOrigin = transformOrigin; datas.inverseMatrix = matrix.invert(matrix$1, n); datas.inverseBeforeMatrix = matrix.invert(beforeMatrix, n); datas.absoluteOrigin = matrix.convertPositionMatrix(matrix.plus([left, top], origin), n); datas.startDragBeforeDist = matrix.caculate(datas.inverseBeforeMatrix, datas.absoluteOrigin, n); datas.startDragDist = matrix.caculate(datas.inverseMatrix, datas.absoluteOrigin, n); } function getDragDist(_a, isBefore) { var datas = _a.datas, distX = _a.distX, distY = _a.distY; var inverseBeforeMatrix = datas.inverseBeforeMatrix, inverseMatrix = datas.inverseMatrix, is3d = datas.is3d, startDragBeforeDist = datas.startDragBeforeDist, startDragDist = datas.startDragDist, absoluteOrigin = datas.absoluteOrigin; var n = is3d ? 4 : 3; return matrix.minus(matrix.caculate(isBefore ? inverseBeforeMatrix : inverseMatrix, matrix.plus(absoluteOrigin, [distX, distY]), n), isBefore ? startDragBeforeDist : startDragDist); } function caculateTransformOrigin(transformOrigin, width, height, prevWidth, prevHeight, prevOrigin) { if (prevWidth === void 0) { prevWidth = width; } if (prevHeight === void 0) { prevHeight = height; } if (prevOrigin === void 0) { prevOrigin = [0, 0]; } if (!transformOrigin) { return prevOrigin; } return transformOrigin.map(function (pos, i) { var _a = utils.splitUnit(pos), value = _a.value, unit = _a.unit; var prevSize = i ? prevHeight : prevWidth; var size = i ? height : width; if (pos === "%" || isNaN(value)) { // no value but % var measureRatio = prevSize ? prevOrigin[i] / prevSize : 0; return size * measureRatio; } else if (unit !== "%") { return value; } return size * value / 100; }); } function getPosesByDirection(_a, direction) { var pos1 = _a[0], pos2 = _a[1], pos3 = _a[2], pos4 = _a[3]; /* [-1, -1](pos1) [0, -1](pos1,pos2) [1, -1](pos2) [-1, 0](pos1, pos3) [1, 0](pos2, pos4) [-1, 1](pos3) [0, 1](pos3, pos4) [1, 1](pos4) */ var poses = []; if (direction[1] >= 0) { if (direction[0] >= 0) { poses.push(pos4); } if (direction[0] <= 0) { poses.push(pos3); } } if (direction[1] <= 0) { if (direction[0] >= 0) { poses.push(pos2); } if (direction[0] <= 0) { poses.push(pos1); } } return poses; } function getPosByDirection(poses, direction) { /* [-1, -1](pos1) [0, -1](pos1,pos2) [1, -1](pos2) [-1, 0](pos1, pos3) [1, 0](pos2, pos4) [-1, 1](pos3) [0, 1](pos3, pos4) [1, 1](pos4) */ var nextPoses = getPosesByDirection(poses, direction); return [matrix.average.apply(void 0, nextPoses.map(function (pos) { return pos[0]; })), matrix.average.apply(void 0, nextPoses.map(function (pos) { return pos[1]; }))]; } function getPosByReverseDirection(_a, direction) { /* [-1, -1](pos4) [0, -1](pos3,pos4) [1, -1](pos3) [-1, 0](pos2, pos4) [1, 0](pos3, pos1) [-1, 1](pos2) [0, 1](pos1, pos2) [1, 1](pos1) */ var pos1 = _a[0], pos2 = _a[1], pos3 = _a[2], pos4 = _a[3]; return getPosByDirection([pos4, pos3, pos2, pos1], direction); } function getStartPos(poses, direction) { var startPos1 = poses[0], startPos2 = poses[1], startPos3 = poses[2], startPos4 = poses[3]; return getPosByReverseDirection([startPos1, startPos2, startPos3, startPos4], direction); } function getDist(startPos, matrix, width, height, n, direction) { var poses = caculatePoses(matrix, width, height, n); var pos = getPosByReverseDirection(poses, direction); var distX = startPos[0] - pos[0]; var distY = startPos[1] - pos[1]; return [distX, distY]; } function getNextMatrix(offsetMatrix, targetMatrix, origin, n) { return matrix.multiply(offsetMatrix, getAbsoluteMatrix(targetMatrix, n, origin), n); } function scaleMatrix(state, scale) { var transformOrigin = state.transformOrigin, offsetMatrix = state.offsetMatrix, is3d = state.is3d, targetMatrix = state.targetMatrix; var n = is3d ? 4 : 3; return getNextMatrix(offsetMatrix, matrix.multiply(targetMatrix, matrix.createScaleMatrix(scale, n), n), transformOrigin, n); } function getScaleDist(moveable, scale, direction, dragClient) { var state = moveable.state; var is3d = state.is3d, left = state.left, top = state.top, width = state.width, height = state.height; var n = is3d ? 4 : 3; var groupable = moveable.props.groupable; var nextMatrix = scaleMatrix(moveable.state, scale); var groupLeft = groupable ? left : 0; var groupTop = groupable ? top : 0; var startPos = dragClient ? dragClient : getStartPos(getAbsolutePosesByState(moveable.state), direction); var dist = getDist(startPos, nextMatrix, width, height, n, direction); return matrix.minus(dist, [groupLeft, groupTop]); } function getResizeDist(moveable, width, height, direction, transformOrigin, dragClient) { var groupable = moveable.props.groupable; var _a = moveable.state, prevOrigin = _a.transformOrigin, targetMatrix = _a.targetMatrix, offsetMatrix = _a.offsetMatrix, is3d = _a.is3d, prevWidth = _a.width, prevheight = _a.height, left = _a.left, top = _a.top; var n = is3d ? 4 : 3; var nextOrigin = caculateTransformOrigin(transformOrigin, width, height, prevWidth, prevheight, prevOrigin); var groupLeft = groupable ? left : 0; var groupTop = groupable ? top : 0; var nextMatrix = getNextMatrix(offsetMatrix, targetMatrix, nextOrigin, n); var startPos = dragClient ? dragClient : getStartPos(getAbsolutePosesByState(moveable.state), direction); var dist = getDist(startPos, nextMatrix, width, height, n, direction); return matrix.minus(dist, [groupLeft, groupTop]); } var Draggable = { name: "draggable", dragStart: function (moveable, _a) { var datas = _a.datas, clientX = _a.clientX, clientY = _a.clientY, parentEvent = _a.parentEvent, parentDragger = _a.parentDragger; var state = moveable.state; var targetTransform = state.targetTransform, target = state.target, dragger = state.dragger; if (dragger) { return false; } state.dragger = parentDragger || moveable.targetDragger; var style = window.getComputedStyle(target); datas.datas = {}; datas.left = parseFloat(style.left || "") || 0; datas.top = parseFloat(style.top || "") || 0; datas.bottom = parseFloat(style.bottom || "") || 0; datas.right = parseFloat(style.right || "") || 0; datas.transform = targetTransform; datas.startTranslate = [0, 0]; setDragStart(moveable, { datas: datas }); datas.prevDist = [0, 0]; datas.prevBeforeDist = [0, 0]; datas.isDrag = false; var params = { datas: datas.datas, target: target, clientX: clientX, clientY: clientY, set: function (translate) { datas.startTranslate = translate; } }; var result = parentEvent || triggerEvent(moveable, "onDragStart", params); if (result !== false) { datas.isDrag = true; } else { state.dragger = null; datas.isPinch = false; } return datas.isDrag ? params : false; }, drag: function (moveable, _a) { var datas = _a.datas, distX = _a.distX, distY = _a.distY, clientX = _a.clientX, clientY = _a.clientY, parentEvent = _a.parentEvent; var isPinch = datas.isPinch, isDrag = datas.isDrag, prevDist = datas.prevDist, prevBeforeDist = datas.prevBeforeDist, transform = datas.transform, startTranslate = datas.startTranslate; if (!isDrag) { return; } var props = moveable.props; var parentMoveable = props.parentMoveable; var throttleDrag = parentEvent ? 0 : props.throttleDrag || 0; var target = moveable.state.target; var beforeTranslate = matrix.plus(getDragDist({ datas: datas, distX: distX, distY: distY }, true), startTranslate); var translate = matrix.plus(getDragDist({ datas: datas, distX: distX, distY: distY }, false), startTranslate); throttleArray(translate, throttleDrag); throttleArray(beforeTranslate, throttleDrag); var beforeDist = matrix.minus(beforeTranslate, startTranslate); var dist = matrix.minus(translate, startTranslate); var delta = matrix.minus(dist, prevDist); var beforeDelta = matrix.minus(beforeDist, prevBeforeDist); datas.prevDist = dist; datas.prevBeforeDist = beforeDist; var left = datas.left + beforeDist[0]; var top = datas.top + beforeDist[1]; var right = datas.right - beforeDist[0]; var bottom = datas.bottom - beforeDist[1]; var nextTransform = transform + " translate(" + dist[0] + "px, " + dist[1] + "px)"; if (!parentEvent && !parentMoveable && delta.every(function (num) { return !num; }) && beforeDelta.some(function (num) { return !num; })) { return; } var params = { datas: datas.datas, target: target, transform: nextTransform, dist: dist, delta: delta, translate: translate, beforeDist: beforeDist, beforeDelta: beforeDelta, beforeTranslate: beforeTranslate, left: left, top: top, right: right, bottom: bottom, clientX: clientX, clientY: clientY, isPinch: isPinch }; !parentEvent && triggerEvent(moveable, "onDrag", params); return params; }, dragEnd: function (moveable, _a) { var parentEvent = _a.parentEvent, datas = _a.datas, isDrag = _a.isDrag, clientX = _a.clientX, clientY = _a.clientY; if (!datas.isDrag) { return; } moveable.state.dragger = null; datas.isDrag = false; !parentEvent && triggerEvent(moveable, "onDragEnd", { target: moveable.state.target, isDrag: isDrag, clientX: clientX, clientY: clientY, datas: d