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/cjs/index.js CHANGED
@@ -4578,6 +4578,18 @@ var computeDistance = function computeDistance(_ref, _ref2) {
4578
4578
 
4579
4579
  var empty = function empty() {};
4580
4580
 
4581
+ var stopPropagation = function stopPropagation(fn) {
4582
+ return function (arg) {
4583
+ var event = arg.event;
4584
+
4585
+ if (!event.isPropagationStopped()) {
4586
+ return fn(arg);
4587
+ }
4588
+
4589
+ return null;
4590
+ };
4591
+ };
4592
+
4581
4593
  var protect = function protect(fn) {
4582
4594
  return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
4583
4595
  var _args = arguments;
@@ -4608,6 +4620,35 @@ var protect = function protect(fn) {
4608
4620
  }));
4609
4621
  };
4610
4622
 
4623
+ var PromiseQueue = /*#__PURE__*/function () {
4624
+ function PromiseQueue() {
4625
+ _classCallCheck(this, PromiseQueue);
4626
+
4627
+ _defineProperty(this, "lastPromise", Promise.resolve(true));
4628
+ }
4629
+
4630
+ _createClass(PromiseQueue, [{
4631
+ key: "add",
4632
+ value: function add(operation) {
4633
+ var _this = this;
4634
+
4635
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
4636
+ args[_key - 1] = arguments[_key];
4637
+ }
4638
+
4639
+ return new Promise(function (resolve, reject) {
4640
+ _this.lastPromise = _this.lastPromise.then(function () {
4641
+ return stopPropagation(protect(operation)).apply(void 0, args);
4642
+ }).then(resolve)["catch"](reject);
4643
+ });
4644
+ }
4645
+ }]);
4646
+
4647
+ return PromiseQueue;
4648
+ }();
4649
+
4650
+ var promiseQueue = new PromiseQueue();
4651
+
4611
4652
  var Gesture = function Gesture(_ref6) {
4612
4653
  var children = _ref6.children,
4613
4654
  _ref6$onDrag = _ref6.onDrag,
@@ -4624,57 +4665,25 @@ var Gesture = function Gesture(_ref6) {
4624
4665
  onLongTap = _ref6$onLongTap === void 0 ? empty : _ref6$onLongTap,
4625
4666
  _ref6$onDoubleTap = _ref6.onDoubleTap,
4626
4667
  onDoubleTap = _ref6$onDoubleTap === void 0 ? empty : _ref6$onDoubleTap,
4627
- onZoom = _ref6.onZoom;
4668
+ onZoom = _ref6.onZoom,
4669
+ _ref6$mainAction = _ref6.mainAction,
4670
+ mainAction = _ref6$mainAction === void 0 ? "drag" : _ref6$mainAction;
4628
4671
  var wrapperRef = React__default['default'].useRef(null);
4629
4672
  var stateRef = React__default['default'].useRef({
4630
4673
  moving: false,
4631
4674
  pointers: {},
4632
4675
  mainPointer: undefined
4633
4676
  });
4634
- var queueRef = React__default['default'].useRef([]); // Queue event to avoid async mess
4635
-
4636
- var queue = React__default['default'].useCallback(function (callback, args) {
4637
- queueRef.current.push( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
4638
- return regeneratorRuntime.wrap(function _callee2$(_context2) {
4639
- while (1) {
4640
- switch (_context2.prev = _context2.next) {
4641
- case 0:
4642
- _context2.next = 2;
4643
- return protect(callback)(args);
4644
-
4645
- case 2:
4646
- queueRef.current.shift();
4647
-
4648
- if (!(queueRef.current.length !== 0)) {
4649
- _context2.next = 6;
4650
- break;
4651
- }
4652
-
4653
- _context2.next = 6;
4654
- return protect(queueRef.current[0])();
4655
-
4656
- case 6:
4657
- case "end":
4658
- return _context2.stop();
4659
- }
4660
- }
4661
- }, _callee2);
4662
- })));
4663
-
4664
- if (queueRef.current.length === 1) {
4665
- protect(queueRef.current[0])();
4666
- }
4667
- }, []);
4668
- var onWheel = React__default['default'].useCallback(function (e) {
4669
- var deltaX = e.deltaX,
4670
- deltaY = e.deltaY,
4671
- clientX = e.clientX,
4672
- clientY = e.clientY,
4673
- deltaMode = e.deltaMode,
4674
- ctrlKey = e.ctrlKey,
4675
- altKey = e.altKey,
4676
- metaKey = e.metaKey,
4677
- target = e.target; // On a MacOs trackpad, the pinch gesture sets the ctrlKey to true.
4677
+ var onWheel = React__default['default'].useCallback(function (event) {
4678
+ var deltaX = event.deltaX,
4679
+ deltaY = event.deltaY,
4680
+ clientX = event.clientX,
4681
+ clientY = event.clientY,
4682
+ deltaMode = event.deltaMode,
4683
+ ctrlKey = event.ctrlKey,
4684
+ altKey = event.altKey,
4685
+ metaKey = event.metaKey,
4686
+ target = event.target; // On a MacOs trackpad, the pinch gesture sets the ctrlKey to true.
4678
4687
  // In that situation, we want to use the custom scaling, not the browser default zoom.
4679
4688
  // Hence in this situation we avoid to return immediately.
4680
4689
 
@@ -4687,14 +4696,14 @@ var Gesture = function Gesture(_ref6) {
4687
4696
 
4688
4697
 
4689
4698
  if (isMacOS() && !ctrlKey) {
4690
- queue(onPan, {
4699
+ promiseQueue.add(onPan, {
4691
4700
  deltaX: -2 * deltaX,
4692
4701
  deltaY: -2 * deltaY,
4693
4702
  button: 1,
4694
4703
  ctrlKey: ctrlKey,
4695
4704
  metaKey: metaKey,
4696
4705
  target: target,
4697
- event: e
4706
+ event: event
4698
4707
  });
4699
4708
  } else {
4700
4709
  // Quit if onZoom is not set
@@ -4716,25 +4725,25 @@ var Gesture = function Gesture(_ref6) {
4716
4725
  scale *= 2;
4717
4726
  }
4718
4727
 
4719
- queue(onZoom, {
4728
+ promiseQueue.add(onZoom, {
4720
4729
  scale: scale,
4721
4730
  clientX: clientX,
4722
4731
  clientY: clientY,
4723
- event: e
4732
+ event: event
4724
4733
  });
4725
4734
  }
4726
- }, [onPan, onZoom, queue]);
4727
- var onPointerDown = React__default['default'].useCallback(function (_ref8) {
4728
- var target = _ref8.target,
4729
- button = _ref8.button,
4730
- clientX = _ref8.clientX,
4731
- clientY = _ref8.clientY,
4732
- pointerId = _ref8.pointerId,
4733
- altKey = _ref8.altKey,
4734
- ctrlKey = _ref8.ctrlKey,
4735
- metaKey = _ref8.metaKey,
4736
- isPrimary = _ref8.isPrimary;
4737
- // Add pointer to map
4735
+ }, [onPan, onZoom]);
4736
+ var onPointerDown = React__default['default'].useCallback(function (event) {
4737
+ var target = event.target,
4738
+ button = event.button,
4739
+ clientX = event.clientX,
4740
+ clientY = event.clientY,
4741
+ pointerId = event.pointerId,
4742
+ altKey = event.altKey,
4743
+ ctrlKey = event.ctrlKey,
4744
+ metaKey = event.metaKey,
4745
+ isPrimary = event.isPrimary; // Add pointer to map
4746
+
4738
4747
  stateRef.current.pointers[pointerId] = {
4739
4748
  clientX: clientX,
4740
4749
  clientY: clientY
@@ -4793,27 +4802,28 @@ var Gesture = function Gesture(_ref6) {
4793
4802
  currentButton: button,
4794
4803
  target: target,
4795
4804
  timeStart: Date.now(),
4796
- longTapTimeout: setTimeout( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {
4797
- return regeneratorRuntime.wrap(function _callee3$(_context3) {
4805
+ longTapTimeout: setTimeout( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
4806
+ return regeneratorRuntime.wrap(function _callee2$(_context2) {
4798
4807
  while (1) {
4799
- switch (_context3.prev = _context3.next) {
4808
+ switch (_context2.prev = _context2.next) {
4800
4809
  case 0:
4801
4810
  stateRef.current.noTap = true;
4802
- queue(onLongTap, {
4811
+ promiseQueue.add(onLongTap, {
4803
4812
  clientX: clientX,
4804
4813
  clientY: clientY,
4805
4814
  altKey: altKey,
4806
4815
  ctrlKey: ctrlKey,
4807
4816
  metaKey: metaKey,
4808
- target: target
4817
+ target: target,
4818
+ event: event
4809
4819
  });
4810
4820
 
4811
4821
  case 2:
4812
4822
  case "end":
4813
- return _context3.stop();
4823
+ return _context2.stop();
4814
4824
  }
4815
4825
  }
4816
- }, _callee3);
4826
+ }, _callee2);
4817
4827
  })), 750)
4818
4828
  });
4819
4829
 
@@ -4823,16 +4833,17 @@ var Gesture = function Gesture(_ref6) {
4823
4833
  // eslint-disable-next-line no-console
4824
4834
  console.log("Fail to capture pointer", e);
4825
4835
  }
4826
- }, [onLongTap, queue]);
4827
- var onPointerMove = React__default['default'].useCallback(function (e) {
4836
+ }, [onLongTap]);
4837
+ var onPointerMove = React__default['default'].useCallback(function (event) {
4828
4838
  if (stateRef.current.pressed) {
4829
- var pointerId = e.pointerId,
4830
- eventClientX = e.clientX,
4831
- eventClientY = e.clientY,
4832
- altKey = e.altKey,
4833
- ctrlKey = e.ctrlKey,
4834
- metaKey = e.metaKey,
4835
- pointerType = e.pointerType;
4839
+ var pointerId = event.pointerId,
4840
+ eventClientX = event.clientX,
4841
+ eventClientY = event.clientY,
4842
+ altKey = event.altKey,
4843
+ ctrlKey = event.ctrlKey,
4844
+ metaKey = event.metaKey,
4845
+ buttons = event.buttons,
4846
+ pointerType = event.pointerType;
4836
4847
 
4837
4848
  if (stateRef.current.mainPointer !== pointerId) {
4838
4849
  // Event from other pointer
@@ -4865,13 +4876,20 @@ var Gesture = function Gesture(_ref6) {
4865
4876
  clientY = eventClientY;
4866
4877
  } // We drag if
4867
4878
  // On non touch device
4868
- // - Button is 0
4869
- // - Alt key is no pressed
4879
+ // - Only button is pressed (1)
4880
+ // - any special key is no pressed
4870
4881
  // or on touch devices
4871
4882
  // - We use only one finger
4872
4883
 
4873
4884
 
4874
- var shouldDrag = pointerType !== "touch" ? stateRef.current.currentButton === 0 && !altKey : !twoFingers;
4885
+ var altAction = altKey || ctrlKey || metaKey || buttons !== 1;
4886
+
4887
+ if (mainAction !== "drag") {
4888
+ altAction = !altAction;
4889
+ }
4890
+
4891
+ var shouldDrag = pointerType !== "touch" ? !altAction : !twoFingers;
4892
+ var shouldPan = pointerType !== "touch" ? altAction : twoFingers;
4875
4893
 
4876
4894
  if (shouldDrag) {
4877
4895
  // Send drag start on first move
@@ -4880,7 +4898,7 @@ var Gesture = function Gesture(_ref6) {
4880
4898
  stateRef.current.gestureStart = true; // Clear tap timeout
4881
4899
 
4882
4900
  clearTimeout(stateRef.current.longTapTimeout);
4883
- queue(onDragStart, {
4901
+ promiseQueue.add(onDragStart, {
4884
4902
  deltaX: 0,
4885
4903
  deltaY: 0,
4886
4904
  startX: stateRef.current.startX,
@@ -4894,17 +4912,16 @@ var Gesture = function Gesture(_ref6) {
4894
4912
  ctrlKey: ctrlKey,
4895
4913
  metaKey: metaKey,
4896
4914
  target: stateRef.current.target,
4897
- event: e
4915
+ event: event
4898
4916
  });
4899
- } // Create closure
4900
-
4917
+ }
4901
4918
 
4902
4919
  var deltaX = clientX - stateRef.current.prevX;
4903
4920
  var deltaY = clientY - stateRef.current.prevY;
4904
4921
  var distanceX = clientX - stateRef.current.startX;
4905
4922
  var distanceY = clientY - stateRef.current.startY; // Drag event
4906
4923
 
4907
- queue(onDrag, {
4924
+ promiseQueue.add(onDrag, {
4908
4925
  deltaX: deltaX,
4909
4926
  deltaY: deltaY,
4910
4927
  startX: stateRef.current.startX,
@@ -4918,9 +4935,11 @@ var Gesture = function Gesture(_ref6) {
4918
4935
  ctrlKey: ctrlKey,
4919
4936
  metaKey: metaKey,
4920
4937
  target: stateRef.current.target,
4921
- event: e
4938
+ event: event
4922
4939
  });
4923
- } else {
4940
+ }
4941
+
4942
+ if (shouldPan) {
4924
4943
  if (!stateRef.current.gestureStart) {
4925
4944
  wrapperRef.current.style.cursor = "move";
4926
4945
  stateRef.current.gestureStart = true; // Clear tap timeout on first move
@@ -4935,7 +4954,7 @@ var Gesture = function Gesture(_ref6) {
4935
4954
 
4936
4955
  var target = stateRef.current.target; // Pan event
4937
4956
 
4938
- queue(onPan, {
4957
+ promiseQueue.add(onPan, {
4939
4958
  deltaX: _deltaX,
4940
4959
  deltaY: _deltaY,
4941
4960
  button: stateRef.current.currentButton,
@@ -4943,18 +4962,18 @@ var Gesture = function Gesture(_ref6) {
4943
4962
  ctrlKey: ctrlKey,
4944
4963
  metaKey: metaKey,
4945
4964
  target: target,
4946
- event: e
4965
+ event: event
4947
4966
  });
4948
4967
 
4949
4968
  if (twoFingers && distance !== stateRef.current.prevDistance && onZoom) {
4950
4969
  var scale = stateRef.current.prevDistance - distance;
4951
4970
 
4952
4971
  if (Math.abs(scale) > 0) {
4953
- queue(onZoom, {
4972
+ promiseQueue.add(onZoom, {
4954
4973
  scale: scale,
4955
4974
  clientX: clientX,
4956
4975
  clientY: clientY,
4957
- event: e
4976
+ event: event
4958
4977
  });
4959
4978
  stateRef.current.prevDistance = distance;
4960
4979
  }
@@ -4964,15 +4983,15 @@ var Gesture = function Gesture(_ref6) {
4964
4983
  stateRef.current.prevX = clientX;
4965
4984
  stateRef.current.prevY = clientY;
4966
4985
  }
4967
- }, [onDrag, onDragStart, onPan, onZoom, queue]);
4968
- var onPointerUp = React__default['default'].useCallback(function (e) {
4969
- var clientX = e.clientX,
4970
- clientY = e.clientY,
4971
- altKey = e.altKey,
4972
- ctrlKey = e.ctrlKey,
4973
- metaKey = e.metaKey,
4974
- target = e.target,
4975
- pointerId = e.pointerId;
4986
+ }, [mainAction, onDrag, onDragStart, onPan, onZoom]);
4987
+ var onPointerUp = React__default['default'].useCallback(function (event) {
4988
+ var clientX = event.clientX,
4989
+ clientY = event.clientY,
4990
+ altKey = event.altKey,
4991
+ ctrlKey = event.ctrlKey,
4992
+ metaKey = event.metaKey,
4993
+ target = event.target,
4994
+ pointerId = event.pointerId;
4976
4995
 
4977
4996
  if (!stateRef.current.pointers[pointerId]) {
4978
4997
  // Pointer already gone previously with another event
@@ -5011,7 +5030,7 @@ var Gesture = function Gesture(_ref6) {
5011
5030
  if (stateRef.current.moving) {
5012
5031
  // If we were moving, send drag end event
5013
5032
  stateRef.current.moving = false;
5014
- queue(onDragEnd, {
5033
+ promiseQueue.add(onDragEnd, {
5015
5034
  deltaX: clientX - stateRef.current.prevX,
5016
5035
  deltaY: clientY - stateRef.current.prevY,
5017
5036
  startX: stateRef.current.startX,
@@ -5024,7 +5043,7 @@ var Gesture = function Gesture(_ref6) {
5024
5043
  altKey: altKey,
5025
5044
  ctrlKey: ctrlKey,
5026
5045
  metaKey: metaKey,
5027
- event: e
5046
+ event: event
5028
5047
  });
5029
5048
  wrapperRef.current.style.cursor = "auto";
5030
5049
  } else {
@@ -5034,20 +5053,35 @@ var Gesture = function Gesture(_ref6) {
5034
5053
  stateRef.current.noTap = false;
5035
5054
  } // Send tap event only if time less than 300ms
5036
5055
  else if (stateRef.current.timeStart - now < 300) {
5037
- queue(onTap, {
5056
+ promiseQueue.add(onTap, {
5038
5057
  clientX: clientX,
5039
5058
  clientY: clientY,
5040
5059
  altKey: altKey,
5041
5060
  ctrlKey: ctrlKey,
5042
5061
  metaKey: metaKey,
5043
- target: target
5062
+ target: target,
5063
+ event: event
5044
5064
  });
5045
5065
  }
5046
5066
  }
5047
- }, [onDragEnd, onTap, queue]);
5067
+ }, [onDragEnd, onTap]);
5048
5068
  var onDoubleTapHandler = React__default['default'].useCallback(function (event) {
5049
- queue(onDoubleTap, event);
5050
- }, [onDoubleTap, queue]);
5069
+ var clientX = event.clientX,
5070
+ clientY = event.clientY,
5071
+ altKey = event.altKey,
5072
+ ctrlKey = event.ctrlKey,
5073
+ metaKey = event.metaKey,
5074
+ target = event.target;
5075
+ promiseQueue.add(onDoubleTap, {
5076
+ clientX: clientX,
5077
+ clientY: clientY,
5078
+ altKey: altKey,
5079
+ ctrlKey: ctrlKey,
5080
+ metaKey: metaKey,
5081
+ target: target,
5082
+ event: event
5083
+ });
5084
+ }, [onDoubleTap]);
5051
5085
  return /*#__PURE__*/React__default['default'].createElement("div", {
5052
5086
  onWheel: onWheel,
5053
5087
  onPointerDown: onPointerDown,
@@ -5118,7 +5152,7 @@ var _excluded$2 = ["type", "rotation", "id", "locked", "layer"],
5118
5152
  _excluded3 = ["x", "y", "layer", "moving"];
5119
5153
 
5120
5154
  var _templateObject$2;
5121
- 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) {
5155
+ 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) {
5122
5156
  var rotation = _ref.rotation;
5123
5157
  return rotation;
5124
5158
  }, img);
@@ -5372,6 +5406,8 @@ var Item = function Item(_ref5) {
5372
5406
  className: "corner bottom-right"
5373
5407
  }), /*#__PURE__*/React__default['default'].createElement("div", {
5374
5408
  className: "corner bottom-left"
5409
+ }), /*#__PURE__*/React__default['default'].createElement("div", {
5410
+ className: "center"
5375
5411
  }), isSelected && showResizeHandle && /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, resizeDirections.b && /*#__PURE__*/React__default['default'].createElement(ResizeHandler, {
5376
5412
  className: "resize resize-ratio",
5377
5413
  onResize: onResizeRatio
@@ -5937,24 +5973,20 @@ var Selector = function Selector(_ref) {
5937
5973
  }));
5938
5974
  }, [setSelected]);
5939
5975
  useThrottledEffect(updateSelected, [selector, updateSelected], 200);
5940
-
5941
- var onDragStart = /*#__PURE__*/function () {
5976
+ var onDragStart = React__default['default'].useCallback( /*#__PURE__*/function () {
5942
5977
  var _ref4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(event) {
5943
- var button, altKey, ctrlKey, metaKey, foundElement, metaKeyPressed, goodButton;
5978
+ var foundElement;
5944
5979
  return regeneratorRuntime.wrap(function _callee2$(_context2) {
5945
5980
  while (1) {
5946
5981
  switch (_context2.prev = _context2.next) {
5947
5982
  case 0:
5948
- button = event.button, altKey = event.altKey, ctrlKey = event.ctrlKey, metaKey = event.metaKey;
5949
- _context2.next = 3;
5983
+ _context2.next = 2;
5950
5984
  return findElementUnderPointer(event);
5951
5985
 
5952
- case 3:
5986
+ case 2:
5953
5987
  foundElement = _context2.sent;
5954
- metaKeyPressed = altKey || ctrlKey || metaKey;
5955
- goodButton = moveFirst ? button === 1 || button === 0 && metaKeyPressed : button === 0 && !metaKeyPressed;
5956
5988
 
5957
- if (goodButton && (!foundElement || moveFirst)) {
5989
+ if (!foundElement) {
5958
5990
  stateRef.current.moving = true;
5959
5991
  setBoardState(function (prev) {
5960
5992
  return _objectSpread2(_objectSpread2({}, prev), {}, {
@@ -5964,7 +5996,7 @@ var Selector = function Selector(_ref) {
5964
5996
  wrapperRef.current.style.cursor = "crosshair";
5965
5997
  }
5966
5998
 
5967
- case 7:
5999
+ case 4:
5968
6000
  case "end":
5969
6001
  return _context2.stop();
5970
6002
  }
@@ -5972,11 +6004,10 @@ var Selector = function Selector(_ref) {
5972
6004
  }, _callee2);
5973
6005
  }));
5974
6006
 
5975
- return function onDragStart(_x) {
6007
+ return function (_x) {
5976
6008
  return _ref4.apply(this, arguments);
5977
6009
  };
5978
- }();
5979
-
6010
+ }(), [findElementUnderPointer, setBoardState]);
5980
6011
  var onDrag = recoil.useRecoilCallback(function (_ref5) {
5981
6012
  var snapshot = _ref5.snapshot;
5982
6013
  return /*#__PURE__*/function () {
@@ -6039,8 +6070,7 @@ var Selector = function Selector(_ref) {
6039
6070
  };
6040
6071
  }();
6041
6072
  }, []);
6042
-
6043
- var onDragEnd = function onDragEnd() {
6073
+ var onDragEnd = React__default['default'].useCallback(function () {
6044
6074
  if (stateRef.current.moving) {
6045
6075
  setBoardState(function (prev) {
6046
6076
  return _objectSpread2(_objectSpread2({}, prev), {}, {
@@ -6053,8 +6083,7 @@ var Selector = function Selector(_ref) {
6053
6083
  });
6054
6084
  wrapperRef.current.style.cursor = "auto";
6055
6085
  }
6056
- };
6057
-
6086
+ }, [setBoardState]);
6058
6087
  var onLongTap = React__default['default'].useCallback(function (_ref8) {
6059
6088
  var target = _ref8.target;
6060
6089
  var foundElement = insideClass(target, "item");
@@ -6135,7 +6164,8 @@ var Selector = function Selector(_ref) {
6135
6164
  onDrag: onDrag,
6136
6165
  onDragEnd: onDragEnd,
6137
6166
  onTap: onTap,
6138
- onLongTap: onLongTap
6167
+ onLongTap: onLongTap,
6168
+ mainAction: moveFirst ? "pan" : "drag"
6139
6169
  }, /*#__PURE__*/React__default['default'].createElement("div", {
6140
6170
  ref: wrapperRef
6141
6171
  }, selector.moving && /*#__PURE__*/React__default['default'].createElement("div", {
@@ -6228,23 +6258,24 @@ var ActionPane = function ActionPane(_ref) {
6228
6258
  var snapshot = _ref4.snapshot;
6229
6259
  return /*#__PURE__*/function () {
6230
6260
  var _ref6 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(_ref5) {
6231
- var deltaX, deltaY, _yield$snapshot$getPr, scale, moveX, moveY;
6261
+ var deltaX, deltaY, originalEvent, _yield$snapshot$getPr, scale, moveX, moveY;
6232
6262
 
6233
6263
  return regeneratorRuntime.wrap(function _callee2$(_context2) {
6234
6264
  while (1) {
6235
6265
  switch (_context2.prev = _context2.next) {
6236
6266
  case 0:
6237
- deltaX = _ref5.deltaX, deltaY = _ref5.deltaY;
6267
+ deltaX = _ref5.deltaX, deltaY = _ref5.deltaY, originalEvent = _ref5.event;
6238
6268
 
6239
6269
  if (!actionRef.current.moving) {
6240
- _context2.next = 10;
6270
+ _context2.next = 11;
6241
6271
  break;
6242
6272
  }
6243
6273
 
6244
- _context2.next = 4;
6274
+ originalEvent.stopPropagation();
6275
+ _context2.next = 5;
6245
6276
  return snapshot.getPromise(BoardTransformAtom);
6246
6277
 
6247
- case 4:
6278
+ case 5:
6248
6279
  _yield$snapshot$getPr = _context2.sent;
6249
6280
  scale = _yield$snapshot$getPr.scale;
6250
6281
  moveX = actionRef.current.remainX + deltaX / scale;
@@ -6259,7 +6290,7 @@ var ActionPane = function ActionPane(_ref) {
6259
6290
  }) : prev;
6260
6291
  });
6261
6292
 
6262
- case 10:
6293
+ case 11:
6263
6294
  case "end":
6264
6295
  return _context2.stop();
6265
6296
  }
@@ -6984,8 +7015,6 @@ var usePositionNavigator = function usePositionNavigator() {
6984
7015
  return null;
6985
7016
  };
6986
7017
 
6987
- var SCALE_TOLERANCE = 0.8;
6988
-
6989
7018
  var PanZoom = function PanZoom(_ref) {
6990
7019
  var children = _ref.children,
6991
7020
  _ref$moveFirst = _ref.moveFirst,
@@ -6995,7 +7024,8 @@ var PanZoom = function PanZoom(_ref) {
6995
7024
 
6996
7025
  var _useDim = useDim(),
6997
7026
  setDim = _useDim.setDim,
6998
- zoomTo = _useDim.zoomTo;
7027
+ zoomToCenter = _useDim.zoomToCenter,
7028
+ zoomToExtent = _useDim.zoomToExtent;
6999
7029
 
7000
7030
  var _useRecoilValue = recoil.useRecoilValue(ConfigurationAtom),
7001
7031
  itemExtentGlobal = _useRecoilValue.itemExtent;
@@ -7011,10 +7041,14 @@ var PanZoom = function PanZoom(_ref) {
7011
7041
  var getMouseInfo = useMousePosition(wrappedRef); // Hooks to save/restore position
7012
7042
 
7013
7043
  usePositionNavigator();
7044
+ /**
7045
+ * Center board on startup
7046
+ */
7047
+
7014
7048
  var centerBoard = recoil.useRecoilCallback(function (_ref2) {
7015
7049
  var snapshot = _ref2.snapshot;
7016
7050
  return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
7017
- var _yield$snapshot$getPr, _yield$snapshot$getPr2, left, top, width, height, boardWrapperRect, scaleX, scaleY, newScale, scaleWithTolerance, centerX, centerY;
7051
+ var _yield$snapshot$getPr, itemExtent;
7018
7052
 
7019
7053
  return regeneratorRuntime.wrap(function _callee$(_context) {
7020
7054
  while (1) {
@@ -7025,34 +7059,17 @@ var PanZoom = function PanZoom(_ref) {
7025
7059
 
7026
7060
  case 2:
7027
7061
  _yield$snapshot$getPr = _context.sent;
7028
- _yield$snapshot$getPr2 = _yield$snapshot$getPr.itemExtent;
7029
- left = _yield$snapshot$getPr2.left;
7030
- top = _yield$snapshot$getPr2.top;
7031
- width = _yield$snapshot$getPr2.width;
7032
- height = _yield$snapshot$getPr2.height;
7033
- boardWrapperRect = _yield$snapshot$getPr.boardWrapperRect;
7034
- scaleX = boardWrapperRect.width / width;
7035
- scaleY = boardWrapperRect.height / height;
7036
- newScale = Math.min(scaleX, scaleY);
7037
- scaleWithTolerance = newScale * SCALE_TOLERANCE;
7038
- centerX = boardWrapperRect.width / 2 - (left + width / 2) * scaleWithTolerance;
7039
- centerY = boardWrapperRect.height / 2 - (top + height / 2) * scaleWithTolerance;
7040
- setDim(function (prev) {
7041
- return _objectSpread2(_objectSpread2({}, prev), {}, {
7042
- translateX: centerX,
7043
- translateY: centerY,
7044
- scale: scaleWithTolerance
7045
- });
7046
- });
7062
+ itemExtent = _yield$snapshot$getPr.itemExtent;
7063
+ zoomToExtent(itemExtent);
7047
7064
 
7048
- case 16:
7065
+ case 5:
7049
7066
  case "end":
7050
7067
  return _context.stop();
7051
7068
  }
7052
7069
  }
7053
7070
  }, _callee);
7054
7071
  }));
7055
- }, [setDim]);
7072
+ }, [zoomToExtent]);
7056
7073
  React__default['default'].useEffect(function () {
7057
7074
  if (!centered && itemExtentGlobal.left) {
7058
7075
  // Center board on first valid extent
@@ -7064,7 +7081,7 @@ var PanZoom = function PanZoom(_ref) {
7064
7081
  var clientX = _ref4.clientX,
7065
7082
  clientY = _ref4.clientY,
7066
7083
  scale = _ref4.scale;
7067
- zoomTo(1 - scale / 500, {
7084
+ zoomToCenter(1 - scale / 500, {
7068
7085
  x: clientX,
7069
7086
  y: clientY
7070
7087
  }); // Update the board zooming state
@@ -7082,7 +7099,7 @@ var PanZoom = function PanZoom(_ref) {
7082
7099
  zooming: true
7083
7100
  }) : prev;
7084
7101
  });
7085
- }, [setBoardState, zoomTo]);
7102
+ }, [setBoardState, zoomToCenter]);
7086
7103
  var onPan = React__default['default'].useCallback( /*#__PURE__*/function () {
7087
7104
  var _ref6 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(_ref5) {
7088
7105
  var deltaX, deltaY;
@@ -7124,14 +7141,6 @@ var PanZoom = function PanZoom(_ref) {
7124
7141
  return _ref6.apply(this, arguments);
7125
7142
  };
7126
7143
  }(), [setBoardState, setDim]);
7127
- var onDrag = React__default['default'].useCallback(function (state) {
7128
- var target = state.target;
7129
- var outsideItem = !insideClass(target, "item") || insideClass(target, "locked");
7130
-
7131
- if (moveFirst && outsideItem) {
7132
- onPan(state);
7133
- }
7134
- }, [moveFirst, onPan]);
7135
7144
  var onKeyDown = recoil.useRecoilCallback(function (_ref7) {
7136
7145
  var snapshot = _ref7.snapshot;
7137
7146
  return /*#__PURE__*/function () {
@@ -7216,14 +7225,14 @@ var PanZoom = function PanZoom(_ref) {
7216
7225
  translateX: prev.translateX + moveX
7217
7226
  });
7218
7227
  });
7219
- zoomTo(zoom);
7228
+ zoomToCenter(zoom);
7220
7229
  e.preventDefault();
7221
7230
 
7222
7231
  case 31:
7223
7232
  // Temporary zoom
7224
7233
  if (e.key === " " && !e.repeat) {
7225
7234
  if (getMouseInfo().hover) {
7226
- zoomTo(3, getMouseInfo());
7235
+ zoomToCenter(3, getMouseInfo());
7227
7236
  }
7228
7237
  }
7229
7238
 
@@ -7239,15 +7248,15 @@ var PanZoom = function PanZoom(_ref) {
7239
7248
  return _ref8.apply(this, arguments);
7240
7249
  };
7241
7250
  }();
7242
- }, [setDim, zoomTo, getMouseInfo]);
7251
+ }, [setDim, zoomToCenter, getMouseInfo]);
7243
7252
  var onKeyUp = React__default['default'].useCallback(function (e) {
7244
7253
  // Ignore text in Input or Textarea
7245
7254
  if (["INPUT", "TEXTAREA"].includes(e.target.tagName)) return; // Zoom out on release
7246
7255
 
7247
7256
  if (e.key === " " && getMouseInfo().hover) {
7248
- zoomTo(1 / 3, getMouseInfo());
7257
+ zoomToCenter(1 / 3, getMouseInfo());
7249
7258
  }
7250
- }, [getMouseInfo, zoomTo]);
7259
+ }, [getMouseInfo, zoomToCenter]);
7251
7260
  React__default['default'].useEffect(function () {
7252
7261
  document.addEventListener("keydown", onKeyDown);
7253
7262
  document.addEventListener("keyup", onKeyUp);
@@ -7259,7 +7268,7 @@ var PanZoom = function PanZoom(_ref) {
7259
7268
  return /*#__PURE__*/React__default['default'].createElement(Gesture, {
7260
7269
  onPan: onPan,
7261
7270
  onZoom: onZoom,
7262
- onDrag: onDrag
7271
+ mainAction: moveFirst ? "pan" : "drag"
7263
7272
  }, /*#__PURE__*/React__default['default'].createElement("div", {
7264
7273
  style: {
7265
7274
  display: "inline-block",
@@ -7427,7 +7436,9 @@ var Board = function Board(_ref) {
7427
7436
  moveFirst: moveFirst
7428
7437
  }, /*#__PURE__*/React__default['default'].createElement(Selector, {
7429
7438
  moveFirst: moveFirst
7430
- }, /*#__PURE__*/React__default['default'].createElement(ActionPane, null, /*#__PURE__*/React__default['default'].createElement(CursorPane, null, /*#__PURE__*/React__default['default'].createElement("div", {
7439
+ }, /*#__PURE__*/React__default['default'].createElement(ActionPane, {
7440
+ moveFirst: moveFirst
7441
+ }, /*#__PURE__*/React__default['default'].createElement(CursorPane, null, /*#__PURE__*/React__default['default'].createElement("div", {
7431
7442
  onContextMenu: function onContextMenu(e) {
7432
7443
  e.preventDefault();
7433
7444
  },
@@ -7438,6 +7449,7 @@ var Board = function Board(_ref) {
7438
7449
 
7439
7450
  var TOLERANCE = 100;
7440
7451
  var MIN_SIZE = 1000;
7452
+ var SCALE_TOLERANCE = 0.8;
7441
7453
 
7442
7454
  var translateBoundaries = function translateBoundaries(_ref) {
7443
7455
  var x = _ref.x,
@@ -7555,7 +7567,7 @@ var useDim = function useDim() {
7555
7567
  };
7556
7568
  }();
7557
7569
  }, [setDim]);
7558
- var zoomTo = recoil.useRecoilCallback(function (_ref5) {
7570
+ var zoomToCenter = recoil.useRecoilCallback(function (_ref5) {
7559
7571
  var snapshot = _ref5.snapshot;
7560
7572
  return /*#__PURE__*/function () {
7561
7573
  var _ref6 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(factor, zoomCenter) {
@@ -7634,24 +7646,68 @@ var useDim = function useDim() {
7634
7646
  };
7635
7647
  }();
7636
7648
  }, [setDim]);
7637
- var updateScaleBoundaries = recoil.useRecoilCallback(function (_ref7) {
7649
+ var zoomToExtent = recoil.useRecoilCallback(function (_ref7) {
7638
7650
  var snapshot = _ref7.snapshot;
7639
- return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {
7640
- var _yield$snapshot$getPr3, _yield$snapshot$getPr4, width, height, boardWrapperRect, scaleX, scaleY, newScale;
7651
+ return /*#__PURE__*/function () {
7652
+ var _ref9 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(_ref8) {
7653
+ var left, top, width, height, _yield$snapshot$getPr3, boardWrapperRect, scaleX, scaleY, newScale, scaleWithTolerance, centerX, centerY;
7641
7654
 
7642
- return regeneratorRuntime.wrap(function _callee3$(_context3) {
7655
+ return regeneratorRuntime.wrap(function _callee3$(_context3) {
7656
+ while (1) {
7657
+ switch (_context3.prev = _context3.next) {
7658
+ case 0:
7659
+ left = _ref8.left, top = _ref8.top, width = _ref8.width, height = _ref8.height;
7660
+ _context3.next = 3;
7661
+ return snapshot.getPromise(ConfigurationAtom);
7662
+
7663
+ case 3:
7664
+ _yield$snapshot$getPr3 = _context3.sent;
7665
+ boardWrapperRect = _yield$snapshot$getPr3.boardWrapperRect;
7666
+ scaleX = boardWrapperRect.width / width;
7667
+ scaleY = boardWrapperRect.height / height;
7668
+ newScale = Math.min(scaleX, scaleY);
7669
+ scaleWithTolerance = newScale * SCALE_TOLERANCE;
7670
+ centerX = boardWrapperRect.width / 2 - (left + width / 2) * scaleWithTolerance;
7671
+ centerY = boardWrapperRect.height / 2 - (top + height / 2) * scaleWithTolerance;
7672
+ setDim(function (prev) {
7673
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
7674
+ translateX: centerX,
7675
+ translateY: centerY,
7676
+ scale: scaleWithTolerance
7677
+ });
7678
+ });
7679
+
7680
+ case 12:
7681
+ case "end":
7682
+ return _context3.stop();
7683
+ }
7684
+ }
7685
+ }, _callee3);
7686
+ }));
7687
+
7688
+ return function (_x4) {
7689
+ return _ref9.apply(this, arguments);
7690
+ };
7691
+ }();
7692
+ }, [setDim]);
7693
+ var updateScaleBoundaries = recoil.useRecoilCallback(function (_ref10) {
7694
+ var snapshot = _ref10.snapshot;
7695
+ return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {
7696
+ var _yield$snapshot$getPr4, _yield$snapshot$getPr5, width, height, boardWrapperRect, scaleX, scaleY, newScale;
7697
+
7698
+ return regeneratorRuntime.wrap(function _callee4$(_context4) {
7643
7699
  while (1) {
7644
- switch (_context3.prev = _context3.next) {
7700
+ switch (_context4.prev = _context4.next) {
7645
7701
  case 0:
7646
- _context3.next = 2;
7702
+ _context4.next = 2;
7647
7703
  return snapshot.getPromise(ConfigurationAtom);
7648
7704
 
7649
7705
  case 2:
7650
- _yield$snapshot$getPr3 = _context3.sent;
7651
- _yield$snapshot$getPr4 = _yield$snapshot$getPr3.itemExtent;
7652
- width = _yield$snapshot$getPr4.width;
7653
- height = _yield$snapshot$getPr4.height;
7654
- boardWrapperRect = _yield$snapshot$getPr3.boardWrapperRect;
7706
+ _yield$snapshot$getPr4 = _context4.sent;
7707
+ _yield$snapshot$getPr5 = _yield$snapshot$getPr4.itemExtent;
7708
+ width = _yield$snapshot$getPr5.width;
7709
+ height = _yield$snapshot$getPr5.height;
7710
+ boardWrapperRect = _yield$snapshot$getPr4.boardWrapperRect;
7655
7711
  scaleX = boardWrapperRect.width / width;
7656
7712
  scaleY = boardWrapperRect.height / height;
7657
7713
  newScale = Math.min(scaleX, scaleY);
@@ -7659,86 +7715,86 @@ var useDim = function useDim() {
7659
7715
 
7660
7716
  case 11:
7661
7717
  case "end":
7662
- return _context3.stop();
7718
+ return _context4.stop();
7663
7719
  }
7664
7720
  }
7665
- }, _callee3);
7721
+ }, _callee4);
7666
7722
  }));
7667
7723
  }, []);
7668
- var getCenterCoordinates = recoil.useRecoilCallback(function (_ref9) {
7669
- var snapshot = _ref9.snapshot;
7670
- return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {
7671
- var _yield$snapshot$getPr5, boardWrapperRect, boardSize, _yield$snapshot$getPr6, translateX, translateY, scale;
7724
+ var getCenterCoordinates = recoil.useRecoilCallback(function (_ref12) {
7725
+ var snapshot = _ref12.snapshot;
7726
+ return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {
7727
+ var _yield$snapshot$getPr6, boardWrapperRect, boardSize, _yield$snapshot$getPr7, translateX, translateY, scale;
7672
7728
 
7673
- return regeneratorRuntime.wrap(function _callee4$(_context4) {
7729
+ return regeneratorRuntime.wrap(function _callee5$(_context5) {
7674
7730
  while (1) {
7675
- switch (_context4.prev = _context4.next) {
7731
+ switch (_context5.prev = _context5.next) {
7676
7732
  case 0:
7677
- _context4.next = 2;
7733
+ _context5.next = 2;
7678
7734
  return snapshot.getPromise(ConfigurationAtom);
7679
7735
 
7680
7736
  case 2:
7681
- _yield$snapshot$getPr5 = _context4.sent;
7682
- boardWrapperRect = _yield$snapshot$getPr5.boardWrapperRect;
7683
- boardSize = _yield$snapshot$getPr5.boardSize;
7684
- _context4.next = 7;
7737
+ _yield$snapshot$getPr6 = _context5.sent;
7738
+ boardWrapperRect = _yield$snapshot$getPr6.boardWrapperRect;
7739
+ boardSize = _yield$snapshot$getPr6.boardSize;
7740
+ _context5.next = 7;
7685
7741
  return snapshot.getPromise(BoardTransformAtom);
7686
7742
 
7687
7743
  case 7:
7688
- _yield$snapshot$getPr6 = _context4.sent;
7689
- translateX = _yield$snapshot$getPr6.translateX;
7690
- translateY = _yield$snapshot$getPr6.translateY;
7691
- scale = _yield$snapshot$getPr6.scale;
7692
- return _context4.abrupt("return", {
7744
+ _yield$snapshot$getPr7 = _context5.sent;
7745
+ translateX = _yield$snapshot$getPr7.translateX;
7746
+ translateY = _yield$snapshot$getPr7.translateY;
7747
+ scale = _yield$snapshot$getPr7.scale;
7748
+ return _context5.abrupt("return", {
7693
7749
  x: (boardWrapperRect.width / 2 - translateX) / scale - boardSize / 2,
7694
7750
  y: (boardWrapperRect.height / 2 - translateY) / scale - boardSize / 2
7695
7751
  });
7696
7752
 
7697
7753
  case 12:
7698
7754
  case "end":
7699
- return _context4.stop();
7755
+ return _context5.stop();
7700
7756
  }
7701
7757
  }
7702
- }, _callee4);
7758
+ }, _callee5);
7703
7759
  }));
7704
7760
  }, []);
7705
- var updateItemExtent = recoil.useRecoilCallback(function (_ref11) {
7706
- var snapshot = _ref11.snapshot,
7707
- set = _ref11.set;
7708
- return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {
7709
- var itemIds, _yield$snapshot$getPr7, boardWrapperRect, boardWrapper, boardSize, _yield$snapshot$getPr8, scale, translateX, translateY, _ref13, left, top, width, height, relativeExtent, delta, _delta;
7761
+ var updateItemExtent = recoil.useRecoilCallback(function (_ref14) {
7762
+ var snapshot = _ref14.snapshot,
7763
+ set = _ref14.set;
7764
+ return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6() {
7765
+ var itemIds, _yield$snapshot$getPr8, boardWrapperRect, boardWrapper, boardSize, _yield$snapshot$getPr9, scale, translateX, translateY, _ref16, left, top, width, height, relativeExtent, delta, _delta;
7710
7766
 
7711
- return regeneratorRuntime.wrap(function _callee5$(_context5) {
7767
+ return regeneratorRuntime.wrap(function _callee6$(_context6) {
7712
7768
  while (1) {
7713
- switch (_context5.prev = _context5.next) {
7769
+ switch (_context6.prev = _context6.next) {
7714
7770
  case 0:
7715
- _context5.next = 2;
7771
+ _context6.next = 2;
7716
7772
  return snapshot.getPromise(ItemListAtom);
7717
7773
 
7718
7774
  case 2:
7719
- itemIds = _context5.sent;
7720
- _context5.next = 5;
7775
+ itemIds = _context6.sent;
7776
+ _context6.next = 5;
7721
7777
  return snapshot.getPromise(ConfigurationAtom);
7722
7778
 
7723
7779
  case 5:
7724
- _yield$snapshot$getPr7 = _context5.sent;
7725
- boardWrapperRect = _yield$snapshot$getPr7.boardWrapperRect;
7726
- boardWrapper = _yield$snapshot$getPr7.boardWrapper;
7727
- boardSize = _yield$snapshot$getPr7.boardSize;
7728
- _context5.next = 11;
7780
+ _yield$snapshot$getPr8 = _context6.sent;
7781
+ boardWrapperRect = _yield$snapshot$getPr8.boardWrapperRect;
7782
+ boardWrapper = _yield$snapshot$getPr8.boardWrapper;
7783
+ boardSize = _yield$snapshot$getPr8.boardSize;
7784
+ _context6.next = 11;
7729
7785
  return snapshot.getPromise(BoardTransformAtom);
7730
7786
 
7731
7787
  case 11:
7732
- _yield$snapshot$getPr8 = _context5.sent;
7733
- scale = _yield$snapshot$getPr8.scale;
7734
- translateX = _yield$snapshot$getPr8.translateX;
7735
- translateY = _yield$snapshot$getPr8.translateY;
7736
- _ref13 = getItemBoundingBox(itemIds, boardWrapper) || {
7788
+ _yield$snapshot$getPr9 = _context6.sent;
7789
+ scale = _yield$snapshot$getPr9.scale;
7790
+ translateX = _yield$snapshot$getPr9.translateX;
7791
+ translateY = _yield$snapshot$getPr9.translateY;
7792
+ _ref16 = getItemBoundingBox(itemIds, boardWrapper) || {
7737
7793
  left: boardSize / 2 * scale + boardWrapperRect.left + translateX,
7738
7794
  top: boardSize / 2 * scale + boardWrapperRect.top + translateY,
7739
7795
  width: 0,
7740
7796
  height: 0
7741
- }, left = _ref13.left, top = _ref13.top, width = _ref13.width, height = _ref13.height;
7797
+ }, left = _ref16.left, top = _ref16.top, width = _ref16.width, height = _ref16.height;
7742
7798
  relativeExtent = {
7743
7799
  left: (left - boardWrapperRect.left - translateX) / scale,
7744
7800
  top: (top - boardWrapperRect.top - translateY) / scale,
@@ -7770,10 +7826,10 @@ var useDim = function useDim() {
7770
7826
 
7771
7827
  case 22:
7772
7828
  case "end":
7773
- return _context5.stop();
7829
+ return _context6.stop();
7774
7830
  }
7775
7831
  }
7776
- }, _callee5);
7832
+ }, _callee6);
7777
7833
  }));
7778
7834
  }, []);
7779
7835
  var debouncedUpdateItemExtent = useDebouncedCallback(updateItemExtent, [], 300);
@@ -7785,7 +7841,9 @@ var useDim = function useDim() {
7785
7841
  return {
7786
7842
  setDim: setDimSafe,
7787
7843
  getDim: getDim,
7788
- zoomTo: zoomTo,
7844
+ zoomTo: zoomToCenter,
7845
+ zoomToCenter: zoomToCenter,
7846
+ zoomToExtent: zoomToExtent,
7789
7847
  getCenter: getCenterCoordinates,
7790
7848
  updateItemExtent: debouncedUpdateItemExtent
7791
7849
  };