react-sync-board 0.6.1 → 0.7.1

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/dist/esm/index.js CHANGED
@@ -4550,6 +4550,18 @@ var computeDistance = function computeDistance(_ref, _ref2) {
4550
4550
 
4551
4551
  var empty = function empty() {};
4552
4552
 
4553
+ var stopPropagation = function stopPropagation(fn) {
4554
+ return function (arg) {
4555
+ var event = arg.event;
4556
+
4557
+ if (!event.isPropagationStopped()) {
4558
+ return fn(arg);
4559
+ }
4560
+
4561
+ return null;
4562
+ };
4563
+ };
4564
+
4553
4565
  var protect = function protect(fn) {
4554
4566
  return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
4555
4567
  var _args = arguments;
@@ -4580,6 +4592,35 @@ var protect = function protect(fn) {
4580
4592
  }));
4581
4593
  };
4582
4594
 
4595
+ var PromiseQueue = /*#__PURE__*/function () {
4596
+ function PromiseQueue() {
4597
+ _classCallCheck(this, PromiseQueue);
4598
+
4599
+ _defineProperty(this, "lastPromise", Promise.resolve(true));
4600
+ }
4601
+
4602
+ _createClass(PromiseQueue, [{
4603
+ key: "add",
4604
+ value: function add(operation) {
4605
+ var _this = this;
4606
+
4607
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
4608
+ args[_key - 1] = arguments[_key];
4609
+ }
4610
+
4611
+ return new Promise(function (resolve, reject) {
4612
+ _this.lastPromise = _this.lastPromise.then(function () {
4613
+ return stopPropagation(protect(operation)).apply(void 0, args);
4614
+ }).then(resolve)["catch"](reject);
4615
+ });
4616
+ }
4617
+ }]);
4618
+
4619
+ return PromiseQueue;
4620
+ }();
4621
+
4622
+ var promiseQueue = new PromiseQueue();
4623
+
4583
4624
  var Gesture = function Gesture(_ref6) {
4584
4625
  var children = _ref6.children,
4585
4626
  _ref6$onDrag = _ref6.onDrag,
@@ -4596,57 +4637,25 @@ var Gesture = function Gesture(_ref6) {
4596
4637
  onLongTap = _ref6$onLongTap === void 0 ? empty : _ref6$onLongTap,
4597
4638
  _ref6$onDoubleTap = _ref6.onDoubleTap,
4598
4639
  onDoubleTap = _ref6$onDoubleTap === void 0 ? empty : _ref6$onDoubleTap,
4599
- onZoom = _ref6.onZoom;
4640
+ onZoom = _ref6.onZoom,
4641
+ _ref6$mainAction = _ref6.mainAction,
4642
+ mainAction = _ref6$mainAction === void 0 ? "drag" : _ref6$mainAction;
4600
4643
  var wrapperRef = React__default.useRef(null);
4601
4644
  var stateRef = React__default.useRef({
4602
4645
  moving: false,
4603
4646
  pointers: {},
4604
4647
  mainPointer: undefined
4605
4648
  });
4606
- var queueRef = React__default.useRef([]); // Queue event to avoid async mess
4607
-
4608
- var queue = React__default.useCallback(function (callback, args) {
4609
- queueRef.current.push( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
4610
- return regeneratorRuntime.wrap(function _callee2$(_context2) {
4611
- while (1) {
4612
- switch (_context2.prev = _context2.next) {
4613
- case 0:
4614
- _context2.next = 2;
4615
- return protect(callback)(args);
4616
-
4617
- case 2:
4618
- queueRef.current.shift();
4619
-
4620
- if (!(queueRef.current.length !== 0)) {
4621
- _context2.next = 6;
4622
- break;
4623
- }
4624
-
4625
- _context2.next = 6;
4626
- return protect(queueRef.current[0])();
4627
-
4628
- case 6:
4629
- case "end":
4630
- return _context2.stop();
4631
- }
4632
- }
4633
- }, _callee2);
4634
- })));
4635
-
4636
- if (queueRef.current.length === 1) {
4637
- protect(queueRef.current[0])();
4638
- }
4639
- }, []);
4640
- var onWheel = React__default.useCallback(function (e) {
4641
- var deltaX = e.deltaX,
4642
- deltaY = e.deltaY,
4643
- clientX = e.clientX,
4644
- clientY = e.clientY,
4645
- deltaMode = e.deltaMode,
4646
- ctrlKey = e.ctrlKey,
4647
- altKey = e.altKey,
4648
- metaKey = e.metaKey,
4649
- target = e.target; // On a MacOs trackpad, the pinch gesture sets the ctrlKey to true.
4649
+ var onWheel = React__default.useCallback(function (event) {
4650
+ var deltaX = event.deltaX,
4651
+ deltaY = event.deltaY,
4652
+ clientX = event.clientX,
4653
+ clientY = event.clientY,
4654
+ deltaMode = event.deltaMode,
4655
+ ctrlKey = event.ctrlKey,
4656
+ altKey = event.altKey,
4657
+ metaKey = event.metaKey,
4658
+ target = event.target; // On a MacOs trackpad, the pinch gesture sets the ctrlKey to true.
4650
4659
  // In that situation, we want to use the custom scaling, not the browser default zoom.
4651
4660
  // Hence in this situation we avoid to return immediately.
4652
4661
 
@@ -4659,14 +4668,14 @@ var Gesture = function Gesture(_ref6) {
4659
4668
 
4660
4669
 
4661
4670
  if (isMacOS() && !ctrlKey) {
4662
- queue(onPan, {
4671
+ promiseQueue.add(onPan, {
4663
4672
  deltaX: -2 * deltaX,
4664
4673
  deltaY: -2 * deltaY,
4665
4674
  button: 1,
4666
4675
  ctrlKey: ctrlKey,
4667
4676
  metaKey: metaKey,
4668
4677
  target: target,
4669
- event: e
4678
+ event: event
4670
4679
  });
4671
4680
  } else {
4672
4681
  // Quit if onZoom is not set
@@ -4688,25 +4697,25 @@ var Gesture = function Gesture(_ref6) {
4688
4697
  scale *= 2;
4689
4698
  }
4690
4699
 
4691
- queue(onZoom, {
4700
+ promiseQueue.add(onZoom, {
4692
4701
  scale: scale,
4693
4702
  clientX: clientX,
4694
4703
  clientY: clientY,
4695
- event: e
4704
+ event: event
4696
4705
  });
4697
4706
  }
4698
- }, [onPan, onZoom, queue]);
4699
- var onPointerDown = React__default.useCallback(function (_ref8) {
4700
- var target = _ref8.target,
4701
- button = _ref8.button,
4702
- clientX = _ref8.clientX,
4703
- clientY = _ref8.clientY,
4704
- pointerId = _ref8.pointerId,
4705
- altKey = _ref8.altKey,
4706
- ctrlKey = _ref8.ctrlKey,
4707
- metaKey = _ref8.metaKey,
4708
- isPrimary = _ref8.isPrimary;
4709
- // Add pointer to map
4707
+ }, [onPan, onZoom]);
4708
+ var onPointerDown = React__default.useCallback(function (event) {
4709
+ var target = event.target,
4710
+ button = event.button,
4711
+ clientX = event.clientX,
4712
+ clientY = event.clientY,
4713
+ pointerId = event.pointerId,
4714
+ altKey = event.altKey,
4715
+ ctrlKey = event.ctrlKey,
4716
+ metaKey = event.metaKey,
4717
+ isPrimary = event.isPrimary; // Add pointer to map
4718
+
4710
4719
  stateRef.current.pointers[pointerId] = {
4711
4720
  clientX: clientX,
4712
4721
  clientY: clientY
@@ -4765,27 +4774,28 @@ var Gesture = function Gesture(_ref6) {
4765
4774
  currentButton: button,
4766
4775
  target: target,
4767
4776
  timeStart: Date.now(),
4768
- longTapTimeout: setTimeout( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {
4769
- return regeneratorRuntime.wrap(function _callee3$(_context3) {
4777
+ longTapTimeout: setTimeout( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
4778
+ return regeneratorRuntime.wrap(function _callee2$(_context2) {
4770
4779
  while (1) {
4771
- switch (_context3.prev = _context3.next) {
4780
+ switch (_context2.prev = _context2.next) {
4772
4781
  case 0:
4773
4782
  stateRef.current.noTap = true;
4774
- queue(onLongTap, {
4783
+ promiseQueue.add(onLongTap, {
4775
4784
  clientX: clientX,
4776
4785
  clientY: clientY,
4777
4786
  altKey: altKey,
4778
4787
  ctrlKey: ctrlKey,
4779
4788
  metaKey: metaKey,
4780
- target: target
4789
+ target: target,
4790
+ event: event
4781
4791
  });
4782
4792
 
4783
4793
  case 2:
4784
4794
  case "end":
4785
- return _context3.stop();
4795
+ return _context2.stop();
4786
4796
  }
4787
4797
  }
4788
- }, _callee3);
4798
+ }, _callee2);
4789
4799
  })), 750)
4790
4800
  });
4791
4801
 
@@ -4795,16 +4805,17 @@ var Gesture = function Gesture(_ref6) {
4795
4805
  // eslint-disable-next-line no-console
4796
4806
  console.log("Fail to capture pointer", e);
4797
4807
  }
4798
- }, [onLongTap, queue]);
4799
- var onPointerMove = React__default.useCallback(function (e) {
4808
+ }, [onLongTap]);
4809
+ var onPointerMove = React__default.useCallback(function (event) {
4800
4810
  if (stateRef.current.pressed) {
4801
- var pointerId = e.pointerId,
4802
- eventClientX = e.clientX,
4803
- eventClientY = e.clientY,
4804
- altKey = e.altKey,
4805
- ctrlKey = e.ctrlKey,
4806
- metaKey = e.metaKey,
4807
- pointerType = e.pointerType;
4811
+ var pointerId = event.pointerId,
4812
+ eventClientX = event.clientX,
4813
+ eventClientY = event.clientY,
4814
+ altKey = event.altKey,
4815
+ ctrlKey = event.ctrlKey,
4816
+ metaKey = event.metaKey,
4817
+ buttons = event.buttons,
4818
+ pointerType = event.pointerType;
4808
4819
 
4809
4820
  if (stateRef.current.mainPointer !== pointerId) {
4810
4821
  // Event from other pointer
@@ -4837,13 +4848,20 @@ var Gesture = function Gesture(_ref6) {
4837
4848
  clientY = eventClientY;
4838
4849
  } // We drag if
4839
4850
  // On non touch device
4840
- // - Button is 0
4841
- // - Alt key is no pressed
4851
+ // - Only button is pressed (1)
4852
+ // - any special key is no pressed
4842
4853
  // or on touch devices
4843
4854
  // - We use only one finger
4844
4855
 
4845
4856
 
4846
- var shouldDrag = pointerType !== "touch" ? stateRef.current.currentButton === 0 && !altKey : !twoFingers;
4857
+ var altAction = altKey || ctrlKey || metaKey || buttons !== 1;
4858
+
4859
+ if (mainAction !== "drag") {
4860
+ altAction = !altAction;
4861
+ }
4862
+
4863
+ var shouldDrag = pointerType !== "touch" ? !altAction : !twoFingers;
4864
+ var shouldPan = pointerType !== "touch" ? altAction : twoFingers;
4847
4865
 
4848
4866
  if (shouldDrag) {
4849
4867
  // Send drag start on first move
@@ -4852,7 +4870,7 @@ var Gesture = function Gesture(_ref6) {
4852
4870
  stateRef.current.gestureStart = true; // Clear tap timeout
4853
4871
 
4854
4872
  clearTimeout(stateRef.current.longTapTimeout);
4855
- queue(onDragStart, {
4873
+ promiseQueue.add(onDragStart, {
4856
4874
  deltaX: 0,
4857
4875
  deltaY: 0,
4858
4876
  startX: stateRef.current.startX,
@@ -4866,17 +4884,16 @@ var Gesture = function Gesture(_ref6) {
4866
4884
  ctrlKey: ctrlKey,
4867
4885
  metaKey: metaKey,
4868
4886
  target: stateRef.current.target,
4869
- event: e
4887
+ event: event
4870
4888
  });
4871
- } // Create closure
4872
-
4889
+ }
4873
4890
 
4874
4891
  var deltaX = clientX - stateRef.current.prevX;
4875
4892
  var deltaY = clientY - stateRef.current.prevY;
4876
4893
  var distanceX = clientX - stateRef.current.startX;
4877
4894
  var distanceY = clientY - stateRef.current.startY; // Drag event
4878
4895
 
4879
- queue(onDrag, {
4896
+ promiseQueue.add(onDrag, {
4880
4897
  deltaX: deltaX,
4881
4898
  deltaY: deltaY,
4882
4899
  startX: stateRef.current.startX,
@@ -4890,9 +4907,11 @@ var Gesture = function Gesture(_ref6) {
4890
4907
  ctrlKey: ctrlKey,
4891
4908
  metaKey: metaKey,
4892
4909
  target: stateRef.current.target,
4893
- event: e
4910
+ event: event
4894
4911
  });
4895
- } else {
4912
+ }
4913
+
4914
+ if (shouldPan) {
4896
4915
  if (!stateRef.current.gestureStart) {
4897
4916
  wrapperRef.current.style.cursor = "move";
4898
4917
  stateRef.current.gestureStart = true; // Clear tap timeout on first move
@@ -4907,7 +4926,7 @@ var Gesture = function Gesture(_ref6) {
4907
4926
 
4908
4927
  var target = stateRef.current.target; // Pan event
4909
4928
 
4910
- queue(onPan, {
4929
+ promiseQueue.add(onPan, {
4911
4930
  deltaX: _deltaX,
4912
4931
  deltaY: _deltaY,
4913
4932
  button: stateRef.current.currentButton,
@@ -4915,18 +4934,18 @@ var Gesture = function Gesture(_ref6) {
4915
4934
  ctrlKey: ctrlKey,
4916
4935
  metaKey: metaKey,
4917
4936
  target: target,
4918
- event: e
4937
+ event: event
4919
4938
  });
4920
4939
 
4921
4940
  if (twoFingers && distance !== stateRef.current.prevDistance && onZoom) {
4922
4941
  var scale = stateRef.current.prevDistance - distance;
4923
4942
 
4924
4943
  if (Math.abs(scale) > 0) {
4925
- queue(onZoom, {
4944
+ promiseQueue.add(onZoom, {
4926
4945
  scale: scale,
4927
4946
  clientX: clientX,
4928
4947
  clientY: clientY,
4929
- event: e
4948
+ event: event
4930
4949
  });
4931
4950
  stateRef.current.prevDistance = distance;
4932
4951
  }
@@ -4936,15 +4955,15 @@ var Gesture = function Gesture(_ref6) {
4936
4955
  stateRef.current.prevX = clientX;
4937
4956
  stateRef.current.prevY = clientY;
4938
4957
  }
4939
- }, [onDrag, onDragStart, onPan, onZoom, queue]);
4940
- var onPointerUp = React__default.useCallback(function (e) {
4941
- var clientX = e.clientX,
4942
- clientY = e.clientY,
4943
- altKey = e.altKey,
4944
- ctrlKey = e.ctrlKey,
4945
- metaKey = e.metaKey,
4946
- target = e.target,
4947
- pointerId = e.pointerId;
4958
+ }, [mainAction, onDrag, onDragStart, onPan, onZoom]);
4959
+ var onPointerUp = React__default.useCallback(function (event) {
4960
+ var clientX = event.clientX,
4961
+ clientY = event.clientY,
4962
+ altKey = event.altKey,
4963
+ ctrlKey = event.ctrlKey,
4964
+ metaKey = event.metaKey,
4965
+ target = event.target,
4966
+ pointerId = event.pointerId;
4948
4967
 
4949
4968
  if (!stateRef.current.pointers[pointerId]) {
4950
4969
  // Pointer already gone previously with another event
@@ -4983,7 +5002,7 @@ var Gesture = function Gesture(_ref6) {
4983
5002
  if (stateRef.current.moving) {
4984
5003
  // If we were moving, send drag end event
4985
5004
  stateRef.current.moving = false;
4986
- queue(onDragEnd, {
5005
+ promiseQueue.add(onDragEnd, {
4987
5006
  deltaX: clientX - stateRef.current.prevX,
4988
5007
  deltaY: clientY - stateRef.current.prevY,
4989
5008
  startX: stateRef.current.startX,
@@ -4996,7 +5015,7 @@ var Gesture = function Gesture(_ref6) {
4996
5015
  altKey: altKey,
4997
5016
  ctrlKey: ctrlKey,
4998
5017
  metaKey: metaKey,
4999
- event: e
5018
+ event: event
5000
5019
  });
5001
5020
  wrapperRef.current.style.cursor = "auto";
5002
5021
  } else {
@@ -5006,20 +5025,35 @@ var Gesture = function Gesture(_ref6) {
5006
5025
  stateRef.current.noTap = false;
5007
5026
  } // Send tap event only if time less than 300ms
5008
5027
  else if (stateRef.current.timeStart - now < 300) {
5009
- queue(onTap, {
5028
+ promiseQueue.add(onTap, {
5010
5029
  clientX: clientX,
5011
5030
  clientY: clientY,
5012
5031
  altKey: altKey,
5013
5032
  ctrlKey: ctrlKey,
5014
5033
  metaKey: metaKey,
5015
- target: target
5034
+ target: target,
5035
+ event: event
5016
5036
  });
5017
5037
  }
5018
5038
  }
5019
- }, [onDragEnd, onTap, queue]);
5039
+ }, [onDragEnd, onTap]);
5020
5040
  var onDoubleTapHandler = React__default.useCallback(function (event) {
5021
- queue(onDoubleTap, event);
5022
- }, [onDoubleTap, queue]);
5041
+ var clientX = event.clientX,
5042
+ clientY = event.clientY,
5043
+ altKey = event.altKey,
5044
+ ctrlKey = event.ctrlKey,
5045
+ metaKey = event.metaKey,
5046
+ target = event.target;
5047
+ promiseQueue.add(onDoubleTap, {
5048
+ clientX: clientX,
5049
+ clientY: clientY,
5050
+ altKey: altKey,
5051
+ ctrlKey: ctrlKey,
5052
+ metaKey: metaKey,
5053
+ target: target,
5054
+ event: event
5055
+ });
5056
+ }, [onDoubleTap]);
5023
5057
  return /*#__PURE__*/React__default.createElement("div", {
5024
5058
  onWheel: onWheel,
5025
5059
  onPointerDown: onPointerDown,
@@ -5090,7 +5124,7 @@ var _excluded$2 = ["type", "rotation", "id", "locked", "layer"],
5090
5124
  _excluded3 = ["x", "y", "layer", "moving"];
5091
5125
 
5092
5126
  var _templateObject$2;
5093
- var ItemWrapper = newStyled.div(_templateObject$2 || (_templateObject$2 = _taggedTemplateLiteral(["\n display: inline-block;\n transition: transform 150ms;\n user-select: none;\n padding: 2px;\n box-sizing: border-box;\n transform: rotate(", "deg);\n\n & .corner {\n position: absolute;\n width: 0px;\n height: 0px;\n }\n\n & .top-left {\n top: 0;\n left: 0;\n }\n & .top-right {\n top: 0;\n right: 0;\n }\n & .bottom-left {\n bottom: 0;\n left: 0;\n }\n & .bottom-right {\n bottom: 0;\n right: 0;\n }\n\n &.selected {\n border: 2px dashed #db5034;\n padding: 0px;\n cursor: pointer;\n }\n\n &.locked::after {\n content: \"\";\n position: absolute;\n width: 24px;\n height: 30px;\n top: 4px;\n right: 4px;\n opacity: 0.1;\n background-image: url(\"", "\");\n background-size: cover;\n user-select: none;\n }\n\n &.locked:hover::after {\n opacity: 0.3;\n }\n\n & .resize {\n position: absolute;\n\n width: 10px;\n height: 10px;\n border: 2px solid #db5034;\n background-color: #db5034;\n cursor: move;\n\n &.resize-width {\n cursor: ew-resize;\n right: -6px;\n top: calc(50% - 5px);\n }\n &.resize-height {\n cursor: ns-resize;\n bottom: -6px;\n left: calc(50% - 5px);\n }\n &.resize-ratio {\n cursor: nwse-resize;\n bottom: -6px;\n right: -6px;\n }\n }\n"])), function (_ref) {
5127
+ var ItemWrapper = newStyled.div(_templateObject$2 || (_templateObject$2 = _taggedTemplateLiteral(["\n display: inline-block;\n transition: transform 150ms;\n user-select: none;\n padding: 2px;\n box-sizing: border-box;\n transform: rotate(", "deg);\n\n & .corner {\n position: absolute;\n width: 0px;\n height: 0px;\n }\n\n & .top-left {\n top: 0;\n left: 0;\n }\n & .top-right {\n top: 0;\n right: 0;\n }\n & .bottom-left {\n bottom: 0;\n left: 0;\n }\n & .bottom-right {\n bottom: 0;\n right: 0;\n }\n\n & .center {\n position: absolute;\n width: 0px;\n height: 0px;\n top: 50%;\n left: 50%;\n }\n\n &.selected {\n border: 2px dashed #db5034;\n padding: 0px;\n cursor: pointer;\n }\n\n &.locked::after {\n content: \"\";\n position: absolute;\n width: 24px;\n height: 30px;\n top: 4px;\n right: 4px;\n opacity: 0.1;\n background-image: url(\"", "\");\n background-size: cover;\n user-select: none;\n }\n\n &.locked:hover::after {\n opacity: 0.3;\n }\n\n & .resize {\n position: absolute;\n\n width: 10px;\n height: 10px;\n border: 2px solid #db5034;\n background-color: #db5034;\n cursor: move;\n\n &.resize-width {\n cursor: ew-resize;\n right: -6px;\n top: calc(50% - 5px);\n }\n &.resize-height {\n cursor: ns-resize;\n bottom: -6px;\n left: calc(50% - 5px);\n }\n &.resize-ratio {\n cursor: nwse-resize;\n bottom: -6px;\n right: -6px;\n }\n }\n"])), function (_ref) {
5094
5128
  var rotation = _ref.rotation;
5095
5129
  return rotation;
5096
5130
  }, img);
@@ -5344,6 +5378,8 @@ var Item = function Item(_ref5) {
5344
5378
  className: "corner bottom-right"
5345
5379
  }), /*#__PURE__*/React__default.createElement("div", {
5346
5380
  className: "corner bottom-left"
5381
+ }), /*#__PURE__*/React__default.createElement("div", {
5382
+ className: "center"
5347
5383
  }), isSelected && showResizeHandle && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, resizeDirections.b && /*#__PURE__*/React__default.createElement(ResizeHandler, {
5348
5384
  className: "resize resize-ratio",
5349
5385
  onResize: onResizeRatio
@@ -5909,24 +5945,20 @@ var Selector = function Selector(_ref) {
5909
5945
  }));
5910
5946
  }, [setSelected]);
5911
5947
  useThrottledEffect(updateSelected, [selector, updateSelected], 200);
5912
-
5913
- var onDragStart = /*#__PURE__*/function () {
5948
+ var onDragStart = React__default.useCallback( /*#__PURE__*/function () {
5914
5949
  var _ref4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(event) {
5915
- var button, altKey, ctrlKey, metaKey, foundElement, metaKeyPressed, goodButton;
5950
+ var foundElement;
5916
5951
  return regeneratorRuntime.wrap(function _callee2$(_context2) {
5917
5952
  while (1) {
5918
5953
  switch (_context2.prev = _context2.next) {
5919
5954
  case 0:
5920
- button = event.button, altKey = event.altKey, ctrlKey = event.ctrlKey, metaKey = event.metaKey;
5921
- _context2.next = 3;
5955
+ _context2.next = 2;
5922
5956
  return findElementUnderPointer(event);
5923
5957
 
5924
- case 3:
5958
+ case 2:
5925
5959
  foundElement = _context2.sent;
5926
- metaKeyPressed = altKey || ctrlKey || metaKey;
5927
- goodButton = moveFirst ? button === 1 || button === 0 && metaKeyPressed : button === 0 && !metaKeyPressed;
5928
5960
 
5929
- if (goodButton && (!foundElement || moveFirst)) {
5961
+ if (!foundElement) {
5930
5962
  stateRef.current.moving = true;
5931
5963
  setBoardState(function (prev) {
5932
5964
  return _objectSpread2(_objectSpread2({}, prev), {}, {
@@ -5936,7 +5968,7 @@ var Selector = function Selector(_ref) {
5936
5968
  wrapperRef.current.style.cursor = "crosshair";
5937
5969
  }
5938
5970
 
5939
- case 7:
5971
+ case 4:
5940
5972
  case "end":
5941
5973
  return _context2.stop();
5942
5974
  }
@@ -5944,11 +5976,10 @@ var Selector = function Selector(_ref) {
5944
5976
  }, _callee2);
5945
5977
  }));
5946
5978
 
5947
- return function onDragStart(_x) {
5979
+ return function (_x) {
5948
5980
  return _ref4.apply(this, arguments);
5949
5981
  };
5950
- }();
5951
-
5982
+ }(), [findElementUnderPointer, setBoardState]);
5952
5983
  var onDrag = useRecoilCallback(function (_ref5) {
5953
5984
  var snapshot = _ref5.snapshot;
5954
5985
  return /*#__PURE__*/function () {
@@ -6011,8 +6042,7 @@ var Selector = function Selector(_ref) {
6011
6042
  };
6012
6043
  }();
6013
6044
  }, []);
6014
-
6015
- var onDragEnd = function onDragEnd() {
6045
+ var onDragEnd = React__default.useCallback(function () {
6016
6046
  if (stateRef.current.moving) {
6017
6047
  setBoardState(function (prev) {
6018
6048
  return _objectSpread2(_objectSpread2({}, prev), {}, {
@@ -6025,8 +6055,7 @@ var Selector = function Selector(_ref) {
6025
6055
  });
6026
6056
  wrapperRef.current.style.cursor = "auto";
6027
6057
  }
6028
- };
6029
-
6058
+ }, [setBoardState]);
6030
6059
  var onLongTap = React__default.useCallback(function (_ref8) {
6031
6060
  var target = _ref8.target;
6032
6061
  var foundElement = insideClass(target, "item");
@@ -6107,7 +6136,8 @@ var Selector = function Selector(_ref) {
6107
6136
  onDrag: onDrag,
6108
6137
  onDragEnd: onDragEnd,
6109
6138
  onTap: onTap,
6110
- onLongTap: onLongTap
6139
+ onLongTap: onLongTap,
6140
+ mainAction: moveFirst ? "pan" : "drag"
6111
6141
  }, /*#__PURE__*/React__default.createElement("div", {
6112
6142
  ref: wrapperRef
6113
6143
  }, selector.moving && /*#__PURE__*/React__default.createElement("div", {
@@ -6200,23 +6230,24 @@ var ActionPane = function ActionPane(_ref) {
6200
6230
  var snapshot = _ref4.snapshot;
6201
6231
  return /*#__PURE__*/function () {
6202
6232
  var _ref6 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(_ref5) {
6203
- var deltaX, deltaY, _yield$snapshot$getPr, scale, moveX, moveY;
6233
+ var deltaX, deltaY, originalEvent, _yield$snapshot$getPr, scale, moveX, moveY;
6204
6234
 
6205
6235
  return regeneratorRuntime.wrap(function _callee2$(_context2) {
6206
6236
  while (1) {
6207
6237
  switch (_context2.prev = _context2.next) {
6208
6238
  case 0:
6209
- deltaX = _ref5.deltaX, deltaY = _ref5.deltaY;
6239
+ deltaX = _ref5.deltaX, deltaY = _ref5.deltaY, originalEvent = _ref5.event;
6210
6240
 
6211
6241
  if (!actionRef.current.moving) {
6212
- _context2.next = 10;
6242
+ _context2.next = 11;
6213
6243
  break;
6214
6244
  }
6215
6245
 
6216
- _context2.next = 4;
6246
+ originalEvent.stopPropagation();
6247
+ _context2.next = 5;
6217
6248
  return snapshot.getPromise(BoardTransformAtom);
6218
6249
 
6219
- case 4:
6250
+ case 5:
6220
6251
  _yield$snapshot$getPr = _context2.sent;
6221
6252
  scale = _yield$snapshot$getPr.scale;
6222
6253
  moveX = actionRef.current.remainX + deltaX / scale;
@@ -6231,7 +6262,7 @@ var ActionPane = function ActionPane(_ref) {
6231
6262
  }) : prev;
6232
6263
  });
6233
6264
 
6234
- case 10:
6265
+ case 11:
6235
6266
  case "end":
6236
6267
  return _context2.stop();
6237
6268
  }
@@ -6956,8 +6987,6 @@ var usePositionNavigator = function usePositionNavigator() {
6956
6987
  return null;
6957
6988
  };
6958
6989
 
6959
- var SCALE_TOLERANCE = 0.8;
6960
-
6961
6990
  var PanZoom = function PanZoom(_ref) {
6962
6991
  var children = _ref.children,
6963
6992
  _ref$moveFirst = _ref.moveFirst,
@@ -6967,7 +6996,8 @@ var PanZoom = function PanZoom(_ref) {
6967
6996
 
6968
6997
  var _useDim = useDim(),
6969
6998
  setDim = _useDim.setDim,
6970
- zoomTo = _useDim.zoomTo;
6999
+ zoomToCenter = _useDim.zoomToCenter,
7000
+ zoomToExtent = _useDim.zoomToExtent;
6971
7001
 
6972
7002
  var _useRecoilValue = useRecoilValue(ConfigurationAtom),
6973
7003
  itemExtentGlobal = _useRecoilValue.itemExtent;
@@ -6983,10 +7013,14 @@ var PanZoom = function PanZoom(_ref) {
6983
7013
  var getMouseInfo = useMousePosition(wrappedRef); // Hooks to save/restore position
6984
7014
 
6985
7015
  usePositionNavigator();
7016
+ /**
7017
+ * Center board on startup
7018
+ */
7019
+
6986
7020
  var centerBoard = useRecoilCallback(function (_ref2) {
6987
7021
  var snapshot = _ref2.snapshot;
6988
7022
  return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
6989
- var _yield$snapshot$getPr, _yield$snapshot$getPr2, left, top, width, height, boardWrapperRect, scaleX, scaleY, newScale, scaleWithTolerance, centerX, centerY;
7023
+ var _yield$snapshot$getPr, itemExtent;
6990
7024
 
6991
7025
  return regeneratorRuntime.wrap(function _callee$(_context) {
6992
7026
  while (1) {
@@ -6997,34 +7031,17 @@ var PanZoom = function PanZoom(_ref) {
6997
7031
 
6998
7032
  case 2:
6999
7033
  _yield$snapshot$getPr = _context.sent;
7000
- _yield$snapshot$getPr2 = _yield$snapshot$getPr.itemExtent;
7001
- left = _yield$snapshot$getPr2.left;
7002
- top = _yield$snapshot$getPr2.top;
7003
- width = _yield$snapshot$getPr2.width;
7004
- height = _yield$snapshot$getPr2.height;
7005
- boardWrapperRect = _yield$snapshot$getPr.boardWrapperRect;
7006
- scaleX = boardWrapperRect.width / width;
7007
- scaleY = boardWrapperRect.height / height;
7008
- newScale = Math.min(scaleX, scaleY);
7009
- scaleWithTolerance = newScale * SCALE_TOLERANCE;
7010
- centerX = boardWrapperRect.width / 2 - (left + width / 2) * scaleWithTolerance;
7011
- centerY = boardWrapperRect.height / 2 - (top + height / 2) * scaleWithTolerance;
7012
- setDim(function (prev) {
7013
- return _objectSpread2(_objectSpread2({}, prev), {}, {
7014
- translateX: centerX,
7015
- translateY: centerY,
7016
- scale: scaleWithTolerance
7017
- });
7018
- });
7034
+ itemExtent = _yield$snapshot$getPr.itemExtent;
7035
+ zoomToExtent(itemExtent);
7019
7036
 
7020
- case 16:
7037
+ case 5:
7021
7038
  case "end":
7022
7039
  return _context.stop();
7023
7040
  }
7024
7041
  }
7025
7042
  }, _callee);
7026
7043
  }));
7027
- }, [setDim]);
7044
+ }, [zoomToExtent]);
7028
7045
  React__default.useEffect(function () {
7029
7046
  if (!centered && itemExtentGlobal.left) {
7030
7047
  // Center board on first valid extent
@@ -7036,7 +7053,7 @@ var PanZoom = function PanZoom(_ref) {
7036
7053
  var clientX = _ref4.clientX,
7037
7054
  clientY = _ref4.clientY,
7038
7055
  scale = _ref4.scale;
7039
- zoomTo(1 - scale / 500, {
7056
+ zoomToCenter(1 - scale / 500, {
7040
7057
  x: clientX,
7041
7058
  y: clientY
7042
7059
  }); // Update the board zooming state
@@ -7054,7 +7071,7 @@ var PanZoom = function PanZoom(_ref) {
7054
7071
  zooming: true
7055
7072
  }) : prev;
7056
7073
  });
7057
- }, [setBoardState, zoomTo]);
7074
+ }, [setBoardState, zoomToCenter]);
7058
7075
  var onPan = React__default.useCallback( /*#__PURE__*/function () {
7059
7076
  var _ref6 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(_ref5) {
7060
7077
  var deltaX, deltaY;
@@ -7096,14 +7113,6 @@ var PanZoom = function PanZoom(_ref) {
7096
7113
  return _ref6.apply(this, arguments);
7097
7114
  };
7098
7115
  }(), [setBoardState, setDim]);
7099
- var onDrag = React__default.useCallback(function (state) {
7100
- var target = state.target;
7101
- var outsideItem = !insideClass(target, "item") || insideClass(target, "locked");
7102
-
7103
- if (moveFirst && outsideItem) {
7104
- onPan(state);
7105
- }
7106
- }, [moveFirst, onPan]);
7107
7116
  var onKeyDown = useRecoilCallback(function (_ref7) {
7108
7117
  var snapshot = _ref7.snapshot;
7109
7118
  return /*#__PURE__*/function () {
@@ -7188,14 +7197,14 @@ var PanZoom = function PanZoom(_ref) {
7188
7197
  translateX: prev.translateX + moveX
7189
7198
  });
7190
7199
  });
7191
- zoomTo(zoom);
7200
+ zoomToCenter(zoom);
7192
7201
  e.preventDefault();
7193
7202
 
7194
7203
  case 31:
7195
7204
  // Temporary zoom
7196
7205
  if (e.key === " " && !e.repeat) {
7197
7206
  if (getMouseInfo().hover) {
7198
- zoomTo(3, getMouseInfo());
7207
+ zoomToCenter(3, getMouseInfo());
7199
7208
  }
7200
7209
  }
7201
7210
 
@@ -7211,15 +7220,15 @@ var PanZoom = function PanZoom(_ref) {
7211
7220
  return _ref8.apply(this, arguments);
7212
7221
  };
7213
7222
  }();
7214
- }, [setDim, zoomTo, getMouseInfo]);
7223
+ }, [setDim, zoomToCenter, getMouseInfo]);
7215
7224
  var onKeyUp = React__default.useCallback(function (e) {
7216
7225
  // Ignore text in Input or Textarea
7217
7226
  if (["INPUT", "TEXTAREA"].includes(e.target.tagName)) return; // Zoom out on release
7218
7227
 
7219
7228
  if (e.key === " " && getMouseInfo().hover) {
7220
- zoomTo(1 / 3, getMouseInfo());
7229
+ zoomToCenter(1 / 3, getMouseInfo());
7221
7230
  }
7222
- }, [getMouseInfo, zoomTo]);
7231
+ }, [getMouseInfo, zoomToCenter]);
7223
7232
  React__default.useEffect(function () {
7224
7233
  document.addEventListener("keydown", onKeyDown);
7225
7234
  document.addEventListener("keyup", onKeyUp);
@@ -7231,7 +7240,7 @@ var PanZoom = function PanZoom(_ref) {
7231
7240
  return /*#__PURE__*/React__default.createElement(Gesture, {
7232
7241
  onPan: onPan,
7233
7242
  onZoom: onZoom,
7234
- onDrag: onDrag
7243
+ mainAction: moveFirst ? "pan" : "drag"
7235
7244
  }, /*#__PURE__*/React__default.createElement("div", {
7236
7245
  style: {
7237
7246
  display: "inline-block",
@@ -7399,7 +7408,9 @@ var Board = function Board(_ref) {
7399
7408
  moveFirst: moveFirst
7400
7409
  }, /*#__PURE__*/React__default.createElement(Selector, {
7401
7410
  moveFirst: moveFirst
7402
- }, /*#__PURE__*/React__default.createElement(ActionPane, null, /*#__PURE__*/React__default.createElement(CursorPane, null, /*#__PURE__*/React__default.createElement("div", {
7411
+ }, /*#__PURE__*/React__default.createElement(ActionPane, {
7412
+ moveFirst: moveFirst
7413
+ }, /*#__PURE__*/React__default.createElement(CursorPane, null, /*#__PURE__*/React__default.createElement("div", {
7403
7414
  onContextMenu: function onContextMenu(e) {
7404
7415
  e.preventDefault();
7405
7416
  },
@@ -7410,6 +7421,7 @@ var Board = function Board(_ref) {
7410
7421
 
7411
7422
  var TOLERANCE = 100;
7412
7423
  var MIN_SIZE = 1000;
7424
+ var SCALE_TOLERANCE = 0.8;
7413
7425
 
7414
7426
  var translateBoundaries = function translateBoundaries(_ref) {
7415
7427
  var x = _ref.x,
@@ -7527,7 +7539,7 @@ var useDim = function useDim() {
7527
7539
  };
7528
7540
  }();
7529
7541
  }, [setDim]);
7530
- var zoomTo = useRecoilCallback(function (_ref5) {
7542
+ var zoomToCenter = useRecoilCallback(function (_ref5) {
7531
7543
  var snapshot = _ref5.snapshot;
7532
7544
  return /*#__PURE__*/function () {
7533
7545
  var _ref6 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(factor, zoomCenter) {
@@ -7606,24 +7618,68 @@ var useDim = function useDim() {
7606
7618
  };
7607
7619
  }();
7608
7620
  }, [setDim]);
7609
- var updateScaleBoundaries = useRecoilCallback(function (_ref7) {
7621
+ var zoomToExtent = useRecoilCallback(function (_ref7) {
7610
7622
  var snapshot = _ref7.snapshot;
7611
- return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {
7612
- var _yield$snapshot$getPr3, _yield$snapshot$getPr4, width, height, boardWrapperRect, scaleX, scaleY, newScale;
7623
+ return /*#__PURE__*/function () {
7624
+ var _ref9 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(_ref8) {
7625
+ var left, top, width, height, _yield$snapshot$getPr3, boardWrapperRect, scaleX, scaleY, newScale, scaleWithTolerance, centerX, centerY;
7613
7626
 
7614
- return regeneratorRuntime.wrap(function _callee3$(_context3) {
7627
+ return regeneratorRuntime.wrap(function _callee3$(_context3) {
7628
+ while (1) {
7629
+ switch (_context3.prev = _context3.next) {
7630
+ case 0:
7631
+ left = _ref8.left, top = _ref8.top, width = _ref8.width, height = _ref8.height;
7632
+ _context3.next = 3;
7633
+ return snapshot.getPromise(ConfigurationAtom);
7634
+
7635
+ case 3:
7636
+ _yield$snapshot$getPr3 = _context3.sent;
7637
+ boardWrapperRect = _yield$snapshot$getPr3.boardWrapperRect;
7638
+ scaleX = boardWrapperRect.width / width;
7639
+ scaleY = boardWrapperRect.height / height;
7640
+ newScale = Math.min(scaleX, scaleY);
7641
+ scaleWithTolerance = newScale * SCALE_TOLERANCE;
7642
+ centerX = boardWrapperRect.width / 2 - (left + width / 2) * scaleWithTolerance;
7643
+ centerY = boardWrapperRect.height / 2 - (top + height / 2) * scaleWithTolerance;
7644
+ setDim(function (prev) {
7645
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
7646
+ translateX: centerX,
7647
+ translateY: centerY,
7648
+ scale: scaleWithTolerance
7649
+ });
7650
+ });
7651
+
7652
+ case 12:
7653
+ case "end":
7654
+ return _context3.stop();
7655
+ }
7656
+ }
7657
+ }, _callee3);
7658
+ }));
7659
+
7660
+ return function (_x4) {
7661
+ return _ref9.apply(this, arguments);
7662
+ };
7663
+ }();
7664
+ }, [setDim]);
7665
+ var updateScaleBoundaries = useRecoilCallback(function (_ref10) {
7666
+ var snapshot = _ref10.snapshot;
7667
+ return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {
7668
+ var _yield$snapshot$getPr4, _yield$snapshot$getPr5, width, height, boardWrapperRect, scaleX, scaleY, newScale;
7669
+
7670
+ return regeneratorRuntime.wrap(function _callee4$(_context4) {
7615
7671
  while (1) {
7616
- switch (_context3.prev = _context3.next) {
7672
+ switch (_context4.prev = _context4.next) {
7617
7673
  case 0:
7618
- _context3.next = 2;
7674
+ _context4.next = 2;
7619
7675
  return snapshot.getPromise(ConfigurationAtom);
7620
7676
 
7621
7677
  case 2:
7622
- _yield$snapshot$getPr3 = _context3.sent;
7623
- _yield$snapshot$getPr4 = _yield$snapshot$getPr3.itemExtent;
7624
- width = _yield$snapshot$getPr4.width;
7625
- height = _yield$snapshot$getPr4.height;
7626
- boardWrapperRect = _yield$snapshot$getPr3.boardWrapperRect;
7678
+ _yield$snapshot$getPr4 = _context4.sent;
7679
+ _yield$snapshot$getPr5 = _yield$snapshot$getPr4.itemExtent;
7680
+ width = _yield$snapshot$getPr5.width;
7681
+ height = _yield$snapshot$getPr5.height;
7682
+ boardWrapperRect = _yield$snapshot$getPr4.boardWrapperRect;
7627
7683
  scaleX = boardWrapperRect.width / width;
7628
7684
  scaleY = boardWrapperRect.height / height;
7629
7685
  newScale = Math.min(scaleX, scaleY);
@@ -7631,86 +7687,86 @@ var useDim = function useDim() {
7631
7687
 
7632
7688
  case 11:
7633
7689
  case "end":
7634
- return _context3.stop();
7690
+ return _context4.stop();
7635
7691
  }
7636
7692
  }
7637
- }, _callee3);
7693
+ }, _callee4);
7638
7694
  }));
7639
7695
  }, []);
7640
- var getCenterCoordinates = useRecoilCallback(function (_ref9) {
7641
- var snapshot = _ref9.snapshot;
7642
- return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {
7643
- var _yield$snapshot$getPr5, boardWrapperRect, boardSize, _yield$snapshot$getPr6, translateX, translateY, scale;
7696
+ var getCenterCoordinates = useRecoilCallback(function (_ref12) {
7697
+ var snapshot = _ref12.snapshot;
7698
+ return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {
7699
+ var _yield$snapshot$getPr6, boardWrapperRect, boardSize, _yield$snapshot$getPr7, translateX, translateY, scale;
7644
7700
 
7645
- return regeneratorRuntime.wrap(function _callee4$(_context4) {
7701
+ return regeneratorRuntime.wrap(function _callee5$(_context5) {
7646
7702
  while (1) {
7647
- switch (_context4.prev = _context4.next) {
7703
+ switch (_context5.prev = _context5.next) {
7648
7704
  case 0:
7649
- _context4.next = 2;
7705
+ _context5.next = 2;
7650
7706
  return snapshot.getPromise(ConfigurationAtom);
7651
7707
 
7652
7708
  case 2:
7653
- _yield$snapshot$getPr5 = _context4.sent;
7654
- boardWrapperRect = _yield$snapshot$getPr5.boardWrapperRect;
7655
- boardSize = _yield$snapshot$getPr5.boardSize;
7656
- _context4.next = 7;
7709
+ _yield$snapshot$getPr6 = _context5.sent;
7710
+ boardWrapperRect = _yield$snapshot$getPr6.boardWrapperRect;
7711
+ boardSize = _yield$snapshot$getPr6.boardSize;
7712
+ _context5.next = 7;
7657
7713
  return snapshot.getPromise(BoardTransformAtom);
7658
7714
 
7659
7715
  case 7:
7660
- _yield$snapshot$getPr6 = _context4.sent;
7661
- translateX = _yield$snapshot$getPr6.translateX;
7662
- translateY = _yield$snapshot$getPr6.translateY;
7663
- scale = _yield$snapshot$getPr6.scale;
7664
- return _context4.abrupt("return", {
7716
+ _yield$snapshot$getPr7 = _context5.sent;
7717
+ translateX = _yield$snapshot$getPr7.translateX;
7718
+ translateY = _yield$snapshot$getPr7.translateY;
7719
+ scale = _yield$snapshot$getPr7.scale;
7720
+ return _context5.abrupt("return", {
7665
7721
  x: (boardWrapperRect.width / 2 - translateX) / scale - boardSize / 2,
7666
7722
  y: (boardWrapperRect.height / 2 - translateY) / scale - boardSize / 2
7667
7723
  });
7668
7724
 
7669
7725
  case 12:
7670
7726
  case "end":
7671
- return _context4.stop();
7727
+ return _context5.stop();
7672
7728
  }
7673
7729
  }
7674
- }, _callee4);
7730
+ }, _callee5);
7675
7731
  }));
7676
7732
  }, []);
7677
- var updateItemExtent = useRecoilCallback(function (_ref11) {
7678
- var snapshot = _ref11.snapshot,
7679
- set = _ref11.set;
7680
- return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {
7681
- var itemIds, _yield$snapshot$getPr7, boardWrapperRect, boardWrapper, boardSize, _yield$snapshot$getPr8, scale, translateX, translateY, _ref13, left, top, width, height, relativeExtent, delta, _delta;
7733
+ var updateItemExtent = useRecoilCallback(function (_ref14) {
7734
+ var snapshot = _ref14.snapshot,
7735
+ set = _ref14.set;
7736
+ return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6() {
7737
+ var itemIds, _yield$snapshot$getPr8, boardWrapperRect, boardWrapper, boardSize, _yield$snapshot$getPr9, scale, translateX, translateY, _ref16, left, top, width, height, relativeExtent, delta, _delta;
7682
7738
 
7683
- return regeneratorRuntime.wrap(function _callee5$(_context5) {
7739
+ return regeneratorRuntime.wrap(function _callee6$(_context6) {
7684
7740
  while (1) {
7685
- switch (_context5.prev = _context5.next) {
7741
+ switch (_context6.prev = _context6.next) {
7686
7742
  case 0:
7687
- _context5.next = 2;
7743
+ _context6.next = 2;
7688
7744
  return snapshot.getPromise(ItemListAtom);
7689
7745
 
7690
7746
  case 2:
7691
- itemIds = _context5.sent;
7692
- _context5.next = 5;
7747
+ itemIds = _context6.sent;
7748
+ _context6.next = 5;
7693
7749
  return snapshot.getPromise(ConfigurationAtom);
7694
7750
 
7695
7751
  case 5:
7696
- _yield$snapshot$getPr7 = _context5.sent;
7697
- boardWrapperRect = _yield$snapshot$getPr7.boardWrapperRect;
7698
- boardWrapper = _yield$snapshot$getPr7.boardWrapper;
7699
- boardSize = _yield$snapshot$getPr7.boardSize;
7700
- _context5.next = 11;
7752
+ _yield$snapshot$getPr8 = _context6.sent;
7753
+ boardWrapperRect = _yield$snapshot$getPr8.boardWrapperRect;
7754
+ boardWrapper = _yield$snapshot$getPr8.boardWrapper;
7755
+ boardSize = _yield$snapshot$getPr8.boardSize;
7756
+ _context6.next = 11;
7701
7757
  return snapshot.getPromise(BoardTransformAtom);
7702
7758
 
7703
7759
  case 11:
7704
- _yield$snapshot$getPr8 = _context5.sent;
7705
- scale = _yield$snapshot$getPr8.scale;
7706
- translateX = _yield$snapshot$getPr8.translateX;
7707
- translateY = _yield$snapshot$getPr8.translateY;
7708
- _ref13 = getItemBoundingBox(itemIds, boardWrapper) || {
7760
+ _yield$snapshot$getPr9 = _context6.sent;
7761
+ scale = _yield$snapshot$getPr9.scale;
7762
+ translateX = _yield$snapshot$getPr9.translateX;
7763
+ translateY = _yield$snapshot$getPr9.translateY;
7764
+ _ref16 = getItemBoundingBox(itemIds, boardWrapper) || {
7709
7765
  left: boardSize / 2 * scale + boardWrapperRect.left + translateX,
7710
7766
  top: boardSize / 2 * scale + boardWrapperRect.top + translateY,
7711
7767
  width: 0,
7712
7768
  height: 0
7713
- }, left = _ref13.left, top = _ref13.top, width = _ref13.width, height = _ref13.height;
7769
+ }, left = _ref16.left, top = _ref16.top, width = _ref16.width, height = _ref16.height;
7714
7770
  relativeExtent = {
7715
7771
  left: (left - boardWrapperRect.left - translateX) / scale,
7716
7772
  top: (top - boardWrapperRect.top - translateY) / scale,
@@ -7742,10 +7798,10 @@ var useDim = function useDim() {
7742
7798
 
7743
7799
  case 22:
7744
7800
  case "end":
7745
- return _context5.stop();
7801
+ return _context6.stop();
7746
7802
  }
7747
7803
  }
7748
- }, _callee5);
7804
+ }, _callee6);
7749
7805
  }));
7750
7806
  }, []);
7751
7807
  var debouncedUpdateItemExtent = useDebouncedCallback(updateItemExtent, [], 300);
@@ -7757,7 +7813,9 @@ var useDim = function useDim() {
7757
7813
  return {
7758
7814
  setDim: setDimSafe,
7759
7815
  getDim: getDim,
7760
- zoomTo: zoomTo,
7816
+ zoomTo: zoomToCenter,
7817
+ zoomToCenter: zoomToCenter,
7818
+ zoomToExtent: zoomToExtent,
7761
7819
  getCenter: getCenterCoordinates,
7762
7820
  updateItemExtent: debouncedUpdateItemExtent
7763
7821
  };