@pie-lib/tools 0.16.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -15
- package/lib/anchor-utils.js +249 -0
- package/lib/anchor-utils.js.map +1 -0
- package/lib/anchor.js +41 -0
- package/lib/anchor.js.map +1 -0
- package/lib/index.js +43 -0
- package/lib/index.js.map +1 -0
- package/lib/protractor/graphic.js +184 -0
- package/lib/protractor/graphic.js.map +1 -0
- package/lib/protractor/index.js +120 -0
- package/lib/protractor/index.js.map +1 -0
- package/lib/rotatable.js +403 -0
- package/lib/rotatable.js.map +1 -0
- package/lib/ruler/graphic.js +126 -0
- package/lib/ruler/graphic.js.map +1 -0
- package/lib/ruler/index.js +146 -0
- package/lib/ruler/index.js.map +1 -0
- package/lib/ruler/unit-type.js +72 -0
- package/lib/ruler/unit-type.js.map +1 -0
- package/lib/ruler/unit.js +161 -0
- package/lib/ruler/unit.js.map +1 -0
- package/lib/style-utils.js +28 -0
- package/lib/style-utils.js.map +1 -0
- package/lib/transform-origin.js +82 -0
- package/lib/transform-origin.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = exports.Protractor = void 0;
|
|
9
|
+
|
|
10
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
11
|
+
|
|
12
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
13
|
+
|
|
14
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
15
|
+
|
|
16
|
+
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
17
|
+
|
|
18
|
+
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
19
|
+
|
|
20
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
21
|
+
|
|
22
|
+
var _react = _interopRequireDefault(require("react"));
|
|
23
|
+
|
|
24
|
+
var _styles = require("@material-ui/core/styles");
|
|
25
|
+
|
|
26
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
27
|
+
|
|
28
|
+
var _graphic = _interopRequireDefault(require("./graphic"));
|
|
29
|
+
|
|
30
|
+
var _anchor = _interopRequireDefault(require("../anchor"));
|
|
31
|
+
|
|
32
|
+
var _rotatable = _interopRequireDefault(require("../rotatable"));
|
|
33
|
+
|
|
34
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
35
|
+
|
|
36
|
+
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
|
|
37
|
+
|
|
38
|
+
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
39
|
+
|
|
40
|
+
var Protractor = /*#__PURE__*/function (_React$Component) {
|
|
41
|
+
(0, _inherits2["default"])(Protractor, _React$Component);
|
|
42
|
+
|
|
43
|
+
var _super = _createSuper(Protractor);
|
|
44
|
+
|
|
45
|
+
function Protractor() {
|
|
46
|
+
(0, _classCallCheck2["default"])(this, Protractor);
|
|
47
|
+
return _super.apply(this, arguments);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
(0, _createClass2["default"])(Protractor, [{
|
|
51
|
+
key: "render",
|
|
52
|
+
value: function render() {
|
|
53
|
+
var _this$props = this.props,
|
|
54
|
+
classes = _this$props.classes,
|
|
55
|
+
width = _this$props.width,
|
|
56
|
+
className = _this$props.className,
|
|
57
|
+
startPosition = _this$props.startPosition;
|
|
58
|
+
return /*#__PURE__*/_react["default"].createElement(_rotatable["default"], {
|
|
59
|
+
className: className,
|
|
60
|
+
startPosition: startPosition,
|
|
61
|
+
handle: [{
|
|
62
|
+
"class": 'leftAnchor',
|
|
63
|
+
origin: "".concat(width * 0.495, "px ").concat(width * 0.49, "px")
|
|
64
|
+
}, {
|
|
65
|
+
"class": 'rightAnchor',
|
|
66
|
+
origin: "".concat(width * 0.495, "px ").concat(width * 0.49, "px")
|
|
67
|
+
}]
|
|
68
|
+
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
69
|
+
className: classes.protractor,
|
|
70
|
+
style: {
|
|
71
|
+
width: "".concat(width, "px")
|
|
72
|
+
}
|
|
73
|
+
}, /*#__PURE__*/_react["default"].createElement(_graphic["default"], null), /*#__PURE__*/_react["default"].createElement(_anchor["default"], {
|
|
74
|
+
className: (0, _classnames["default"])('leftAnchor', classes.leftAnchor)
|
|
75
|
+
}), /*#__PURE__*/_react["default"].createElement(_anchor["default"], {
|
|
76
|
+
className: (0, _classnames["default"])('rightAnchor', classes.rightAnchor)
|
|
77
|
+
})));
|
|
78
|
+
}
|
|
79
|
+
}]);
|
|
80
|
+
return Protractor;
|
|
81
|
+
}(_react["default"].Component);
|
|
82
|
+
|
|
83
|
+
exports.Protractor = Protractor;
|
|
84
|
+
(0, _defineProperty2["default"])(Protractor, "propTypes", {
|
|
85
|
+
classes: _propTypes["default"].object.isRequired,
|
|
86
|
+
width: _propTypes["default"].number.isRequired,
|
|
87
|
+
className: _propTypes["default"].string,
|
|
88
|
+
startPosition: _propTypes["default"].shape({
|
|
89
|
+
left: _propTypes["default"].number,
|
|
90
|
+
top: _propTypes["default"].number
|
|
91
|
+
})
|
|
92
|
+
});
|
|
93
|
+
(0, _defineProperty2["default"])(Protractor, "defaultProps", {
|
|
94
|
+
width: 450,
|
|
95
|
+
startPosition: {
|
|
96
|
+
left: 0,
|
|
97
|
+
top: 0
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
var _default = (0, _styles.withStyles)(function () {
|
|
102
|
+
return {
|
|
103
|
+
protractor: {
|
|
104
|
+
position: 'relative'
|
|
105
|
+
},
|
|
106
|
+
leftAnchor: {
|
|
107
|
+
position: 'absolute',
|
|
108
|
+
left: 0,
|
|
109
|
+
bottom: 0
|
|
110
|
+
},
|
|
111
|
+
rightAnchor: {
|
|
112
|
+
position: 'absolute',
|
|
113
|
+
right: 0,
|
|
114
|
+
bottom: 0
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
})(Protractor);
|
|
118
|
+
|
|
119
|
+
exports["default"] = _default;
|
|
120
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/protractor/index.jsx"],"names":["Protractor","props","classes","width","className","startPosition","origin","protractor","leftAnchor","rightAnchor","React","Component","PropTypes","object","isRequired","number","string","shape","left","top","position","bottom","right"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;IAEaA,U;;;;;;;;;;;;WAgBX,kBAAS;AACP,wBAAqD,KAAKC,KAA1D;AAAA,UAAQC,OAAR,eAAQA,OAAR;AAAA,UAAiBC,KAAjB,eAAiBA,KAAjB;AAAA,UAAwBC,SAAxB,eAAwBA,SAAxB;AAAA,UAAmCC,aAAnC,eAAmCA,aAAnC;AACA,0BACE,gCAAC,qBAAD;AACE,QAAA,SAAS,EAAED,SADb;AAEE,QAAA,aAAa,EAAEC,aAFjB;AAGE,QAAA,MAAM,EAAE,CACN;AACE,mBAAO,YADT;AAEEC,UAAAA,MAAM,YAAKH,KAAK,GAAG,KAAb,gBAAwBA,KAAK,GAAG,IAAhC;AAFR,SADM,EAKN;AACE,mBAAO,aADT;AAEEG,UAAAA,MAAM,YAAKH,KAAK,GAAG,KAAb,gBAAwBA,KAAK,GAAG,IAAhC;AAFR,SALM;AAHV,sBAcE;AAAK,QAAA,SAAS,EAAED,OAAO,CAACK,UAAxB;AAAoC,QAAA,KAAK,EAAE;AAAEJ,UAAAA,KAAK,YAAKA,KAAL;AAAP;AAA3C,sBACE,gCAAC,mBAAD,OADF,eAGE,gCAAC,kBAAD;AAAQ,QAAA,SAAS,EAAE,4BAAW,YAAX,EAAyBD,OAAO,CAACM,UAAjC;AAAnB,QAHF,eAIE,gCAAC,kBAAD;AAAQ,QAAA,SAAS,EAAE,4BAAW,aAAX,EAA0BN,OAAO,CAACO,WAAlC;AAAnB,QAJF,CAdF,CADF;AAuBD;;;EAzC6BC,kBAAMC,S;;;iCAAzBX,U,eACQ;AACjBE,EAAAA,OAAO,EAAEU,sBAAUC,MAAV,CAAiBC,UADT;AAEjBX,EAAAA,KAAK,EAAES,sBAAUG,MAAV,CAAiBD,UAFP;AAGjBV,EAAAA,SAAS,EAAEQ,sBAAUI,MAHJ;AAIjBX,EAAAA,aAAa,EAAEO,sBAAUK,KAAV,CAAgB;AAC7BC,IAAAA,IAAI,EAAEN,sBAAUG,MADa;AAE7BI,IAAAA,GAAG,EAAEP,sBAAUG;AAFc,GAAhB;AAJE,C;iCADRf,U,kBAWW;AACpBG,EAAAA,KAAK,EAAE,GADa;AAEpBE,EAAAA,aAAa,EAAE;AAAEa,IAAAA,IAAI,EAAE,CAAR;AAAWC,IAAAA,GAAG,EAAE;AAAhB;AAFK,C;;eAiCT,wBAAW;AAAA,SAAO;AAC/BZ,IAAAA,UAAU,EAAE;AAAEa,MAAAA,QAAQ,EAAE;AAAZ,KADmB;AAE/BZ,IAAAA,UAAU,EAAE;AACVY,MAAAA,QAAQ,EAAE,UADA;AAEVF,MAAAA,IAAI,EAAE,CAFI;AAGVG,MAAAA,MAAM,EAAE;AAHE,KAFmB;AAO/BZ,IAAAA,WAAW,EAAE;AACXW,MAAAA,QAAQ,EAAE,UADC;AAEXE,MAAAA,KAAK,EAAE,CAFI;AAGXD,MAAAA,MAAM,EAAE;AAHG;AAPkB,GAAP;AAAA,CAAX,EAYXrB,UAZW,C","sourcesContent":["import React from 'react';\nimport { withStyles } from '@material-ui/core/styles';\nimport PropTypes from 'prop-types';\nimport Graphic from './graphic';\nimport Anchor from '../anchor';\nimport Rotatable from '../rotatable';\nimport classNames from 'classnames';\n\nexport class Protractor extends React.Component {\n static propTypes = {\n classes: PropTypes.object.isRequired,\n width: PropTypes.number.isRequired,\n className: PropTypes.string,\n startPosition: PropTypes.shape({\n left: PropTypes.number,\n top: PropTypes.number,\n }),\n };\n\n static defaultProps = {\n width: 450,\n startPosition: { left: 0, top: 0 },\n };\n\n render() {\n const { classes, width, className, startPosition } = this.props;\n return (\n <Rotatable\n className={className}\n startPosition={startPosition}\n handle={[\n {\n class: 'leftAnchor',\n origin: `${width * 0.495}px ${width * 0.49}px`,\n },\n {\n class: 'rightAnchor',\n origin: `${width * 0.495}px ${width * 0.49}px`,\n },\n ]}\n >\n <div className={classes.protractor} style={{ width: `${width}px` }}>\n <Graphic />\n\n <Anchor className={classNames('leftAnchor', classes.leftAnchor)} />\n <Anchor className={classNames('rightAnchor', classes.rightAnchor)} />\n </div>\n </Rotatable>\n );\n }\n}\n\nexport default withStyles(() => ({\n protractor: { position: 'relative' },\n leftAnchor: {\n position: 'absolute',\n left: 0,\n bottom: 0,\n },\n rightAnchor: {\n position: 'absolute',\n right: 0,\n bottom: 0,\n },\n}))(Protractor);\n"],"file":"index.js"}
|
package/lib/rotatable.js
ADDED
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = exports.Rotatable = void 0;
|
|
9
|
+
|
|
10
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
11
|
+
|
|
12
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
13
|
+
|
|
14
|
+
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
|
|
15
|
+
|
|
16
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
17
|
+
|
|
18
|
+
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
19
|
+
|
|
20
|
+
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
21
|
+
|
|
22
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
23
|
+
|
|
24
|
+
var _react = _interopRequireDefault(require("react"));
|
|
25
|
+
|
|
26
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
27
|
+
|
|
28
|
+
var _styles = require("@material-ui/core/styles");
|
|
29
|
+
|
|
30
|
+
var _anchorUtils = require("./anchor-utils");
|
|
31
|
+
|
|
32
|
+
var _reactPortal = require("react-portal");
|
|
33
|
+
|
|
34
|
+
var _pointGeometry = _interopRequireDefault(require("@mapbox/point-geometry"));
|
|
35
|
+
|
|
36
|
+
var _transformOrigin = require("./transform-origin");
|
|
37
|
+
|
|
38
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
39
|
+
|
|
40
|
+
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
|
|
41
|
+
|
|
42
|
+
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
43
|
+
|
|
44
|
+
var Anchor = (0, _styles.withStyles)({
|
|
45
|
+
anchor: {
|
|
46
|
+
position: 'absolute',
|
|
47
|
+
zIndex: 100,
|
|
48
|
+
width: '200px',
|
|
49
|
+
height: '80px'
|
|
50
|
+
}
|
|
51
|
+
})(function (_ref) {
|
|
52
|
+
var classes = _ref.classes,
|
|
53
|
+
left = _ref.left,
|
|
54
|
+
top = _ref.top,
|
|
55
|
+
color = _ref.color,
|
|
56
|
+
fill = _ref.fill;
|
|
57
|
+
color = color || 'green';
|
|
58
|
+
fill = fill || 'white';
|
|
59
|
+
return /*#__PURE__*/_react["default"].createElement(_reactPortal.Portal, null, /*#__PURE__*/_react["default"].createElement("svg", {
|
|
60
|
+
className: classes.anchor,
|
|
61
|
+
style: {
|
|
62
|
+
left: left - 10,
|
|
63
|
+
top: top - 10
|
|
64
|
+
}
|
|
65
|
+
}, /*#__PURE__*/_react["default"].createElement("circle", {
|
|
66
|
+
cx: 10,
|
|
67
|
+
cy: 10,
|
|
68
|
+
r: 8,
|
|
69
|
+
strokeWidth: 1,
|
|
70
|
+
stroke: color,
|
|
71
|
+
fill: fill
|
|
72
|
+
})));
|
|
73
|
+
});
|
|
74
|
+
/**
|
|
75
|
+
* Tip o' the hat to:
|
|
76
|
+
* https://bl.ocks.org/joyrexus/7207044
|
|
77
|
+
*/
|
|
78
|
+
|
|
79
|
+
var Rotatable = /*#__PURE__*/function (_React$Component) {
|
|
80
|
+
(0, _inherits2["default"])(Rotatable, _React$Component);
|
|
81
|
+
|
|
82
|
+
var _super = _createSuper(Rotatable);
|
|
83
|
+
|
|
84
|
+
function Rotatable(props) {
|
|
85
|
+
var _this;
|
|
86
|
+
|
|
87
|
+
(0, _classCallCheck2["default"])(this, Rotatable);
|
|
88
|
+
_this = _super.call(this, props);
|
|
89
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "initHandles", function () {
|
|
90
|
+
var handle = _this.props.handle;
|
|
91
|
+
|
|
92
|
+
if (Array.isArray(handle)) {
|
|
93
|
+
_this.handles = [];
|
|
94
|
+
handle.forEach(function (h) {
|
|
95
|
+
var el = _this.rotatable.querySelector(".".concat(h["class"]));
|
|
96
|
+
|
|
97
|
+
if (el) {
|
|
98
|
+
var mousedownHandler = _this.rotateStart(h.origin);
|
|
99
|
+
|
|
100
|
+
el.addEventListener('mousedown', mousedownHandler);
|
|
101
|
+
el.addEventListener('mouseup', _this.rotateStop);
|
|
102
|
+
|
|
103
|
+
_this.handles.push({
|
|
104
|
+
el: el,
|
|
105
|
+
mousedownHandler: mousedownHandler
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "addMouseUpHandler", function () {
|
|
112
|
+
document.addEventListener('mouseup', _this.rotateStop);
|
|
113
|
+
});
|
|
114
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "originToXY", function (origin) {
|
|
115
|
+
var _this$rotatable = _this.rotatable,
|
|
116
|
+
width = _this$rotatable.clientWidth,
|
|
117
|
+
height = _this$rotatable.clientHeight;
|
|
118
|
+
return (0, _transformOrigin.parse)({
|
|
119
|
+
width: width,
|
|
120
|
+
height: height
|
|
121
|
+
}, origin);
|
|
122
|
+
});
|
|
123
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getAnchor", function (origin) {
|
|
124
|
+
var rotation = _this.state.rotation;
|
|
125
|
+
var _this$rotatable2 = _this.rotatable,
|
|
126
|
+
clientWidth = _this$rotatable2.clientWidth,
|
|
127
|
+
clientHeight = _this$rotatable2.clientHeight;
|
|
128
|
+
|
|
129
|
+
var _this$rotatable$getBo = _this.rotatable.getBoundingClientRect(),
|
|
130
|
+
top = _this$rotatable$getBo.top,
|
|
131
|
+
left = _this$rotatable$getBo.left;
|
|
132
|
+
|
|
133
|
+
var xy = _this.originToXY(origin);
|
|
134
|
+
|
|
135
|
+
var _calcAnchor = (0, _anchorUtils.getAnchor)({
|
|
136
|
+
width: clientWidth,
|
|
137
|
+
height: clientHeight
|
|
138
|
+
}, xy, rotation),
|
|
139
|
+
anchorTop = _calcAnchor.top,
|
|
140
|
+
anchorLeft = _calcAnchor.left;
|
|
141
|
+
|
|
142
|
+
return {
|
|
143
|
+
top: top + anchorTop,
|
|
144
|
+
left: left + anchorLeft
|
|
145
|
+
};
|
|
146
|
+
});
|
|
147
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "rotateStart", function (origin) {
|
|
148
|
+
return function (e) {
|
|
149
|
+
var isRotating = _this.state.isRotating;
|
|
150
|
+
|
|
151
|
+
if (isRotating) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
e.preventDefault();
|
|
156
|
+
|
|
157
|
+
var anchor = _this.getAnchor(origin);
|
|
158
|
+
|
|
159
|
+
var rotation = _this.state.rotation;
|
|
160
|
+
|
|
161
|
+
var _this$getAngle = _this.getAngle(anchor, e),
|
|
162
|
+
startAngle = _this$getAngle.angle;
|
|
163
|
+
|
|
164
|
+
var diff = {
|
|
165
|
+
x: 0,
|
|
166
|
+
y: 0
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
if (origin !== _this.state.origin) {
|
|
170
|
+
var _this$rotatable3 = _this.rotatable,
|
|
171
|
+
width = _this$rotatable3.clientWidth,
|
|
172
|
+
height = _this$rotatable3.clientHeight;
|
|
173
|
+
diff = (0, _anchorUtils.distanceBetween)({
|
|
174
|
+
width: width,
|
|
175
|
+
height: height
|
|
176
|
+
}, rotation, _this.state.origin, origin);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
_this.setState({
|
|
180
|
+
origin: origin,
|
|
181
|
+
isRotating: true,
|
|
182
|
+
startAngle: startAngle,
|
|
183
|
+
anchor: anchor,
|
|
184
|
+
position: {
|
|
185
|
+
left: _this.state.position.left + diff.x,
|
|
186
|
+
top: _this.state.position.top + diff.y
|
|
187
|
+
}
|
|
188
|
+
}, function () {
|
|
189
|
+
document.addEventListener('mousemove', _this.rotate);
|
|
190
|
+
});
|
|
191
|
+
};
|
|
192
|
+
});
|
|
193
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "rotateStop", function (e) {
|
|
194
|
+
var isRotating = _this.state.isRotating;
|
|
195
|
+
|
|
196
|
+
if (!isRotating) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
e.preventDefault();
|
|
201
|
+
|
|
202
|
+
_this.setState({
|
|
203
|
+
isRotating: false,
|
|
204
|
+
angle: _this.state.rotation,
|
|
205
|
+
anchor: null,
|
|
206
|
+
current: null
|
|
207
|
+
}, function () {
|
|
208
|
+
document.removeEventListener('mousemove', _this.rotate);
|
|
209
|
+
document.removeEventListener('mousemove', _this.drag);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "rotate", function (e) {
|
|
213
|
+
var isRotating = _this.state.isRotating;
|
|
214
|
+
|
|
215
|
+
if (!isRotating) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
e.preventDefault();
|
|
220
|
+
var _this$state = _this.state,
|
|
221
|
+
startAngle = _this$state.startAngle,
|
|
222
|
+
angle = _this$state.angle,
|
|
223
|
+
anchor = _this$state.anchor;
|
|
224
|
+
|
|
225
|
+
var _this$getAngle2 = _this.getAngle(anchor, e),
|
|
226
|
+
current = _this$getAngle2.angle,
|
|
227
|
+
x = _this$getAngle2.x,
|
|
228
|
+
y = _this$getAngle2.y;
|
|
229
|
+
|
|
230
|
+
var computedAnchor = {
|
|
231
|
+
x: x,
|
|
232
|
+
y: y
|
|
233
|
+
};
|
|
234
|
+
var diff = current - startAngle;
|
|
235
|
+
var rotation = angle + diff;
|
|
236
|
+
|
|
237
|
+
_this.setState({
|
|
238
|
+
rotation: rotation,
|
|
239
|
+
diff: diff,
|
|
240
|
+
current: current,
|
|
241
|
+
computedAnchor: computedAnchor
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "mouseDown", function (e) {
|
|
245
|
+
var handle = _this.handles.find(function (h) {
|
|
246
|
+
return h.el === e.target;
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
if (!handle) {
|
|
250
|
+
_this.dragStart(e);
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "dragStart", function (e) {
|
|
254
|
+
var dragPoint = new _pointGeometry["default"](e.pageX, e.pageY);
|
|
255
|
+
|
|
256
|
+
_this.setState({
|
|
257
|
+
dragPoint: dragPoint
|
|
258
|
+
}, function () {
|
|
259
|
+
document.addEventListener('mousemove', _this.drag);
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "drag", function (e) {
|
|
263
|
+
e.preventDefault();
|
|
264
|
+
var current = new _pointGeometry["default"](e.pageX, e.pageY);
|
|
265
|
+
var translate = current.sub(_this.state.dragPoint);
|
|
266
|
+
|
|
267
|
+
_this.setState({
|
|
268
|
+
translate: translate
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "mouseUp", function () {
|
|
272
|
+
if (!_this.state.translate) {
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
var _this$state2 = _this.state,
|
|
277
|
+
lastPosition = _this$state2.position,
|
|
278
|
+
translate = _this$state2.translate;
|
|
279
|
+
var position = {
|
|
280
|
+
left: lastPosition.left + translate.x,
|
|
281
|
+
top: lastPosition.top + translate.y
|
|
282
|
+
};
|
|
283
|
+
document.removeEventListener('mousemove', _this.drag);
|
|
284
|
+
|
|
285
|
+
_this.setState({
|
|
286
|
+
position: position,
|
|
287
|
+
dragPoint: null,
|
|
288
|
+
translate: null
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
_this.state = {
|
|
292
|
+
isRotating: false,
|
|
293
|
+
rotation: 0,
|
|
294
|
+
startAngle: 0,
|
|
295
|
+
angle: 0,
|
|
296
|
+
position: {
|
|
297
|
+
left: props.startPosition.left,
|
|
298
|
+
top: props.startPosition.top
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
return _this;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
(0, _createClass2["default"])(Rotatable, [{
|
|
305
|
+
key: "componentWillUnmount",
|
|
306
|
+
value: function componentWillUnmount() {
|
|
307
|
+
var _this2 = this;
|
|
308
|
+
|
|
309
|
+
document.removeEventListener('mouseup', this.rotateStop);
|
|
310
|
+
document.removeEventListener('mousemove', this.drag);
|
|
311
|
+
document.removeEventListener('mousemove', this.rotate);
|
|
312
|
+
this.handles.forEach(function (h) {
|
|
313
|
+
h.el.removeEventListener('mousedown', h.mousedownHandler);
|
|
314
|
+
h.el.removeEventListener('mouseup', _this2.rotateStop);
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
}, {
|
|
318
|
+
key: "componentDidMount",
|
|
319
|
+
value: function componentDidMount() {
|
|
320
|
+
this.addMouseUpHandler();
|
|
321
|
+
this.initHandles();
|
|
322
|
+
}
|
|
323
|
+
}, {
|
|
324
|
+
key: "getAngle",
|
|
325
|
+
value: function getAngle(anchor, e) {
|
|
326
|
+
var x = e.clientX - anchor.left;
|
|
327
|
+
var y = (e.clientY - anchor.top) * -1;
|
|
328
|
+
return {
|
|
329
|
+
angle: (0, _anchorUtils.arctangent)(x, y),
|
|
330
|
+
x: x,
|
|
331
|
+
y: y
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
}, {
|
|
335
|
+
key: "render",
|
|
336
|
+
value: function render() {
|
|
337
|
+
var _this3 = this;
|
|
338
|
+
|
|
339
|
+
var _this$props = this.props,
|
|
340
|
+
children = _this$props.children,
|
|
341
|
+
classes = _this$props.classes,
|
|
342
|
+
showAnchor = _this$props.showAnchor,
|
|
343
|
+
className = _this$props.className;
|
|
344
|
+
var _this$state3 = this.state,
|
|
345
|
+
rotation = _this$state3.rotation,
|
|
346
|
+
anchor = _this$state3.anchor,
|
|
347
|
+
origin = _this$state3.origin,
|
|
348
|
+
translate = _this$state3.translate,
|
|
349
|
+
position = _this$state3.position;
|
|
350
|
+
var t = translate ? "translate(".concat(translate.x, "px, ").concat(translate.y, "px)") : '';
|
|
351
|
+
var style = {
|
|
352
|
+
left: position.left,
|
|
353
|
+
top: position.top,
|
|
354
|
+
transformOrigin: origin,
|
|
355
|
+
transform: "".concat(t, " rotate(").concat(rotation, "deg)")
|
|
356
|
+
};
|
|
357
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
358
|
+
className: (0, _classnames["default"])(classes.rotatable, className),
|
|
359
|
+
style: style,
|
|
360
|
+
ref: function ref(r) {
|
|
361
|
+
return _this3.rotatable = r;
|
|
362
|
+
},
|
|
363
|
+
onMouseDown: this.mouseDown,
|
|
364
|
+
onMouseUp: this.mouseUp
|
|
365
|
+
}, anchor && showAnchor && /*#__PURE__*/_react["default"].createElement(Anchor, anchor), children);
|
|
366
|
+
}
|
|
367
|
+
}]);
|
|
368
|
+
return Rotatable;
|
|
369
|
+
}(_react["default"].Component);
|
|
370
|
+
|
|
371
|
+
exports.Rotatable = Rotatable;
|
|
372
|
+
(0, _defineProperty2["default"])(Rotatable, "propTypes", {
|
|
373
|
+
classes: _propTypes["default"].object.isRequired,
|
|
374
|
+
children: _propTypes["default"].oneOfType([_propTypes["default"].arrayOf(_propTypes["default"].node), _propTypes["default"].node]).isRequired,
|
|
375
|
+
showAnchor: _propTypes["default"].bool,
|
|
376
|
+
handle: _propTypes["default"].arrayOf(_propTypes["default"].shape({
|
|
377
|
+
"class": _propTypes["default"].string.isRequired,
|
|
378
|
+
origin: _propTypes["default"].string
|
|
379
|
+
})),
|
|
380
|
+
className: _propTypes["default"].string,
|
|
381
|
+
startPosition: _propTypes["default"].shape({
|
|
382
|
+
left: _propTypes["default"].number,
|
|
383
|
+
top: _propTypes["default"].number
|
|
384
|
+
})
|
|
385
|
+
});
|
|
386
|
+
(0, _defineProperty2["default"])(Rotatable, "defaultProps", {
|
|
387
|
+
showAnchor: false,
|
|
388
|
+
startPosition: {
|
|
389
|
+
left: 0,
|
|
390
|
+
top: 0
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
var _default = (0, _styles.withStyles)({
|
|
395
|
+
rotatable: {
|
|
396
|
+
position: 'relative',
|
|
397
|
+
display: 'inline-block',
|
|
398
|
+
cursor: 'move'
|
|
399
|
+
}
|
|
400
|
+
})(Rotatable);
|
|
401
|
+
|
|
402
|
+
exports["default"] = _default;
|
|
403
|
+
//# sourceMappingURL=rotatable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rotatable.jsx"],"names":["Anchor","anchor","position","zIndex","width","height","classes","left","top","color","fill","Rotatable","props","handle","Array","isArray","handles","forEach","h","el","rotatable","querySelector","mousedownHandler","rotateStart","origin","addEventListener","rotateStop","push","document","clientWidth","clientHeight","rotation","state","getBoundingClientRect","xy","originToXY","anchorTop","anchorLeft","e","isRotating","preventDefault","getAnchor","getAngle","startAngle","angle","diff","x","y","setState","rotate","current","removeEventListener","drag","computedAnchor","find","target","dragStart","dragPoint","Point","pageX","pageY","translate","sub","lastPosition","startPosition","addMouseUpHandler","initHandles","clientX","clientY","children","showAnchor","className","t","style","transformOrigin","transform","r","mouseDown","mouseUp","React","Component","PropTypes","object","isRequired","oneOfType","arrayOf","node","bool","shape","string","number","display","cursor"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport { getAnchor as calcAnchor, distanceBetween, arctangent } from './anchor-utils';\nimport { Portal } from 'react-portal';\nimport Point from '@mapbox/point-geometry';\nimport { parse as parseOrigin } from './transform-origin';\nimport classNames from 'classnames';\n\nconst Anchor = withStyles({\n anchor: {\n position: 'absolute',\n zIndex: 100,\n width: '200px',\n height: '80px',\n },\n})(({ classes, left, top, color, fill }) => {\n color = color || 'green';\n fill = fill || 'white';\n return (\n <Portal>\n <svg\n className={classes.anchor}\n style={{\n left: left - 10,\n top: top - 10,\n }}\n >\n <circle cx={10} cy={10} r={8} strokeWidth={1} stroke={color} fill={fill} />\n </svg>\n </Portal>\n );\n});\n\n/**\n * Tip o' the hat to:\n * https://bl.ocks.org/joyrexus/7207044\n */\nexport class Rotatable extends React.Component {\n static propTypes = {\n classes: PropTypes.object.isRequired,\n children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]).isRequired,\n showAnchor: PropTypes.bool,\n handle: PropTypes.arrayOf(\n PropTypes.shape({\n class: PropTypes.string.isRequired,\n origin: PropTypes.string,\n }),\n ),\n className: PropTypes.string,\n startPosition: PropTypes.shape({\n left: PropTypes.number,\n top: PropTypes.number,\n }),\n };\n\n static defaultProps = {\n showAnchor: false,\n startPosition: { left: 0, top: 0 },\n };\n\n constructor(props) {\n super(props);\n this.state = {\n isRotating: false,\n rotation: 0,\n startAngle: 0,\n angle: 0,\n position: {\n left: props.startPosition.left,\n top: props.startPosition.top,\n },\n };\n }\n\n componentWillUnmount() {\n document.removeEventListener('mouseup', this.rotateStop);\n document.removeEventListener('mousemove', this.drag);\n document.removeEventListener('mousemove', this.rotate);\n\n this.handles.forEach((h) => {\n h.el.removeEventListener('mousedown', h.mousedownHandler);\n h.el.removeEventListener('mouseup', this.rotateStop);\n });\n }\n\n componentDidMount() {\n this.addMouseUpHandler();\n this.initHandles();\n }\n\n initHandles = () => {\n const { handle } = this.props;\n\n if (Array.isArray(handle)) {\n this.handles = [];\n handle.forEach((h) => {\n const el = this.rotatable.querySelector(`.${h.class}`);\n\n if (el) {\n const mousedownHandler = this.rotateStart(h.origin);\n el.addEventListener('mousedown', mousedownHandler);\n el.addEventListener('mouseup', this.rotateStop);\n this.handles.push({ el, mousedownHandler });\n }\n });\n }\n };\n\n addMouseUpHandler = () => {\n document.addEventListener('mouseup', this.rotateStop);\n };\n\n originToXY = (origin) => {\n const { clientWidth: width, clientHeight: height } = this.rotatable;\n return parseOrigin({ width, height }, origin);\n };\n\n /**\n * Get the anchor point for the given element, origin and rotation.\n * @returns {{left:number, top: number}} - the co-ordinates of the anchor point relative to the whole page.\n */\n getAnchor = (origin) => {\n const { rotation } = this.state;\n const { clientWidth, clientHeight } = this.rotatable;\n const { top, left } = this.rotatable.getBoundingClientRect();\n const xy = this.originToXY(origin);\n const { top: anchorTop, left: anchorLeft } = calcAnchor(\n {\n width: clientWidth,\n height: clientHeight,\n },\n xy,\n rotation,\n );\n\n return {\n top: top + anchorTop,\n left: left + anchorLeft,\n };\n };\n\n rotateStart = (origin) => (e) => {\n const { isRotating } = this.state;\n if (isRotating) {\n return;\n }\n\n e.preventDefault();\n\n const anchor = this.getAnchor(origin);\n const { rotation } = this.state;\n const { angle: startAngle } = this.getAngle(anchor, e);\n\n let diff = { x: 0, y: 0 };\n if (origin !== this.state.origin) {\n const { clientWidth: width, clientHeight: height } = this.rotatable;\n diff = distanceBetween({ width, height }, rotation, this.state.origin, origin);\n }\n\n this.setState(\n {\n origin,\n isRotating: true,\n startAngle,\n anchor,\n position: {\n left: this.state.position.left + diff.x,\n top: this.state.position.top + diff.y,\n },\n },\n () => {\n document.addEventListener('mousemove', this.rotate);\n },\n );\n };\n\n rotateStop = (e) => {\n const { isRotating } = this.state;\n\n if (!isRotating) {\n return;\n }\n\n e.preventDefault();\n\n this.setState(\n {\n isRotating: false,\n angle: this.state.rotation,\n anchor: null,\n current: null,\n },\n () => {\n document.removeEventListener('mousemove', this.rotate);\n document.removeEventListener('mousemove', this.drag);\n },\n );\n };\n\n getAngle(anchor, e) {\n const x = e.clientX - anchor.left;\n const y = (e.clientY - anchor.top) * -1;\n return { angle: arctangent(x, y), x, y };\n }\n\n rotate = (e) => {\n const { isRotating } = this.state;\n if (!isRotating) {\n return;\n }\n\n e.preventDefault();\n\n const { startAngle, angle, anchor } = this.state;\n const { angle: current, x, y } = this.getAngle(anchor, e);\n const computedAnchor = { x, y };\n const diff = current - startAngle;\n const rotation = angle + diff;\n this.setState({ rotation, diff, current, computedAnchor });\n };\n\n mouseDown = (e) => {\n const handle = this.handles.find((h) => h.el === e.target);\n\n if (!handle) {\n this.dragStart(e);\n }\n };\n\n dragStart = (e) => {\n const dragPoint = new Point(e.pageX, e.pageY);\n this.setState({ dragPoint }, () => {\n document.addEventListener('mousemove', this.drag);\n });\n };\n\n drag = (e) => {\n e.preventDefault();\n const current = new Point(e.pageX, e.pageY);\n const translate = current.sub(this.state.dragPoint);\n this.setState({ translate });\n };\n\n mouseUp = () => {\n if (!this.state.translate) {\n return;\n }\n\n const { position: lastPosition, translate } = this.state;\n\n const position = {\n left: lastPosition.left + translate.x,\n top: lastPosition.top + translate.y,\n };\n\n document.removeEventListener('mousemove', this.drag);\n this.setState({ position, dragPoint: null, translate: null });\n };\n\n render() {\n const { children, classes, showAnchor, className } = this.props;\n const { rotation, anchor, origin, translate, position } = this.state;\n\n const t = translate ? `translate(${translate.x}px, ${translate.y}px)` : '';\n\n const style = {\n left: position.left,\n top: position.top,\n transformOrigin: origin,\n transform: `${t} rotate(${rotation}deg)`,\n };\n\n return (\n <div\n className={classNames(classes.rotatable, className)}\n style={style}\n ref={(r) => (this.rotatable = r)}\n onMouseDown={this.mouseDown}\n onMouseUp={this.mouseUp}\n >\n {anchor && showAnchor && <Anchor {...anchor} />}\n {children}\n </div>\n );\n }\n}\n\nexport default withStyles({\n rotatable: {\n position: 'relative',\n display: 'inline-block',\n cursor: 'move',\n },\n})(Rotatable);\n"],"file":"rotatable.js"}
|