@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.
@@ -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"}
@@ -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"}